ZHCAFV0 June   2026 CC2340R5 , CC2744R7-Q1 , CC2745P10-Q1 , CC2745R10-Q1 , CC2745R7-Q1

 

  1.   1
  2.   摘要
  3. 1 软硬件设计参考链接
    1. 1.1 数据手册和用户手册
    2. 1.2 环境搭建必要软件以及推荐软件
    3. 1.3 SDK 示例
    4. 1.4 硬件设计参考文档
    5. 1.5 功耗计算表
    6. 1.6 产品 QDID认证链接
    7. 1.7 HSM (CC2745) 认证信息
  4. 2基于 CCS 20.0 的Debug 方法
    1. 2.1 如何将工程文件映射为客户自己的板子
    2. 2.2 结合 map 文件和ROV 评估RAM 消耗和检查 Stack Overflow
    3. 2.3 如何将你在 CCS 12.x 的工程移植到 CCS 20.x 中调试
    4. 2.4 对 CC2745 进行chip erase
    5. 2.5 如何在不导入工程代码的情况下在CCS 20.x 直接 debug 一个 项目工程(.out)
    6. 2.6 如何观察芯片的射频是否正常工作
  5. 3CC2340 & CC2745 开发过程中的常见问题
    1. 3.1  UniFlash 或 CCS 都烧写程序成功,但无法正常运行
    2. 3.2  蓝牙设备的 Tx Power 更改
    3. 3.3  为什么我的程序会进入 iCall_abort
    4. 3.4  如何 Debug 带有 MCUBoot 的工程
    5. 3.5  在 OAD 应用中调整 APP 所在 flash 位置和尺寸
    6. 3.6  在 .cmd 中自定义 SECTION 并在代码中使用
    7. 3.7  如何使用非初始化变量区
    8. 3.8  如何同时发出 Public 地址和 RPA 地址的两路ADV
    9. 3.9  CC2745R10 芯片 E0 和 E1 的区别
    10. 3.10 如何使更多的 DMA channel 来支持我的驱动需求

为什么我的程序会进入 iCall_abort

在调用蓝牙API 时,一个常见的错误是程序进入iCall_abort。导致 iCall_abort 的最常见原因有两个。

  • 从自定义任务中直接调用蓝牙API
  • 从中断处理函数或回调函数中直接调用蓝牙API

为避免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。这样在释放时会被安全释放。