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:在闪存中的特定地址上放置一个变量

Guru**** 2393475 points


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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/659268/cc1310-placing-a-variable-at-specific-address-in-flash

部件号:CC1310
主题中讨论的其他部件:SimpliciTI

您好,

不久前,我创建了一个主题,要求帮助在章节的闪存中将变量放在特定地址。

我无法使它正常工作。

我试图在原来的主题中继续讨论,但似乎被锁定了。 以下是原始内容:

有人能帮忙吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我找到了另一个示例,将部分放在特定地址中:
    stackoverflow.com/.../how-to-place-constant-at-specific-address-with-ld-linker-command-file

    但语法".section_name address:> flash"不起作用。
    我收到错误:
    需要输出部分,组或联合,而不是“:”
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,

    每个工具链对链接程序脚本使用不同的语法。 您尚未编写,但我假设您正在使用TI工具链。 请参阅 TI CGT工具链手册。 它出奇的好。

    对于TI CGT和IAR,还可以使用pragma。 我们的主板文件展示了如何执行此操作:

    #define NVS_REGINESS_BASE 0x1B000
    #define SECTORSIZE 0x1000
    #定义REGIZE (SECCTORSIZE * 4)
    #define VERIFYBUFSIZE 64
    
    static uint8_t verifyBuf[VERIFYBUFSIZE];
    
    /*
    通过将未初始化的字节
    *数组置于所需的闪存地址,为NVS驱动程序保留闪存扇区。
    */
    #if defined(__TI_Compiler_version__)
    
    /*
    *将未初始化的数组置于NVS_REGions_base
    */
    #pragma location (flashBuf,NVS_REGions_base);
    #IZma NOINIT (flashBuf);
    static char flashBuf[REGISE];
    
    #Elif defined(___REIAR_SYSTEMS _REGRIP_AR_NO_ARSE_ GRIP_RE_ARZSE_@ RE_REALIARIAR_REG_REALIARIZ_RE_REG_
    
    
    
    
    
    
    #Elif defined(__GnUI__)
    
    /*
    将闪存缓冲区放在在gcc链接程序文件中创建的.NVS部分。
    *.NVS部分强制对齐扇区边界,但可
    *放置在闪存中的任何位置。 如果需要,可以通过
    更改gcc链接程序文件中的以下内容将.NVS部分设置*为固定地址:
    *
    .NVS (fixed_flash_ADDR)(NoLoad): at (fixed_flash_ADDR){*
    *(.NVS)
    *}> region_text
    */
    __attribute__((section (".NVS")))
    静态字符闪存按钮[REGIZE];
    
    #endif 

    这更简单,但在整个工具链中不是很容易移植。

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

    感谢您的快速回答。

    我正在尝试复制您在.cmd文件中发布的示例。
    发自:
    *.NVS (Fixed_flash_ADDR)(NoLoad):在(fixed_flash_adDR){
    * *(.NVS)
    *}> region_text
    至:
    .boot_info_section (0x8000)(NoLoad):at (0x8000){
    *(.boot_info_section)
    }>闪烁

    但我得到了:
    *预期输出部分,组或联合,而不是“:”
    *需要节类型(COPY,DSECT或NoLoad)而不是"0x8000"
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您没有告诉我们您正在使用哪个工具链,但从 这个问题 来看,我假设您正在使用TI工具链。

    *.NVS (fixed_flash_adDR)(NoLoad):at (fixed_flash_adDR){
    **(.NVS)
    *}> region_text
    至:
    .boot_info_section (0x8000)(NoLoad):at (0x8000){
    *(.boot_info_section)
    }>闪存[/QUOT]

    这特定于 GNU LD。 它不能与TI链接器一起使用。 您是否正在使用GCC工具链?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在哪里可以看到所选的工具链?
    我只找到:
    CCS常规>编译器版本:TI v.16.9 .0.LTS
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    它是TI编译器工具链。 我给你们发布了一个示例,说明如何使用上面的pragma在闪存中将变量放置在特定地址。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,

    我需要此功能才能在应用程序和bootloader程序之间共享信息。

    所以,我复制你的例子,在应用程序中写了这个:
    #define boot_data_adDR 0x8000
    #define boot_data_size 10.
    #pragma location_boot_data, boot_data_addr);
    #pragma NOINIT (boot_data);
    static char boot_data[boot_data_size];

    为了在bootloader程序中访问此文件,我编写了以下内容:
    #define boot_data_adDR 0x8000
    static char * boot_data = boot_data_addr;

    这是否正确?

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

    Mad River 说:
    要在bootloader程序中访问此内容,我写了以下内容:[/QUOT]

    您的意思是boot_info还是boot_data? 在您的示例中,这些似乎是不同的事情。 但一般的想法在我看来是正确的。

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

    抱歉,复制/粘贴错误。 我编辑了上一个帖子。

    那么,在应用程序中,我是否可以直接写入boot_data? 如下所示:

       对于(i=0;i<boot_data_size;i++)
       {
          boot_data[i]= i;
       }

    还是需要使用闪存驱动程序?

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

    当您在ROM中使用TI-RTOS内核时,第二个闪存页(从0x1000开始)是保留的。 28 KiB听起来像是一个巨大的引导程序。 另请注意,您不应在最后一个Flash页中更新CCFG数据。 因此,您可以考虑将bootloader分成两个部分,然后重新使用最后一个Flash页的剩余部分。

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

    我正在编辑上一篇文章以更改我的问题,您在我完成编辑之前回答了问题。

    请看一下新问题吗?

    [引述]

    28 KiB听起来像是一个巨大的引导程序

    [/引述]

    我同意。 它只是使用SPI驱动程序的主函数。

    我认为这是因为TI-RTOS。

    我希望我可以在不使用引导加载程序中的TI-RTOS的情况下执行此操作。

    [引述]

    另请注意,您不应在最后一个Flash页中更新CCFG数据

    [/引述]

    我知道这一点。

    [引述]

    因此,您可以考虑将bootloader分成两个部分,然后重新使用最后一个Flash页的剩余部分。

    [/引述]

    我不理解这个部分。

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

    [报价用户="Mad River"]

    那么,在应用程序中,我是否可以直接写入boot_data? 如下所示:

      对于(i=0;i<boot_data_size;i++)

       {
          boot_data[i]= i;
       }

    还是需要使用闪存驱动程序?

    [/引述]

    否,您需要使用闪存驱动程序。 我感觉您希望了解我们的OAD解决方案,而不是自己重新实施所有内容。 至少,您应该仔细研究我们的OAD实施。 请看一下

    请仔细研究。 这将比在E2E上提出大量问题更有效。

    [报价用户="Mad River"]

    因此,您可以考虑将bootloader分成两个部分,然后重新使用最后一个Flash页的剩余部分

    我不理解这个部分。

    [/引述]

    可以将应用程序分为两个区域。 由于CCFG是引导加载程序的一部分,在现场部署设备后不应更改,因此最后一个Flash页面中还留有大量空间。 这也可用于引导加载程序代码。

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

    [引述]

    请看一下

    [/引述]

    谢谢你。