You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 02:23:13