RTOS中,如何设计一个无锁环形缓冲区,使其在中断与任务间安全传递高频传感器数据而不丢失?

· 4 浏览

回答(4)

补充:如果中断频率极高,可考虑用硬件FIFO(如UART的DMA)先缓存,再批量写入环形缓冲区,减少中断开销。
RTOS实战派 · 2026-08-27
补充:考虑缓存行对齐,将读写索引放在不同缓存行,避免伪共享(false sharing)导致性能下降。
码农小飞 · 2026-08-27
补充:用volatile修饰索引变量,但注意volatile不保证原子性,必须配合原子指令或关中断(临界区极短)实现。
嵌入式老周 · 2026-08-27
核心方案:采用单生产者单消费者(SPSC)模型,利用硬件原子操作(如ARM的LDREX/STREX或C11原子)实现无锁。设计要点:1) 缓冲区大小设为2的幂次,用位与运算替代取模;2) 维护读索引(任务侧)和写索引(中断侧),各自独立更新,通过内存屏障(如__DMB())保证顺序;3) 写满时丢弃最旧数据(覆盖策略)或丢弃新数据(阻塞策略),高频场景建议覆盖,但需在头部加序列号供任务检测丢包。实操建议:中断中仅做写入和索引更新,不调用任何RTOS API;任务侧用轮询或信号量(非阻塞)读取。若需多消费者,则需加锁或改用DMA+双缓冲。测试时用逻辑分析仪验证高频下无数据覆盖异常。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

⏱️ 定时器计算器