设计环形缓冲区时,核心是确保DMA写入与CPU读取的同步。推荐使用双缓冲(DMA循环模式)或硬件乒乓缓冲:配置DMA为循环模式,将缓冲区分为两个半区,利用DMA的半传输和传输完成中断分别标记半区就绪。在中断服务程序中,仅更新读索引(如head),主循环或高优先级任务根据head与DMA当前写指针(通过DMA_CNDTR寄存器反推)计算可读数据量。为防止覆盖,需保证CPU消费速度高于DMA生产速度,并预留至少一个缓冲区大小的余量;若消费滞后,可丢弃旧数据或触发过载标志。实操建议:使用__attribute__((aligned(4)))对齐缓冲区,禁用DMA中断嵌套,并在ISR中只做索引更新,避免耗时操作。
mcuku 阿沐 · 2026-08-27