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.

CC1310官方OAD工程 编译oad image出现内存不够问题

Other Parts Discussed in Thread: CC1310, SIMPLICITI

由于需要实现CC1310的 OAD 升级功能,但是按照官方教程simplelink_cc13x0_sdk_1_50_00_08/examples/rtos/CC1310_LAUNCHXL/easylink/rfWsnNodeIntFlashOadClient/README.html 的指导在编译oad image 时出现编译错误。

错误为:compile error is :../CC1310_LAUNCHXL_TIRTOS_OAD.cmd", line 86: error #10099-D: program will not fit into available memory.  placement with alignment fails for section ".const" size 0x4c58 .  Available memory ranges:
   FLASH        size: 0xeff0       unused: 0x3a06       max hole: 0x39f6    
error #10010: errors encountered during linking; "rfWsnNodeIntFlashOadClient_CC1310_LAUNCHXL_tirtos_ccs.out" not built.

问题定位到是程序flash空间不够引起的,因为oad image做了必须小于60KB的限制,但是官方给的工程在CCS7下编译后的大小超过了60KB,无法编译成功。生成oad image的操作步骤按照官方给出的指引:

Building the hex file in CCS

  1. Import the CCS porject into CCS(for more information conslt the Examples Users Guide in the proprietary-rf documentation)
  2. If this is for an OAD image (not an image to be flashed), then exclude the ccfg.c file from the project.
  3. Add FEATURE_OAD_ONCHIP and HAL_IMAGE_A or HAL_IMAGE_B to the predefined Symbols in Project->Properties Arm Compiler / Predefined Symbols tab (for Image B the TIRTOS config file must also be changed, see below).
  4. Add FEATURE_OAD_ONCHIP=1 and HAL_IMAGE_A=1 or HAL_IMAGE_B=1 to the Linker symbol definition in Project->Properties ARM Linker->Advanced Options / Command File Preprocessing tab (for Image B the TIRTOS config file must also be changed, see below).
  5. Enable hex file conversion in Project->Properties Arm Hex Utility
  6. Set memory width to 8 in General options
  7. Set output format to intel hex.
  8. Make a code change update the nodeFwVersion string in NodeTask.c
  9. build

其中在 定义宏FEATURE_OAD_ONCHIP和 HAL_IMAGE_A的时候,会改变编译条件,在CC1310_LAUNCHXL_TIRTOS_OAD.cmd文件中将程序的flash 空间的最大值设置为0xEFF0

CC1310_LAUNCHXL_TIRTOS_OAD.cmd:

#if defined(FEATURE_OAD_ONCHIP)
    #if defined(HAL_IMAGE_B)
        #define FLASH_BASE              0x10000
        #define FLASH_SIZE              0xEFF0
    #else // HAL_IMAGE_A
        #define FLASH_BASE              0x1000
        #define FLASH_SIZE              0xEFF0
    #endif
#else
    #define FLASH_BASE              0x1010
    #define FLASH_SIZE              0x1EFF0
#endif

我尝试将编译oad image时的flash SIZE 改回0x1EFF0,编译通过,但是由于其超过了60KB的大小,无法生成一个可以正常使用的升级包。

官方都给出的教程是否有不完善的地方?是否能改变CCS7的一些编译设置减小程序flash部分的大小?寻求帮助和解决办法。

