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.

[参考译文] TM4C1294NCZAD:更改链接器命令文件中的段链接顺序。

Guru**** 2811015 points

Other Parts Discussed in Thread: TM4C1294NCZAD

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1109064/tm4c1294nczad-changing-sections-link-order-in-linker-command-file

器件型号:TM4C1294NCZAD

我们的设置:

编译器: TI ARM 编译器 v20.2.6.LTS。

CCS 版本:11.2.

MCU:    TM4C1294NCZAD

电路板:   EK-TM4C129-XL

链接器会根据大小(首先放置最大的段、依此类推)将段放置在存储器中、而不是按照链接器命令文件中指定的顺序放置段。

链接器命令文件如下所示:

存储器

   闪存(RX):origin = 0x00000000,length = 0x00100000
   SRAM (rwx):origin = 0x20000000,length = 0x00040000


--heap_size=0x10000
--stack_size=0x800


/*内存中的段分配*/

部分

   .intvecs  :> 0x00000000
   .text    :  > FLASH
   .const :  > FLASH
   .cinit   :  >闪存
   .pinit   :  > FLASH
   init_array:> FLASH

   .vtable  :>0x20000000
   .data   :  > SRAM
   .bss    :  > SRAM
   .sysmem  :> SRAM
   .stack :  > SRAM (高)


/*定义栈顶将由初始化例程使用*/
__STACK_TOP =__STACK +__STACK_SIZE;

映射文件中的输出如下所示:

段分配映射

运行 origin load origin  length  init length atts members
------  ------ ------ ------ ---- ----

20000000   20000000   00010678  00000000   Rw-
 20000000   20000000   0000026c  00000000   rw-.vtable
 20000270   20000270   00010000  00000000   rw-.sysmem
 20010270   20010270   0000021f  00000000   rw-.data
 20010490   20010490   000001e8  00000000   rw-.bss
2003f800   2003f800   00000800  00000000   rw-
 2003f800   2003f800   00000800  00000000   rw-.stack

正如我们看到的、最大段.sysmem 在.data 和.bss 段之前分配。

我们希望段的分配顺序与链接器命令文件的定义顺序相同。

此致

