跟代码打交道它是不讲理的,之所以这么说是因为如果你想跟它讲理会耗费很长时间。所以我并不打算跟它讲道理!
ESP32是双核的,这也是我觉得它很好的原因之一,举个小栗子:如果你用UNO挂载WIFI模块和BLE模块,那么你需要监听两个串口消息,而且发送消息也要通过串口->模块->外界,这样你可能需要尽可能优化你的代码,因为监听串口是耗时操作,而且数据转来转去也很麻烦。那么双核的好处你懂的。
当然ESP32内置了WIFI模块和BLE使得你无需去监听它们,再搭配节拍器我觉得舒畅的狠。
下面来谈谈启用双核可能面临的问题,以下是正常使用的代码。
void setup() {
Serial.begin(9500);
xTaskCreatePinnedToCore(appCpuLoop, //具体实现的函数
"APP_CPU_LOOP", //任务名称
8192, //堆栈大小
NULL, //输入参数
1, //任务优先级
NULL, //
1 //核心 0\1
);
}
void loop() {
Serial.println("main core");
delay(1000);
}
void appCpuLoop(void *pvParameters){
Serial.println("appCpu");
delay(1000);
}
该代码既可开启双核运作,但不讲理的是上午我运行还好好的,下午就给我脸色看了,以下是脸色。
7:49:25.829 -> main core
17:49:25.829 -> appCpu
17:49:26.818 -> main core
17:49:26.818 -> Guru Meditation Error: Core 1 panic'ed (IllegalInstruction). Exception was unhandled.
17:49:26.921 -> Core 1 register dump:
17:49:26.956 -> PC : 0x400d097a PS : 0x00060a30 A0 : 0x00000000 A1 : 0x3ffb4310
17:49:27.026 -> A2 : 0x00000000 A3 : 0x00000000 A4 : 0x00000000 A5 : 0x00000000
17:49:27.130 -> A6 : 0x00000000 A7 : 0x00000000 A8 : 0x800d097a A9 : 0x3ffb42f0
17:49:27.233 -> A10 : 0x000003e8 A11 : 0x00000006 A12 : 0x00060023 A13 : 0x3ffb43ac
17:49:27.335 -> A14 : 0x00000000 A15 : 0x00000000 SAR : 0x00000000 EXCCAUSE: 0x00000000
17:49:27.404 -> EXCVADDR: 0x00000000 LBEG : 0x400014fd LEND : 0x4000150d LCOUNT : 0xffffffff
17:49:27.507 ->
17:49:27.507 -> Backtrace: 0x400d097a:0x3ffb4310 0x7ffffffd:0x3ffb4330
17:49:27.576 ->
17:49:27.576 -> Rebooting...
17:49:27.576 ->
这个看起来确实很糟糕,核心1在第二次注册失败了,接着系统重启,并重复该错误,时间不多,也不打算深究,直接给出解决方案,用完释放就好了。
void setup() {
Serial.begin(9500);
xTaskCreatePinnedToCore(appCpuLoop, //具体实现的函数
"APP_CPU_LOOP", //任务名称
8192, //堆栈大小
NULL, //输入参数
1, //任务优先级
NULL, //
1 //核心 0\1
);
}
void loop() {
Serial.println("main core");
delay(1000);
}
void appCpuLoop(void *pvParameters){
while(1){
Serial.println("appCpu");
delay(1000);
}
//当你想结束它的时候break()
vTaskDelete(NULL);
}
什么?还是有问题? 试着加大你的堆栈大小。