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

 

  1.   1
  2.   Abstract
  3. 1Links to Hardware and Software Design References
    1. 1.1 Data Sheet and User Guide
    2. 1.2 Required and Recommended Software for Environment Setup
    3. 1.3 SDK Examples
    4. 1.4 Hardware Design References
    5. 1.5 Power Calculator Table
    6. 1.6 Links to Product QDID Certificates
    7. 1.7 HSM (CC2745) Certification
  4. 2CCS 20.0-Based Debugging Methods
    1. 2.1 How to Map a Project File to the Customer's Own Board
    2. 2.2 Evaluating RAM Consumption and Checking for Stack Overflow With Map File and ROV
    3. 2.3 How to Port Your Project in CCS 12.x to CCS 20.x for Debugging
    4. 2.4 Performing Chip Erase on the CC2745
    5. 2.5 How to Debug a Project (.out) Directly in CCS 20.x Without Importing Project Code
    6. 2.6 How to Verify Whether the Chip's RF Is Working Properly
  5. 3FAQs for Development Using CC2340 and CC2745
    1. 3.1  Why Does the Program Fail to Run Correctly Although It Has Been Successfully Flashed via UniFlash or CCS
    2. 3.2  How to Change the Tx Power for Bluetooth Devices
    3. 3.3  Why Does My Program Enter iCall_abort
    4. 3.4  How to Debug a Project with MCUboot
    5. 3.5  How to Adjust the Flash Location and Size of the App in an OAD Application
    6. 3.6  How to Customize a Section in .cmd and Use it in Code
    7. 3.7  How to Use the Non-initialized Variable Section
    8. 3.8  How to Simultaneously Send Two ADV Sets With Public and RPA Addresses
    9. 3.9  What is the Difference Between E0 and E1 on the CC2745R10 Chip
    10. 3.10 How to Enable More DMA Channels to Support My Driver Requirements

Why Does My Program Enter iCall_abort

A common error when calling the Bluetooth API is that the program enters iCall_abort. There are two most common causes for iCall_abort.

  • The Bluetooth API is directly called from a custom task
  • The Bluetooth API is directly called from an interrupt handler or callback function

To avoid entering iCall_abort, use the BLEAppUtil_invokeFunction function for context switching. The BLEAppUtil_invokeFunction function passes the function pointer of the API to be called into the message queue as an argument. The BLEAppUtil task then reads the message queue and executes the corresponding API.

The following is a typical case where the user creates a new task and calls SimpleGatt_notifyChar4 from the main function (myTaskMain) of the task to send Bluetooth data. In this scenario, the user should use BLEAppUtil_invokeFunction to switch contexts, instead of directly calling SimpleGatt_notifyChar4:

Another point to note when using the BLEAppUtil_invokeFunction function is that its second argument, pData, must point to a memory region allocated by BLEAppUtil_malloc. Do not pass the address of a global variable or a local variable directly. In the example below:

Since the address of pParamUpdateReq is passed directly into BLEAppUtil_invokeFunction, it is highly prone to memory errors upon release (the underlying cause is the specific implementation of malloc when the Memory Advanced feature is enabled), which leads to an entry into Exception_handlerSpin:

The correct calling procedure is: Create a pointer variable, allocate a memory region for it using BLEAppUtil_malloc, and pass the pointer as an argument into BLEAppUtil_invokeFunction. By doing so, it can be released safely.