设计无锁环形缓冲区时,核心是保证单写单读的原子性。对于ISR与任务间高频传递,推荐使用经典的SPSC(单生产者单消费者)模型,通过硬件原子操作(如ARM的LDREX/STREX或C11的atomic)维护读写索引。缓冲区大小应为2的幂次,用位与运算替代取模。ISR作为生产者,任务作为消费者,写索引仅由ISR更新,读索引仅由任务更新,避免竞争。若需多生产者(如多个ISR或任务),可扩展为MPSC:每个生产者使用原子CAS(比较交换)预留槽位,再写入数据,最后更新写索引。注意,CAS需处理ABA问题,可增加序号或使用双索引(head/tail)。实操建议:1)确保缓冲区大小足够,避免覆盖未读数据;2)在ISR中禁用中断或使用临界区保护索引更新(但会引入阻塞,需权衡);3)使用内存屏障(如__DMB)保证数据可见性;4)测试时用压力测试验证无丢失。若多生产者频率极高,可考虑每生产者独立缓冲区,任务轮询合并,降低竞争。
mcuku 阿沐 · 2026-08-27