设计无锁环形缓冲区(SPSC,单生产者单消费者)的核心是保证生产者和消费者各自只操作自己的索引,并通过内存屏障确保可见性。具体做法:定义缓冲区数组、读索引(消费者私有)和写索引(生产者私有),用volatile或原子变量(如C11的atomic_load/store)修饰索引。生产者写入数据后,先更新写索引(使用release语义);消费者读取前,先读取写索引(acquire语义),确保数据写入完成。中断中作为生产者时,需关闭中断或使用临界区保护写索引更新(因为中断可能打断任务),但消费者(任务)读索引无需保护。反之亦然。实操建议:1) 使用DMA或双缓冲减少中断频率;2) 索引用无符号整数并处理回绕(如取模或位掩码);3) 在ARM Cortex-M上,用__DMB()或原子指令(如LDREX/STREX)实现屏障;4) 缓冲区大小设为2的幂,用位与运算替代取模,提升效率。测试时用压力测试验证无数据丢失。
mcuku 阿沐 · 2026-08-27