This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

LAUNCHXL-CC2640R2: undefined symbol error: ti_sysbios_hal_Core_CoreProxy_getId__E

Part Number: LAUNCHXL-CC2640R2
Other Parts Discussed in Thread: CC2650, SYSBIOS, CC2640

Hello TI BLE team,

I have a related question here. I use CCS9.0 and simplelink_cc2640r2_sdk_4_40_00_10.

I follow the instruction in:

file:///C:/ti/tirtos_cc13xx_cc26xx_2_20_01_08/products/tidrivers_cc13xx_cc26xx_2_20_01_10/docs/doxygen/html/_g_p_timer_c_c26_x_x_8h.html

to create the timer as follows:

void taskFxn(UArg a0, UArg a1) {
hTimer = GPTimerCC26XX_open(CC2650_GPTIMER0A, &params);
if(hTimer == NULL) {
Log_error0("Failed to open GPTimer");
Task_exit();
}
Types_FreqHz freq;
BIOS_getCpuFreq(&freq);
GPTimerCC26XX_Value loadVal = freq.lo / 1000 - 1; //47999
GPTimerCC26XX_setLoadValue(hTimer, loadVal);
while(1) {
Task_sleep(BIOS_WAIT_FOREVER);
}
}
The problem I am facing is:
Types_FreqHz is not defined anywhere in simplelink_cc2640r2_sdk_4_40_00_10.
Digging deep down, I found it is defined in C:\ti\xdctools_3_51_03_28_core\packages\xdc\runtime\Types.h 
But if I use this header file. I finally got a linker error below:
<Linking>
error #10056: symbol "ti_sysbios_BIOS_getThreadType__E" redefined: first defined in "<whole-program>"; redefined in "C:\Projects\TI\worksppace_v9\ble5_simple_peripheral_cc2640r2lp_app\TOOLS\src\sysbios\rom_sysbios.aem3<rom_sysbios.obj>"

undefined                                                             first referenced
symbol                                                                 in file
--------- ----------------
ti_sysbios_hal_Core_CoreProxy_getId__E     <whole-program>

