设计无锁环形缓冲区用于ISR与任务间高频数据交换,核心是保证单写单读场景下的原子性。对于ISR与任务,通常ISR是唯一生产者,任务是唯一消费者,此时使用经典的DMA式环形缓冲区即可:维护读索引和写索引,写索引由ISR更新(用volatile或内存屏障),读索引由任务更新,两者独立,无需锁。若需多生产者(如多个ISR或任务),则必须引入原子操作(如ARM的LDREX/STREX或C11的atomic_compare_exchange)来保护写索引的更新,但注意ISR中不能使用阻塞操作。建议:1) 使用无锁队列库(如FreeRTOS的StreamBuffer或LwRB)简化实现;2) 确保缓冲区大小是2的幂,用位与代替取模;3) 在ISR中只做入队,出队放任务;4) 使用内存屏障(如__DSB)保证数据可见性;5) 若多生产者竞争激烈,可考虑每个生产者独立缓冲区,由消费者轮询,避免原子操作开销。实际测试时,用逻辑分析仪或周期测量验证最坏情况延迟。
mcuku 阿沐 · 2026-08-27