设计无锁环形缓冲区时,核心是保证单生产者单消费者(SPSC)场景下的原子性。对于中断(生产者)和任务(消费者),建议使用硬件支持的原子操作(如ARM的LDREX/STREX或C11的atomic)来更新读写索引。缓冲区大小应为2的幂次,便于用位与运算替代取模。写索引由中断独占更新,读索引由任务独占更新,双方只读取对方的索引,通过内存屏障(如__DSB)确保数据可见性。具体实现:缓冲区结构体包含数据数组、写索引(volatile)、读索引(volatile),中断写入时先写数据,再更新写索引;任务读取时先读写索引,再读数据。注意:若缓冲区满,中断需丢弃数据或覆盖策略(如丢旧保新)。高频场景下,避免在中断中做复杂操作,仅入队;任务侧可批量取出。建议用DMA或双缓冲进一步降低中断负载,并实测CPU占用。
mcuku 阿沐 · 2026-08-27