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.

[参考译文] CC2630:如何从0x0以外的地址开始构建 TIMAC 程序-获得错误的 ROM 链接

Guru**** 2379110 points
Other Parts Discussed in Thread: TIMAC, CC2630, SYSBIOS, CC2650
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/1253536/cc2630-how-to-build-a-timac-program-starting-at-an-address-other-than-0x0---getting-a-bad-rom-link

器件型号:CC2630
Thread 中讨论的其他器件: SysBIOS、TIMAC、 CC2650

我撰写的是一个一直在运行非 TI RTOS 解决方案的现有(已部署)硬件产品。 由于 CC2630上闪存的性质、我无法从软件写入低于0x1000的闪存地址、因此我可以远程应用的任何更新都只能对0x1000处及之后的代码有效。

我对 ICF 文件执行了以下操作

-  define symbol FLASH_SIZE          = 0x00020000;  // 128K
+  define symbol FLASH_SIZE          = 0x0001F000;  // 124K
..
-define region FLASH      = mem:[from FLASH_START to FLASH_END];
+define region FLASH      = mem:[from FLASH_SLOT_1 to FLASH_END];
..
-place at address mem:FLASH_START { readonly section .intvec };
-keep                             { readonly section .intvec };
+place at address mem:FLASH_SLOT_1 { readonly section .intvec };
+keep                              { readonly section .intvec };
... (cc26xx_rtos_rom.icf, done with every item below 0x1000)
-place at address mem:0x00000538 {readonly section .const_xdc_runtime_IModule_Interface__BASE__C};
+place at address mem:0x00001538 {readonly section .const_xdc_runtime_IModule_Interface__BASE__C};

结果会进行编译、但在跳至__IAR_program_start 后很快会失败。 它始终以 ti_sysbios_rom_cortexm_cc26xx_CC26xx_BadRomLink__E 结尾。 我尝试了删除 USE_SYSBIOS_IN_ROM=1、但它并未更改结果。 以下代码仍在 configPkg/package/cfg/app_prm3.c 中自动生成

Void ti_sysbios_rom_cortexm_cc26xx_CC26xx_checkRevision__E()
{
    if (*((UInt32 *)(REVISION_WORD)) != 0x20284770) {
	ti_sysbios_rom_cortexm_cc26xx_CC26xx_badRomRevision__E();
    }
    if (&ti_sysbios_rom_ROM_AONRTCChannelEnable != (Void *)(0x590)) {
	ti_sysbios_rom_cortexm_cc26xx_CC26xx_badRomLink__E();
    }
}

此代码由 CC26xx.xdt 生成条件取决于它是否是 IAR 构建、与 ROM 中的 SYSBIOS 以及它可能位于何处无关

%if (Program.build.target.$name.match(/iar/)) {
#pragma inline=never
Void ti_sysbios_rom_cortexm_cc26xx_CC26xx_badRomLink__E() {
	/* Loop here forever if application is built without the ROM section placements in the .icf file */
        while(1) {
            ;
        }
}

%}
Void ti_sysbios_rom_cortexm_cc26xx_CC26xx_checkRevision__E()
{
    if (*((UInt32 *)(REVISION_WORD)) != 0x20284770) {
	ti_sysbios_rom_cortexm_cc26xx_CC26xx_badRomRevision__E();
    }
%if (Program.build.target.$name.match(/iar/)) {
    if (&ti_sysbios_rom_ROM_AONRTCChannelEnable != (Void *)(0x590)) {
	ti_sysbios_rom_cortexm_cc26xx_CC26xx_badRomLink__E();
    }
%}
}

我不知道从这里去哪里。 我要么需要一种方法来正确移动高于0x1000的 ROM 引用、要么不使用它们即可工作。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    感谢您与我们联系。 我们将对此进行研究、并尽快与您联系。 同时、您能否指定您正在使用的 SDK 版本?

    此致、

    1月

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、Jan、我正在使用 TIMAC 所要求的版本

        - TI-RTOS: tirtos_simplelink_2_11_01_09
        - XDCTOOLS:xdctools_3_30_06_67_CORE

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    单步执行 ROM 段汇编、很明显、没有办法使它工作。 ROM 段包含硬编码跳转、地址小于0x1000、因此必须以兼容的方式对段进行编程。 因此、唯一的方法是从不调用 ROM。 在该平台的40/50变体上使用 Z Stack 看起来不可能实现这一点、但我找不到 TIMAC 的明确答案。 不过、我上面发布的信息并不是很好、因为显然存在一些硬性规定的假设、表明会在 ROM 中实现跳转。 虽然我的前任能够一起破解一个工作的执行,没有跳到 ROM ,但他从来没有写什么版本,他复制(或如何/如果他修改他们之前承诺)所以我在这里玩考古学家。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    不幸的是、SYSBIOS 中的配置看起来像是我的怀疑被证实了。 不知道为什么一开始就写入了具有此名称的配置、但

    enum RomName {
        CC2650,         /*! Use for all CC26xx devices */
    CC1350,         /*! Use for all CC13xx devices */
    CC2650_FLASH,	/*! THIS OPTION IS NOT SUPPORTED! */
    TM0SXX,		/*! THIS OPTION IS NOT SUPPORTED! */
    POTENZA		/*! THIS OPTION IS NOT SUPPORTED! */
    };

    我希望我错了,有一些支持来解决这个问题,但它真的看起来像我是 SOL。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Daniel、您好!

    您是否已修改配置文件(*。cfg)在闪存中而不是在 ROM 中构建 SYSBIOS?  请参阅 相关的 E2E 主题 并将 useSysbiosInRom 设置为 false。  另外、您是在闪存还是 ROM 中使用 TIMAC 堆栈( 有关更多详细信息、请参阅 cc2650Stack 项目的 cc26xx_TIMAC_STACK_RELEASe.icf)、并且是否对该项目进行了任何更改。

    此致、
    瑞安

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    HA、我完全忘记了.cfg 文件。 这基本上就是解决方案。 除了原始步骤之外、我还执行了以下操作:

    *遵循上面链接的线程并注释设置"useSysbiosInRom = false;"(此 cfg 是从 MSA 应用复制的)

    *将 ICALL_STACK0_ADDR 设置为比 MSA 应用程序中设置的0x9000高的值,否则我的应用程序空间不足。

    *将 TIMAC_1_05_02_43299\projects\Mac\Stack\cc26xx_rtos\Include\CC2650\ICallAddrs.h 修改为硬编码 ICALL_STACK0_ADDR 为同一地址(它的硬编码为0x9000、因此按原样会导致崩溃)。 现在该文件不是标准文件、我可能会将其迁移到我的源控制工程中。