error #10234-D: unresolved symbols remain
error #10010: errors encountered during linking; "ivy_simple_peripheral_cc2640r2lp_app.out" not built
How do I work around to solve this problem?
Thank you!
Min
  • Hi,

    It looks like an error in the .cfg file. I would recommend to review this document and add the required code in the .cfg file.

    The cfg file is in the folder TOOLS of your project. In general, the file point to other files and the configuration should be added in <SDK>\source\ti\ble5stack\common\cc26xx\kernel\cc2640\config\cc2640_r2_csdk.cfg

    Best regards,

  • Thanks Clément!

    It may take me a while to understand the whole RTSC technology...Any short cuts to beat the learning curve?

    Thanks again...

    Min

  •  Clément

    When I look again about the errors, the 1st one was:

    error #10056: symbol "ti_sysbios_BIOS_getThreadType__E" redefined: first defined in "<whole-program>"; redefined in "C:\Projects\TI\worksppace_v9\ble5_simple_peripheral_cc2640r2lp_app\TOOLS\src\sysbios\rom_sysbios.aem3<rom_sysbios.obj>"

    I don't think I caould solve this one by tweaking around RTSC config, what do you think?

    The 2nd error:

    undefined symbol: ti_sysbios_hal_Core_CoreProxy_getId__E, it make sense to work around with RTSC config to include the right module.

    But what I have trouble is, which module do I know will have this symbol defined and which package is it? Will it be possible for you to point me to the place I can find those information?

    Thanks.

    Min

  • Hi Min,

    Could you verify you manage to build the empty example with the following code?

    #include <ti/drivers/GPIO.h>
    #include <xdc/runtime/Types.h>
    #include <ti/sysbios/knl/Task.h>
    #include <ti/drivers/timer/GPTimerCC26XX.h>
    #include <ti/sysbios/BIOS.h>
    #include "Board.h"
    
    
    GPTimerCC26XX_Handle hTimer;
    GPTimerCC26XX_Handle sTimer;
    
    
    void timerCallback(GPTimerCC26XX_Handle handle, GPTimerCC26XX_IntMask interruptMask)
    {
        GPTimerCC26XX_stop(hTimer);
        GPIO_toggle(Board_GPIO_LED0);
        GPTimerCC26XX_start(hTimer);
    }
    
    void timerCallback1(GPTimerCC26XX_Handle handle, GPTimerCC26XX_IntMask interruptMask)
    {
        GPTimerCC26XX_stop(sTimer);
        GPIO_toggle(Board_GPIO_LED1);
        GPTimerCC26XX_start(sTimer);
    }
    
    /*
     *  ======== mainThread ========
     */
    void *mainThread(void *arg0)
    {
        /* Call driver init functions. */
        GPIO_init();
    
        GPTimerCC26XX_Params params;
        GPTimerCC26XX_Params_init(&params);
        params.width          = GPT_CONFIG_16BIT;
        params.mode           = GPT_MODE_PERIODIC_UP;
        params.debugStallMode = GPTimerCC26XX_DEBUG_STALL_OFF;
        hTimer = GPTimerCC26XX_open(Board_GPTIMER3A, &params);
        if(hTimer == NULL) {
          //Log_error0("Failed to open GPTimer");
          Task_exit();
        }
        Types_FreqHz  freq;
        BIOS_getCpuFreq(&freq);
        GPTimerCC26XX_Value loadVal = freq.lo / 10 - 1;
        GPTimerCC26XX_setLoadValue(hTimer, loadVal);
        GPTimerCC26XX_registerInterrupt(hTimer, timerCallback, GPT_INT_TIMEOUT);
        GPTimerCC26XX_start(hTimer);
    
    
        // Timer Configuration For Shutdown
    
        GPTimerCC26XX_Params paramsShutdown;
        GPTimerCC26XX_Params_init(&paramsShutdown);
        paramsShutdown.width          = GPT_CONFIG_16BIT;
        paramsShutdown.mode           = GPT_MODE_PERIODIC_UP;
        paramsShutdown.debugStallMode = GPTimerCC26XX_DEBUG_STALL_OFF;
        sTimer = GPTimerCC26XX_open(Board_GPTIMER0A, &paramsShutdown);
        if(sTimer == NULL) {
            //Log_error0("Failed to open GPTimer");
            Task_exit();
        }
        Types_FreqHz  freqShutdown;
        BIOS_getCpuFreq(&freqShutdown);
        GPTimerCC26XX_Value loadValShutdown = freqShutdown.lo /100 - 1;
        GPTimerCC26XX_setLoadValue(sTimer, loadValShutdown);
        GPTimerCC26XX_registerInterrupt(sTimer, timerCallback1, GPT_INT_TIMEOUT);
        GPTimerCC26XX_start(sTimer);
    
        while(1);
    
        return (NULL);
    }

    (Replace the whole content f empty.c by the code I have shared)

    Then, please point me to the example you are using. You may also want to make sure the .cfg file of your project contains the following line:

    var Types = xdc.useModule('xdc.runtime.Types');

    Best regards,

  • Thanks  Clément

    I'll deal with timer a bit later. Now I have another priority question...

    Is this still the case that simplelink_cc2640r2_sdk_4_40_00_10 still does not support GATT_NotifyEvent yet?

    Below is what I read for your reference:

    /* the following API are not available for now */
    #define GATT_NotifyEvent(...) (AssertHandler(0,0))

    //GATT Buffer Management APIs
    // Those are enabled in a different way...,
    // do not uncomment
    //#define GATT_bm_alloc(...) (icall_directAPI(ICALL_SERVICE_CLASS_BLE, (uint32_t) GATT_bm_alloc))
    //#define GATT_bm_free(...) (icall_directAPI(ICALL_SERVICE_CLASS_BLE, (uint32_t) GATT_bm_free))

    If this is the case, do you have a good code sample that I can deal GATT notify in simple_cetral project?

    How do I deal with notification enable in simple_central? 

    I'd reallyy benefit a great deal if there is a good sample project for CC2640r2 LHP. Is there such a good example from TI?

    Thank you and I appreciate your help!

    Min

  • Hi Min,

    Could you please open a new thread for this question? This is important to keep the forum easy to read.

    In the meantime, please mark this thread as resolved.

    Thanks and regards,