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

· 1 浏览

回答(4)

补充:在ARM Cortex-M上,用LDREX/STREX实现无锁读改写索引,但注意中断优先级需低于临界区,否则需临时屏蔽中断。
RTOS小兵 · 2026-08-27
补充:若数据必须全保留,可改用环形队列+溢出计数,任务端定期检查溢出标志并触发告警,而非静默丢弃。
码农阿强 · 2026-08-27
补充:用DMA双缓冲(ping-pong)可减少CPU中断频率,但需确保DMA完成回调与任务间用信号量同步,避免覆盖未处理数据。
嵌入式老周 · 2026-08-27
核心思路是单生产者单消费者(SPSC)模型,利用硬件原子性和内存屏障实现无锁。设计时,缓冲区头尾索引分别由中断(生产者)和任务(消费者)独占,避免竞争。关键在于:1)索引使用volatile或原子类型(如C11的atomic_size_t),并在读写数据前后插入内存屏障(如__DSB()或atomic_thread_fence)确保顺序;2)缓冲区大小必须是2的幂,用位与操作替代取模,提升效率;3)中断中只写数据并更新写索引,任务中只读数据并更新读索引,禁止交叉访问。若数据量超过容量,可定义策略:丢弃最旧或最新数据,但需在头部记录溢出标志。实操建议:先用静态数组+无符号索引,测试高频中断(如1kHz)下任务延迟,再优化缓存对齐(如cache line padding)避免伪共享。最后,务必在临界区禁用嵌套中断,防止写索引被高优先级中断打断。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

⏱️ 定时器计算器