ESP32 启动另一个核心(双核) Guru Meditation Error

跟代码打交道它是不讲理的,之所以这么说是因为如果你想跟它讲理会耗费很长时间。所以我并不打算跟它讲道理!

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);
}

什么?还是有问题? 试着加大你的堆栈大小。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。