设计无锁队列用于ISR与任务间高频数据交换,核心是确保单生产者单消费者(SPSC)模型,避免竞争。推荐使用环形缓冲区(ring buffer),基于硬件原子操作或内存屏障实现。具体:定义结构体含缓冲区数组、读索引(任务侧)和写索引(ISR侧),索引使用无符号整型并允许回绕。ISR中仅写数据并更新写索引(使用volatile或原子操作,如ARM的LDREX/STREX或C11的atomic),任务侧仅读并更新读索引。关键点:1)确保索引更新顺序(先写数据,再更新索引),防止任务读到未就绪数据;2)使用内存屏障(如__DMB())保证可见性;3)缓冲区大小设为2的幂次,用位与操作替代取模,提升效率。实操建议:在Cortex-M上,可利用单核特性,关闭中断或使用临界区(但高频场景应避免),更推荐无锁原子操作。测试时需验证极端情况(满/空队列)和中断嵌套。
mcuku 阿沐 · 2026-08-27