在 RTOS 中,如何设计一个无锁环形缓冲区以安全传递中断与任务间的数据?

· 1 浏览

回答(4)

若缓冲区用于高频中断,可考虑用位带操作(Cortex-M)加速索引更新,但需注意位带区域对齐,实测性能提升有限。
嵌入式老兵 · 2026-08-27
建议用C11的atomic_load/atomic_store,配合memory_order_release/acquire,避免手动屏障,代码可移植性更好。
码农小飞 · 2026-08-27
补充:用DMA+双缓冲更稳,中断只切换标志,任务搬数据,但需确保DMA传输完成中断与任务同步,避免覆盖未读数据。
老周嵌入式 · 2026-08-27
设计无锁环形缓冲区时,核心是保证单生产者(中断)单消费者(任务)模型下的原子性。建议使用硬件支持的原子操作(如ARM的LDREX/STREX或C11的atomic),并采用'读索引'和'写索引'分离的经典结构:写索引仅由生产者更新,读索引仅由消费者更新,避免竞争。关键点:1) 缓冲区大小必须是2的幂,用位与运算替代取模;2) 使用内存屏障(如__DMB())确保数据写入在索引更新前可见;3) 在中断中避免使用阻塞或动态内存分配;4) 若需多消费者,可增加'预留槽位'机制,但复杂度上升,建议保持单消费者。实操时,先用静态数组+volatile索引验证,再引入原子指令优化。注意:若中断优先级高于任务,需确保任务侧读取时索引不会回绕,可预留一个空槽位区分满/空状态。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

⏱️ 定时器计算器