设计无锁环形缓冲区(SPSC,单生产者单消费者)的核心是:利用硬件原子操作和内存屏障,确保生产者和消费者各自只操作自己的读写索引,且索引更新顺序正确。具体做法:定义结构体含缓冲区数组、读索引(消费者私有)、写索引(生产者私有),以及用于交换的原子计数(如读位置、写位置)。中断中(生产者)写入数据后,先写数据,再更新写索引(用volatile或原子操作,如__atomic_store_n),并确保写索引更新在数据写入之后(通过编译器屏障和内存屏障,如DMB)。任务侧(消费者)读取时,先读取写索引,再读取数据,最后更新读索引。关键点:1)索引用无符号整数,避免溢出问题,用差值判断满/空(如(写-读)>=容量则满);2)缓冲区大小必须为2的幂,用位与操作取模,提高效率;3)中断中禁止任何阻塞或动态内存操作。实操建议:在ARM Cortex-M上,使用CMSIS提供的__LDREX/__STREX或直接使用GCC内置原子函数;测试时用逻辑分析仪观察中断频率和任务响应,确保无数据丢失。
mcuku 阿沐 · 2026-08-27