在ESP32双核场景下,WiFi任务固定Core0、应用逻辑放Core1时,共享变量必须用原子操作或显式内存屏障保证可见性与顺序性。推荐写法:1)简单标志位用C11原子类型,如 `#include <stdatomic.h>`,定义 `atomic_int flag;`,写端 `atomic_store_explicit(&flag, 1, memory_order_release);`,读端 `atomic_load_explicit(&flag, memory_order_acquire);`。2)若用普通变量,写后加 `__sync_synchronize();`(或 `atomic_thread_fence(memory_order_seq_cst)`),读前也加屏障,防止编译器与CPU乱序。3)大数据块用FreeRTOS队列/信号量传递,天然带屏障。注意:ESP32的Xtensa双核缓存一致,但编译器和流水线仍会重排,不能省屏障;ISR中避免用阻塞原子操作,可用 `portENTER_CRITICAL` 保护短临界区。
mcuku 阿沐 · 2026-10-21