移植正点的printf

本文介绍如何在STM32CubeMX生成MDK工程,设置串口与DMA中断,利用RTOS信号量和消息队列实现串口通信。通过加入console.c和radiolink.c文件,实现串口任务调度,确保数据发送有序进行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、用STM32CubeMX生成基本MDK工程

  生成工程时,需要使能三个中断和2个初始化,中断优先级要大于5
1、DMA接收中断
2、DMA发送中断
3、串口中断
4、初始化一个二值信号量uart2_busy, 只有等到该信号量时,才能使用串口。使用串口DMA发送,在发送完中断中,释放该信号量。定义一个消息队列,txQueue, 需要发送的atkp_t类型数据包先发送到这个队列里。然后由任务从这个队列里取出来发送。
5、定义一个synch信号量,fputc(int ch, FILE *f)往一个中间变量的数据包messageToPrint填数据时同步用。好像不用也可以。
在这里插入图片描述

二、为什么要设置串口中断呢?

  因为DMA发送完成中断,并没有直接调用回调函数释放uart2_busy,而是触发串口发送完成中断,串口中断中再调用回调函数释放uart2_busy。
在这里插入图片描述
  当然,也可以不要串口中断,修改底层,在DMA发送完成中断中,直接调用回调函数。回调函数中释放串口忙标志,不然只能发送一次。不过速度也没有加快。
在这里插入图片描述
在这里插入图片描述

三、加入console.c和radiolink.c文件到工程

A、console.c

1、void consoleInit(),初始化全局变量messageToPrint的ID和创建信号量

2、int consolePutchar(int ch)主要是给fputc(int ch, FILE *f)调用,把发送的内容一个字符一个字符填入一个临时数据包messageToPrint,它是一个全局变量。
当遇到\n字符时,认为一帧数据已填完。把messageToPrint发送到队列txQueue里。

3、int consolePutcharFromISR(int ch)如果当前运行在中断函数里,用这个函数填充临时数据包messageToPrint

B、radiolink.c

1、radiolinkTask(void const * argument)串口发送任务,从txQueue取出数据包。

2、static void uartSendPacket(atkp_t *p) 把上一步取出的数据包,加上帧头和校验,复制到sendBuffer[36]临时数组里, 然后调用DMA把sendBuffer[36]发送出去
在这里插入图片描述
3、重定义fputc(int ch, FILE *f)。

### 正点原子平台移植 MJPEG 的方法 在正点原子 ZYNQ7010 平台上实现 MJPEG 移植涉及多个方面的工作,包括但不限于设备驱动配置、图像编解码库的选择与集成以及应用程序开发。 #### 设备驱动配置 为了使摄像头能够正常工作并提供 MJPEG 流,在初始化阶段需通过 `ioctl()` 函数来设定参数。具体来说,`v4l2_fmtdesc` 结构体用于枚举支持的像素格式,并将 `type` 字段设为 `V4L2_BUF_TYPE_VIDEO_CAPTURE` 来指明操作对象是视频捕获接口[^2]: ```c struct v4l2_fmtdesc fmtdesc; fmtdesc.index = 0; fmtdesc.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; while (0 == ioctl(fd, VIDIOC_ENUM_FMT, &fmtdesc)) { printf("fmt: %s <0x%x>\n", fmtdesc.description, fmtdesc.pixelformat); fmtdesc.index++; } ``` 这段代码可以帮助确认硬件是否支持 MJPEG 编码模式;如果存在对应的条目,则说明该设备具备此功能。 #### 图像编解码库选择与集成 针对 MJPEG 解码需求,可以选择合适的第三方开源软件包如 FFmpeg 或者 libjpeg-turbo 进行嵌入式系统的适配安装。这些工具提供了高效的压缩/解压算法,适用于资源受限环境下的实时处理任务。 对于编码部分,同样依赖上述提到的库函数完成原始帧到 JPEG 文件格式转换的过程。值得注意的是,当选用特定版本时应确保其兼容性良好且易于维护更新。 #### 应用程序开发 最后一步是在 Linux 用户空间编写控制逻辑以管理整个流程——从打开视频流直到最终呈现给用户观看的画面。这通常涉及到多线程编程技巧以便于并发执行读取数据、解析元数据及渲染图形界面等子任务。 综上所述,虽然官方文档可能未直接给出完整的MJEPG移植指南,但是结合以上三个方面的指导原则,再参照已有的Qt显示图片案例[^1],可以构建起一套可行的技术方案来进行实践探索。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值