最近把一个单核项目迁到 ESP32 双核上,体会是:核多了不等于实时性自动变好,任务怎么分、核间怎么传数据才是关键。

一、单核时的现象
以前 Wi-Fi、传感器采集和显示都挤在一个核上:协议栈一忙,采集周期就被拉长,显示刷新也跟着抖;个别耗时操作堵住主循环,看门狗来不及喂,就会直接复位。看着像随机死机,其实多半是调度被高负载任务拖垮了。

二、划分原则
先按实时性分级,而不是按功能随便拆:
1. Wi-Fi 与协议栈固定跑核 0,时序相对独立,不被应用逻辑打断。
2. 实时采集与控制放核 1,周期固定,优先级高于显示任务。
3. 中断尽量短,只做采样、置标志或把数据交给任务,耗时解析一律下放到任务里。

三、核间通信
采集数据用队列传给上报任务,有边界、可排队,也方便做超时和丢弃策略;多任务协同用事件组同步,不要轮询标志位。共享变量加互斥量或临界区保护,两个核不要直接读写同一块缓冲,否则读到半更新的数据很难复现。

四、两个避坑
1. 任务栈溢出先查高水位:跑一段时间看剩余栈空间,再按最坏路径留余量,不要凭感觉估栈大小。
2. 核间队列满了要做背压,而不是无限阻塞:可以丢弃旧帧、降采样或返回忙状态,让系统可控降级;无限等待往往会把两个核一起拖住。

大家在双核项目里最难定位的是核间时序问题还是内存竞争?