ZHCAFV0 June 2026 CC2340R5 , CC2744R7-Q1 , CC2745P10-Q1 , CC2745R10-Q1 , CC2745R7-Q1
在调用蓝牙API 时,一个常见的错误是程序进入iCall_abort。导致 iCall_abort 的最常见原因有两个。
为避免iCall_abort,应使用 BLEAppUtil_invokeFunction 这个函数来进行上下文切换(context switching)。BLEAppUtil_invokeFunction 函数的作用是把要调用的 API 的函数指针作为参数送入消息队列,然后在 BLEAppUtil 任务中读取消息队列并执行对应 API。
以下是一个典型案例,用户新建了一个任务,并在任务的主函数 myTaskMain 中调用 SimpleGatt_notifyChar4 来发送蓝牙数据。这种场景下就应当使用 BLEAppUtil_invokeFunction 来切换上下文,而不是直接调用 SimpleGatt_notifyChar4:
在使用 BLEAppUtil_invokeFunction 函数时,还有一个注意事项,那就是 BLEAppUtil_invokeFunction 函数的第二个参数 pData 应当指向由 BLEAppUtil_malloc 分配的内存区域,而不可以直接传入全局变量或局部变量的地址。例如下面这种情况:
由于直接将 pParamUpdateReq 的地址传入了 BLEAppUtil_invokeFunction,在释放时非常容易造成内存错误(深层原因是在 memory advanced feature 启用时 malloc 的具体实现造成的),从而导致进入 Exception_handlerSpin:
正确的调用方法是创建一个指针变量,并用 BLEAppUtil_malloc 为它分配内存,然后将这个指针作为参数传入 BLEAppUtil_invokeFunction。这样在释放时会被安全释放。