使用的SDK是simplelink_cc13x0_sdk_1_60_00_21 和 simplelink_cc13x0_sdk_1_50_00_08,现象完全一致。

  • 你好. 

    请参考我们的文档.

    file:///C:/ti/simplelink_cc13x0_sdk_1_60_00_21/docs/proprietary-rf/proprietary-rf-users-guide/cc13x0/oad-easylink/oad_onchip.html

    你会发现它的Flash的分配和文档完全一致. 而且你还需要用到BIM. 

    谢谢.

  • 我选的是RELEASE配置,不是DEBUG配置. 编译没有问题. 用的1.60的SDK

  • 请问您是否注释了

    var ROM = xdc.useModule('ti.sysbios.rom.ROM');
    if (Program.cpu.deviceName.match(/CC26/)) {
        ROM.romName = ROM.CC2650;
    }
    else if (Program.cpu.deviceName.match(/CC13/)) {
        ROM.romName = ROM.CC1350;
    }

    可以参考 https://e2e.ti.com/support/wireless_connectivity/proprietary_sub_1_ghz_simpliciti/f/156/p/615974/2274149

  • file:///C:/ti/simplelink_cc13x0_sdk_1_60_00_21/docs/proprietary-rf/proprietary-rf-users-guide/cc13x0/oad-easylink/oad_onchip.html教程的步骤不够全,漏了在linker 里定义 FEATURE_OAD_ONCHIP=1 HAL_IMAGE_A=1  的步骤,加上后在release版本中编译还是会出错。未定义其数据=1不会走到#define FLASH_SIZE              0xEFF0这一步,在CC1310_LAUNCHXL_TIRTOS_OAD.cmd文件里,所以编译能正常通过,但是编译出来的image无法使用。

    #if defined(FEATURE_OAD_ONCHIP)
        #if defined(HAL_IMAGE_B)
            #define FLASH_BASE              0x10000
            #define FLASH_SIZE              0xEFF0
        #else // HAL_IMAGE_A
            #define FLASH_BASE              0x1000
            #define FLASH_SIZE              0xEFF0
        #endif
    #else
        #define FLASH_BASE              0x1010
        #define FLASH_SIZE              0x1EFF0
    #endif

    #define RAM_BASE                0x20000000
    #define RAM_SIZE                0x5000

    详细步骤在easylink/rfWsnNodeIntFlashOadClient例程的教程里。file:///C:/ti/simplelink_cc13x0_sdk_1_60_00_21/examples/rtos/CC1310_LAUNCHXL/easylink/rfWsnNodeIntFlashOadClient/README.html

  • 没有修改过,单纯地导入工程然后按照工程rfWsnNodeIntFlashOadClient/README.html 里的指引编译,编译image时后发现编译不过。我不太清楚你贴的代码在哪个文件里

  • 你好。

    1. FEATURE_OAD_ONCHIP=1在ARM Compiler - PredefinedSymbol里面已经定义了。

    2。我按照上述定义好后没问题的。编译通过。(A和B都测试过都可以)


    2。


  • 您好,请你按照文档  file:///C:/ti/simplelink_cc13x0_sdk_1_60_00_21/examples/rtos/CC1310_LAUNCHXL/easylink/rfWsnNodeIntFlashOadClient/README.html

    中Building the hex file in CCS的第四步,定义FEATURE_OAD_ONCHIP=1 和HAL_IMAGE_A=1

  • 你好。我发现是工程的PATCH 导致的CONST太大。我把对应的RF_Mode 变量修改后可以正常编译。举例如下,一共有7个。但是不打补丁肯定会影响性能。我和产品确认一下。 

    RF_Mode RF_prop_fsk =
    {
    .rfMode = RF_MODE_PROPRIETARY_SUB_1,
    .cpePatchFxn = 0,
    .mcePatchFxn = 0,
    .rfePatchFxn = 0,
    };

  • 不太明白PATCH的作用,以及你说的 7个要修改的RF_Mode 变量具体作用?能详细解释一下么,或者我应该去查看哪些资料?

  • 你好。就是有的库是用的ROM里面的。但是需要更新,就需要打补丁。和windows更新一样。 打补丁就需要把补丁放到内部flash里面。 

    我目前已经完全测试成功了。现简单总结几点:

    1。必须采集器和节点两边固件同时用固件编译的。

    2。按下面的方法,不要用补丁。因为这些补丁的模式我们暂时不用。 

    RF_Mode RF_prop_lrm =
    {
    .rfMode = RF_MODE_PROPRIETARY_SUB_1,
    .cpePatchFxn = 0,
    .mcePatchFxn = 0,
    .rfePatchFxn = 0,
    };

    RF_Mode RF_prop_ook =
    {
    .rfMode = RF_MODE_PROPRIETARY_SUB_1,
    .cpePatchFxn = 0,
    .mcePatchFxn = 0,
    .rfePatchFxn = 0,
    };

    RF_Mode RF_prop_hsm =
    {
    .rfMode = RF_MODE_PROPRIETARY_SUB_1,
    .cpePatchFxn = 0,
    .mcePatchFxn = 0,
    .rfePatchFxn = 0,
    };

    RF_Mode RF_prop_sl_lr =
    {
    .rfMode = RF_MODE_PROPRIETARY_SUB_1,
    .cpePatchFxn = 0,
    .mcePatchFxn = 0,
    .rfePatchFxn = 0,
    };

    3。你得自己先生成完整的BIN文件。然后再OAD。 不能用它hex文件加的固件。 

    4。建议上面步骤每次都一步一步测试。OK了再下一步。

    5。软件版本说明有误,应该在oad_client.c里面修改。 

    6。perl添加的bin版本和oad_client.c 上的版本不一致。oad_client.c里的事采集器获取的版本。 

    建议先CCS跑通,再按上面一步一步曲做。