ESP32Cam调用BLEDevice::Init触发Guru Meditation Error求助
Guru Meditation Error: Core 0 panic'ed (LoadProhibited). Exception was unhandled.
Core 0 register dump:
PC : 0x40099c19 PS : 0x00060330 A0 : 0x8009a8d2 A1 : 0x3ffdbf00
A2 : 0xffffffff A3 : 0xffffffff A4 : 0x20000000 A5 : 0x00060f23
A6 : 0x00060f20 A7 : 0x00000001 A8 : 0x00000003 A9 : 0x00000006
A10 : 0x00000027 A11 : 0x0000111c A12 : 0x00000013 A13 : 0x00000040
A14 : 0xfffffffc A15 : 0x00001ebc SAR : 0x00000007 EXCCAUSE: 0x0000001c
EXCVADDR: 0x0000002b LBEG : 0x40092a70 LEND : 0x40092a7b LCOUNT : 0x00000000
特征及全局定义
BLEServer *pServer = NULL; BLECharacteristic *pCharCredential = NULL; BLECharacteristic *pCharMacAddr = NULL; BLECharacteristic *pCharMacExtAddr = NULL; BLECharacteristic *pCharBatLvl = NULL; BLEService *pService = NULL; BLEAdvertising *pAdvertising = NULL;
BLE回调函数
class MyServerCallbacks : public BLEServerCallbacks { void onConnect(BLEServer *pServer) { BLEDevice::startAdvertising(); }; }; class credentialCallback : public BLECharacteristicCallbacks { void onWrite(BLECharacteristic *pCharacteristic) { std::string value = pCharacteristic->getValue(); // 在此存储SSID和密码 SSID = value.substr(0, value.find('|')); PWD = value.substr(value.find('|') + 1, value.size()); state = STATE_SWITCH_MODE; } };
触发异常的代码段
case STATE_BLE: BLEDevice::init(DEVICE_NAME); // <----- 问题出在此处 pServer = BLEDevice::createServer(); pServer->setCallbacks(new MyServerCallbacks()); pService = pServer->createService(SERVICE_UUID); // 凭证特征 pCharCredential = pService->createCharacteristic( CREDENTIAL_UUID, BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_WRITE | BLECharacteristic::PROPERTY_NOTIFY | BLECharacteristic::PROPERTY_INDICATE); pCharCredential->setCallbacks(new credentialCallback()); pCharCredential->addDescriptor(new BLE2902()); // 主摄像头MAC地址 pCharMacAddr = pService->createCharacteristic( MAC_UUID, BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_WRITE | BLECharacteristic::PROPERTY_NOTIFY | BLECharacteristic::PROPERTY_INDICATE); pCharMacAddr->setValue(WiFi.macAddress().c_str()); pCharMacAddr->addDescriptor(new BLE2902()); // 副摄像头MAC地址 pCharMacExtAddr = pService->createCharacteristic( MAC_EXT_UUID, BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_WRITE | BLECharacteristic::PROPERTY_NOTIFY | BLECharacteristic::PROPERTY_INDICATE); pCharMacExtAddr->setValue(macExtCam.c_str()); pCharMacExtAddr->addDescriptor(new BLE2902()); // 电池电量 pCharBatLvl = pService->createCharacteristic( BAT_LVL_UUID, BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_WRITE | BLECharacteristic::PROPERTY_NOTIFY | BLECharacteristic::PROPERTY_INDICATE); char ctable[5]; sprintf(ctable, "%d", batLvl); pCharBatLvl->setValue(ctable); pCharBatLvl->addDescriptor(new BLE2902()); pService->start(); pAdvertising = BLEDevice::getAdvertising(); pAdvertising->addServiceUUID(SERVICE_UUID); pAdvertising->setScanResponse(false); pAdvertising->setMinPreferred(0x0); // 设置为0x00则不广播该参数 BLEDevice::startAdvertising(); delay(10); state = STATE_IDLE; break;
排查过程
该问题近期才出现,2022年10月至2023年3月9日期间代码运行完全正常,已做以下排查:
硬件排查
- 更换3台不同的ESP32Cam测试,排除硬件故障
- 使用2台不同编程器测试,排除编程器问题
软件排查
- 更新所有库及开发板包,排除版本过时问题
- 从PlatformIO切换到ArduinoIDE 2.0测试
- 回退至旧版本库测试(PlatformIO和ArduinoIDE均尝试)
- 使用之前正常的主分支代码,问题依旧存在
- 注释
BLEDevice::Init后设备不再崩溃,但BLE无法启动(符合预期) - 排查发现问题似乎源自
esp32-hal-bt.h中的btStart()函数 - 恢复CPU时钟频率为默认值
从错误信息判断,问题大概率是内存分配异常,但无法定位具体原因。
编辑补充
已添加对pServer、pService及所有特征的空指针检查,但问题未解决:
pServer = BLEDevice::createServer(); if (pServer == NULL) { Serial.println("Can't create server"); break; }
内容的提问来源于stack exchange,提问作者Mathias DA COSTA