水平

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

    Lal、

    我们的编译器专家将于本周晚些时候结束。

    本文档中有一节"存储器范围中的第一个输出节"、介绍了如何确保特定部分首先出现。

    https://software-dl.ti.com/ccs/esd/documents/sdto_cgt_Linker-Command-File-Primer.html

    但是、链接器可以按任何顺序分配其余段。

    相反、您可以尝试使用"Group"指令。  在同一文档中搜索"将输出段分组在一起"。

    此致、

    John

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

    尊敬的 John:

    感谢您的提示重播。

    即使我们对.data 和.bss 段进行分组、.sysmem 仍是最大的段。

    这里的想法是定义存储器布局、以便.sysmem 占用分配所有其他段后保留的所有 RAM、然后将.stack 放置在 RAM 的末尾、以便.stack 和.sysmem 相互增长。

    我们之前使用的是 ARM-GCC、这些段始终按照链接器命令文件中列出的方式放置、因此 TI-ARM 编译器的行为对我们来说有点奇怪。

    此致

    水平

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="137214" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1109064/tm4c1294nczad-changing-sections-link-order-ine-linker-command-file/4110708#4110708"]即使是.mem 段和.msbss 段、也是最大的数据段。]

    组 不会更改段的大小。  但它可以帮助您控制订单。

    GROUP : > SRAM
        {
            .vtable
            .data
            .bss
            .sysmem
        }
    .stack  :   > SRAM (HIGH)

    我们的编译器专家明天将回来、并可提供进一步的帮助。

    此致、

    John

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

    您好、Lal、

    通过介绍、我叫 Todd Snider。 我是 TI Arm Clang 编译器工具团队的成员、具有处理链接器的经验。

    John 建议、 SECTIONS 规范中的 GROUP 规范将允许您在 GROUP 分配给的存储器区域内订购输出段。 GROUP 中指定的输出段将按顺序连续分配。

    关于您要求链接器按照段在链接器命令文件中的显示顺序分配段的请求...我们在链接器中有一个用于此功能/行为的待处理增强请求工作项,我们强烈建议在下一个主要版本(3.x.0.LTS)中使用该功能/行为。 它仍处于规划阶段)。 如果链接器要实现所请求的功能/行为,则需要考虑一些复杂问题...

    如何处理进入同一存储器区域的不同类型的放置指令?

    某些类型的放置指令比其他指令更受约束。 例如、如果在分配到 SRAM 存储器区域中的特定地址之前指定了对 SRAM 的常规分配、则链接器需要在处理常规放置之前遵守特定的地址放置。

    部分{

      General_SCN:{*(.data)}> SRAM

      spert化_scn:  {a.o (.scn_a)}> 0x2000   //其中0x2000在 SRAM 存储器范围内*/

    还有其他类型的放置指令 可能没有那么严格、例如"拆分"放置(例如 "SPLIT_SCN:{*(.scn)}>> SRAM"-允许将"SPLIT_SCN"分段(在输入段边界上拆分)分配给 SRAM、以可能填补一个分配段和另一个分配段之间的可用间隙)或"一个"放置(例如 "oneof _scn:{*(.scn)}> SRAM | EMEMEMEMEMEM"-在 SRAM 或 EMEM 中全部分配"oneof _scn"。

    我们最终可以实施的是一种放置指令与另一种放置指令的优先级之间的差异、但对于具有同等优先级放置指令的段、例如:

    部分{

      A_scn:{*(.A_scn)}> SRAM

      B_SCN:{*(.b_scn)}> SRAM

    链接器可以按照它们在链接器命令文件中的显示顺序来分配它们、而不管它们的相对大小如何。

    希望这对您有所帮助。

    此致、

    Todd Snider

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

    您好 Todd、

    感谢您花时间详细回答问题。

    我浏览了编译器文档并阅读了您提到的选项。

    实际上、我们还有一个自定义段"FAST_CODE"、该段从闪存加载并从 RAM 运行(请参阅吹扫)、编译器不允许将此段与从闪存加载和运行的段进行分组。

       .Fast_Code:
       {
          。 =对齐(4);
          *(FAST_CODE)            /* FAST_CODE 段*/
          。 =对齐(4);
       } 加载=闪存、运行= SRAM、
         load_start (_FastCode_LoadStart)、load_end (_FastCode_LoadEnd)、
         RUN_START (_FastCode_RunStart)

    另一方面、如果我们将从 RAM 运行和加载的所有其他段分组、则首先分配最大的内存块、最后分配非常小的 FAST_CODE

    我们要定义存储器布局、以便:

    1. sysmem 和.stack 应占用较高的存储器范围。
    2. 在分配所有其他段后、.sysmem 和.stack 应占用所有剩余的 RAM。
    3. 将.stack 放置在 RAM 的末尾、以便在程序执行期间、.stack 和.sysmem 相互增长。

    因此、我认为(目前)这只能通过手动分离 RAM 并根据需要放置段来完成。

    此致

    水平

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="137214" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1109064/tm4c1294nczad-changed-rams-link-order-ine-linker-command-file/4110708#4110mes"]引用.msstack 的内容、然后将这些内容放在.mem 后面、以定义.mem 和 sysmem 的所有其他段、从而在.stack。]

    不确定是否有用、但 Compiler/DK-TM4C129X:有什么方法可以最大化堆大小? 是使用 TI ARM 编译器的示例、其中.sysmem 的定义方式使用了所有剩余的 SRAM。

    引用的示例不允许.stack 和.sysmem 相互增长、但如果堆覆盖了堆栈所用的内容、这可能会导致程序失败。