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.

[参考译文] 编译器/CC2640R2F:使用链接器命令文件和拆分段将最后填充的地址导出到变量

Guru**** 2587365 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/607436/compiler-cc2640r2f-export-the-last-filled-address-to-variable-using-linker-command-file-and-split-sections

器件型号:CC2640R2F

工具/软件:TI C/C++编译器

您好!

我正在为 CC2640R2开发示例应用、该应用旨在通过 BLE 连接进行无线升级。

该设计具有以下约束条件。

  1. 图像标题必须从图像的开头开始。 这必须进行页面对齐  
  2. 条目段必须紧跟在图像标头之后、并且必须被安装到闪存中的已知地址
  3. 最后填充的地址必须通过链接器命令文件导出到变量。 然后、此变量用于填充发送 OTA 的.c 文件中的头文件结构
  4. 应从较低地址到高地址顺序填充闪存、同时最大限度地减少放置中的间隙数量。

我的问题是如何可靠地知道图像中最后填充的地址。 理想情况下、我要拆分段以实现最佳放置、并使用组来确保按顺序放置所需的段。 但是、在某些具有.snvSecors 的图像中、flashEndAddr 并不是真正放置在.cinit 中。 但是.cinit 不能拆分。

以下是链接器文件的相关代码段:

MEMORY
{//
编辑器注释:
*可以通过在

* Properties->ARM Linker->Advanced Options->Command File Preprocessing 中定义* ICALL_STACK0_START 或 ICALL_RAM0_START 来更改闪存和 SRAM 长度。
//

闪存(RX):origin = flash_start,length =(flash_end - flash_start)+ 1)

entry (RX):origin = entry_start,length = entry_size
flash_IMG_HDR (RX):origin = OAD_HDR_start,length = OAD_HDR_size
SRAM (rwx):origin = RAM_START,ram_length = RAM_start
………………………

一些器件经过了编辑、以提高示例

部分
{
GROUP > FLASH_IMG_HDR
{的可读性/简易性
.image_header align page_size
}

组>条
目{
.resetVecs
.intvecs
EntrySection load_start (prgEntryAddr)
}

组>> FLASH
{
.text
.const
.constdata
rodata
.EMB_TEXT
.pinit
}

.cinit :> FLASH load_end (flashEndAddr)
.snvSecors :>闪存(高电平)
} 

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

    1.按照 TI ARM 汇编语言用户指南中的8.5.10.2将 SPC 导出到符号。 并在上面 SECTIONS 指令中的最后一个放置位置之后分配它
    2.手动将.cinit 段固定到低地址(紧跟在入口段之后)。 这似乎不起作用。 它仍然会将该段移动到闪存的末尾。

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

    [引用 user="Sean2"]我的问题是如何可靠地知道映像中最后填充的地址。

    对于一个存储器范围(如闪存)、只需选择最后一个输出段。  然后在该段上使用 HIGH 位置说明符。  更多细节请见  ARM 汇编工具手册中标题为使用 HIGH 位置说明符控制放置的部分。  要捕获最后一个地址、请使用" 地址和维度运算符"部分中的相应终端运算符。  

    查看您的链接器命令文件代码,这...

    [引用 user="Sean2"]组>>闪存

      .text
      .const
      .constdata
      rodata
      .EMB_TEXT
      .pinit


    .cinit:> FLASH load_end (flashEndAddr)
    .snvSecors:>闪存(高电平)[/quot]

    (笑声) 不需要组。  只需分配闪存中的每个输出段、让链接器选择顺序、但您使用高电平的一个输出段除外。  

    谢谢、此致、

    乔治

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

    乔治

    感谢您的快速回复。 问题是、默认情况下、我希望(如果可能)将代码打包到较低的地址。  

    原因是图像将转换为.bin 文件并通过无线方式发送。 在这种情况下、闪存区域可以高达0x1F000、但工具链构建的映像仅消耗0x9000字节。 在这种情况下、我不想放置0x9000以外的任何内容来节省通过无线发送的图像的空间和复杂性。 这就是为什么我尝试使用 GROUP 指令将所有内容按顺序放置在较低的闪存地址中的原因。

     顺序要求不是必需的、但我希望避免在 SNV 扇区(不是发送 OTA 的映像的一部分)之外的任何地方使用 HIGH 指令。

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

    我不能为你的情况找到一个好的解决办法。  关于...

    第
    {
    .text
    .const
    .constdata
    rodata
    .EMB_TEXT
    .pinit
    .cinit
    }> FLASH、END (flashEndAddr) 

    这会按照该顺序将所有这些段置于闪存中、并分配用于 flashEndAddr 的最高地址。  这比您需要的限制要严格一些。  但我认为值得一试。

    但是、如果这会导致出现其他问题、我不会感到惊讶。  如果不使用 GROUP、您可以捕获闪存中的最高地址、那就更好了。  我在 SDOWP 系统中提交了 CodeGen-2377、以在链接器中请求该功能。  欢迎您在我的签名中使用下面的 SDOWP 链接进行访问。

    谢谢、此致、

    乔治