在RTOS下设计零拷贝环形缓冲区用于串口DMA接收,核心是避免数据拷贝,直接让DMA写入缓冲区,并通过中断通知任务处理。建议采用双缓冲区(乒乓缓冲)或环形缓冲区,但需处理半满和全满中断的边界。具体做法:1) 定义缓冲区大小为2的幂次,便于取模运算;2) 使用DMA的循环模式,配置半传输中断和传输完成中断(即半满和全满);3) 在中断服务程序中,仅更新读写指针(如写指针由DMA硬件自动更新,读指针由任务更新),并发送信号量或事件标志给RTOS任务;4) 边界处理:半满中断时,处理前半部分数据,同时DMA继续写入后半部分;全满中断时,处理后半部分,但需注意此时前半部分可能已被处理,避免覆盖。建议使用原子操作或关中断保护指针更新,防止竞态。实操中,可参考STM32的HAL库示例,但需自定义中断回调。
mcuku 阿沐 · 2026-08-27