C代码访问C++类触发InstrFetchProhibited致命错误
问题:ESP32中C代码调用main实例化的C++ Parser类触发InstrFetchProhibited异常
我正在开发ESP32程序,用C代码获取BLE数据,再用C类解析。项目基于ESP32的C语言GATT服务器示例修改,原本通过C/C交互封装函数在C代码中创建Parser实例,运行正常。现在为了让其他类也能访问解析器,改成在main中实例化Parser,再把指针传给C代码的ble_init函数,结果触发未处理的InstrFetchProhibited异常。
原正常的C/C++交互封装代码
// C interface wrapper functions extern "C" void* parser_create(void* TxFunc) { return new parser((serialTx) TxFunc); } extern "C" void parser_release(void* parserInstance) { delete static_cast<Parser*>(parserInstance); } extern "C" void parser_Rx(void* parserInstance, const uint8_t *rxData, size_t rxLen) { static_cast<parser*>(parserInstance)->serialRx(rxData, rxLen); }
修改后的关键代码
Parser头文件
class Parser { public: Parser(serialTx txCallback); void serialRx(const uint8_t *rxData, size_t rxLen); serialTx txCallback; ... };
BLE C文件修改
void* parserClass; ... -void ble_init() +void ble_init(void* parserClassPtr) { - parserClass = parser_create(TxFunc); + parserClass = parserClassPtr; }
main.cpp修改
// 传给Parser类的发送函数,异常触发前未被调用 void transmitFunction(const uint8_t *txData, size_t txLen) {... } extern "C" void app_main() { ... - ble_init(); + Parser parserInstance(transmitFunction); + ble_init(&parserInstance); }
已做的排查
- 增大栈空间,排除栈溢出问题
- 打印Parser实例化后和调用
parser_Rx前的地址,确认指针未损坏
现在程序能运行,但BLE代码获取数据调用parser_Rx时触发异常,除了怀疑作用域问题,不知道该从何入手排查,求解答。
内容的提问来源于stack exchange,提问作者Drewster
相关产品推荐
相关产品推荐

