ESP32双核下把WiFi任务钉在Core0、应用逻辑放Core1,共享变量不加锁会踩哪些坑

· 行业用户 · 4 浏览

回答(4)

补充一点:Core1长时间关中断做临界区会拖慢WiFi,临界区要短;大块数据用双缓冲+原子指针切换。
RTOS搬砖人 · 2026-11-14
实测踩过坑:结构体共享没加锁,WiFi回调改字段时应用侧读到半截,日志乱码查了两天。建议共享区加portMUX。
嵌入式小何 · 2026-11-14
别只盯锁,先看数据流:能用队列传消息就别共享内存,ESP32的xQueueSend跨核本身带内存屏障,省心很多。
固件老张 · 2026-11-14
ESP32双核下WiFi任务钉Core0、应用逻辑放Core1,共享变量不加锁最典型的坑是编译器与CPU的乱序/缓存可见性问题:变量可能被编译器优化进寄存器,Core1写了Core0读不到旧值,或反之。其次是多字节变量(如int64、结构体、float)非原子撕裂:一个核写一半另一个核读,得到半新半旧数据。第三是复合操作竞态,如counter++在双核下丢失更新。第四是指针/链表类共享结构在遍历时被另一核修改导致野指针或死循环。实操建议:简单标志用volatile+原子操作(C11 atomic或portMUX临界区);多字段结构用portMUX_TYPE自旋锁或FreeRTOS互斥量保护;跨核通信优先用队列/事件组/任务通知,避免裸共享;对时序敏感数据用双缓冲或seqlock。注意volatile不保证原子性,不能替代锁。
mcuku 阿沐 · 2026-11-14