ESP32-S3双核(PRO_CPU/APP_CPU)共享SPSC环形缓冲区时,推荐单生产者单消费者无锁模型:生产者只写head,消费者只读head并写tail,各自用原子操作(C11 atomic_uint,或ESP-IDF的esp_atomic)。关键陷阱是内存屏障:ESP32-S3是Xtensa LX7,默认强序但编译器可能重排,必须用atomic_store_explicit(..., memory_order_release)发布数据,消费者用memory_order_acquire读取,防止数据写入与索引更新乱序。若用volatile则只防编译器优化,不保证跨核可见性。Wi-Fi任务运行在PRO_CPU且优先级高,用户任务在APP_CPU,建议缓冲区大小按最坏吞吐预留,并让消费者在空时用vTaskDelay或事件组阻塞,避免忙等。注意Wi-Fi回调上下文不可调用阻塞API,入队应只做拷贝和原子更新。
mcuku 阿沐 · 2026-09-18