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.

[参考译文] ARM-CGT:十六进制实用程序生成缺少段的输出文件

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1531680/arm-cgt-hex-utility-generates-output-file-with-missing-sections

器件型号:ARM-CGT

工具/软件:

我正在尝试构建代码并指示链接器将 CMSIS_DSP 代码和常量定位在闪存存储器的特殊保留位置。 在启用了十六进制实用程序的情况下构建代码时、project.map 文件看起来正确、但 project.hex 文件缺少与 DSP 库关联的.text 和.const 段。

Linker.cmd 文件似乎可以使用链接器、但 Hex Utility 不行。 我猜我的 Linker.cmd 文件语法并不完全正确。 十六进制实用程序“警告:重复的段名“是一条线索。 如有任何帮助、我们将不胜感激。

我复制了 Linker.cmd 文件的编辑片段和下面的构建控制台输出:

移动数据

  boot_vectors   (RX):origin = 0x00000000、length = 0x00000200
  主要              (Rx):origin = 0x00003200、length = 0x000FCE00
  MUF_VECTORS     (Rx):origin = 0x00100000、length = 0x00000100
  模型            (Rx):origin = 0x00100100、length = 0x000FFF00
  信息              (Rx):origin = 0x00200000、length = 0x00008000

  别名
  {
  SRAM_CODE     (RWX):origin = 0x01000000
  SRAM_DATA     (RW):origin = 0x20000000
  }长度= 0x00040000


很重要

  .intvecs:  > boot_vectors

  .text  :  > main
  .text  :  >型号
  {
    --- library=DSP_CMSIS580_CM4F.lib (.text)
  }

  .const  :  > main
  .const  :  > model
  {
    --- library=DSP_CMSIS580_CM4f.lib (.const)
  }

  .emuf_vect  :       > MUF_VECTORS
   .cinit  :  > main
  .pinit  :  > main
  .binit  :  {}> main
  .data  :  > sram_data
  .bss  :  > sram_data
  .sysmem  :  > sram_data
  .stack  :  > sram_data(高)

  /*信息闪存用于以下器件特定用途:   */
  .flashMailbox  :> 0x00200000  /*用于设备安全操作的闪存邮箱         */
  .tlvTable     :>0x00201000  /* TLV 表、用于设备识别和表征  */
  .bslArea     :>0x00202000  /*器件 TI 引导加载程序的 BSL 区域           */

  .TI.ramfunc  :  {}load=main、run=sram_code、table (BINIT)
}

调用:ARM Hex 实用程序
“c:/ti/ccs1210/ccs/tools/compiler/ti-cgt-arm_18.12.8.LTS/bin/armhex --memwidth=8 --romwidth=8 --diag_swrap=off --intel -o “eCBM_V45_Muf.hex""eCBM_V45_Muf.out"“"eCBM_V45_Muf.out"</s>“ “  
正在转换为 Intel 格式...
  “eCBM_V45_MUF.out".intvecs“.intvecs ==>.intvecs
  “eCBM_V45_MUF.out".text“.text =>.text
  “eCBM_V45_MUF.out".TI.ramfunc“.TI.ramfunc =>.TI.ramfunc
  “eCBM_V45_MUF.out".const“.const =>.const
  “eCBM_V45_MUF.out".cinit“.cinit =>.cinit
  “eCBM_V45_MUF.out".binit“.binit ==>.binit
  “eCBM_V45_MUF.out".emuf_vect“.emuf_vect =>.emuf_vect
  “eCBM_V45_MUF.OUT".MODELCODE“.MODELCODE =>.MODELCODE
  “eCBM_V45_MUF.OUT".MODELDATA“.MODELDATA =>.MODELDATA
已完成二级目标的构建:“eCBM_V45_MUF.hex"</s>“
 
警告:重复的段名 eCBM_V45_MUF.out (.text)(忽略)
警告:重复的段名称 eCBM_V45_muf.out (.const)(忽略)

****构建完成****

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

    我认为有两个问题。

    1. 尝试创建.text 输出段两次。 只能创建一次。

    2.链接器脚本是按顺序应用的,因此下面的第 1 行“捕获“包括您的库代码在内的所有代码 (.text ) 并放入 main。 到达第 2 行时、没有剩余的.text 可分配、因此它为空。

    我认为:

        .text    :    > MAIN
        .text    :    > MODEL
        {
            --library=DSP_CMSIS580_CM4F.lib (.text)
        }

    应为:

        .any_out_section_name_you_want_to_use : > MODEL
        {
            --library=DSP_CMSIS580_CM4F.lib (.text)
        }
        .text    :    > MAIN

    这样、库代码将进入模型、任何其他代码将进入 main。

    对于.const、请使用相同的命令。

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

    Kier 的回复是正确的。  谢谢!  我可以增加一些颜色。

     链接器命令文件入门一文 介绍了许多详细信息。

    我几乎确定第二个 .text .const 段为空(长度为零)。  查找链接器映射文件。

    谢谢。此致、

    -乔治

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

    感谢 Kier 和 George 的快速响应。

    重复的.text 和.const 似乎是有问题的。 但是、请参考我的 project.map 文件(下面的截断片段)。 我不能确定第二个.text 和.const 是空的。 链接器似乎会将我的 DSP_CMSIS 数据暂停到我保留的闪存空间(模型)中、并且似乎不介意双段引用。 我认为警告来自 ARM 十六进制实用程序(它不喜欢双精度引用)。 正是 project.hex 文件缺少了 DSP_CMSIS .text 和.const 段。 IHex 记录中存在一些间隙、其中 CMSIS 代码和常量应该是这些间隙。

    我将尝试使用 建议的“.any_out_section_name_you_wange_to_use"基“基尔。 我刚刚认为您必须为编译 CMSIS 库时原本会使用的可执行代码使用“sandard".text“.text 段名称。 我还阅读了 spnu118u 汇编/链接器工具文档。 这是一种无用的,没有提供任何洞察如何实现我的目标。 它假定每个人都只想收集一堆段并将它们推入单个内存位置。 我想拆分部分并将它们推入两个不同的内存位置。 我还将查看您提到的入门。

    再次感谢、

    Jim Eno

    .text   0  00003200  00010070    
             00003200  00000c98       StateMac.obj (.text:StateMachine)
             00003e98  00000a4e       rtsv7M4_T_le_v4SPD16_eabi.lib:_printfi.c.obj (.text:_TI_printfi)
             000048e6  00000002       BootIntVectRed.obj (.text:defaultISR)

    .text   0 001e0788    0000c2ec    
             001e0788  0000a184.       DSP_CMSIS580_CM4F.lib:TransformFunctions.obj (.text)
             001ea90c  00000fc8           : BasicMathFunctions.obj (.text )
             001eb8d4  00000920           : ComplexMathFunctions.obj (.text )
             001ec1f4  00000880            : FastMathFunctions.obj (.text )

    .const   0  00013310  00000698    
             00013310  00000101   rtsv7M4_T_le_v4SPD16_eabi.lib:ctype.c.obj (.const:.string:_ctypes_)
             00013411  000000e7   WirelessHandler.obj (.const:.string:dataset)
             000134f8  000000c8   rtsv7M4_T_le_v4SPD16_eabi.lib:strtod.c.obj (.const:$O1$$)

    .const   0  00100100 000e0688      
             00100100  00010000   DSP_CMSIS580_CM4f.lib:CommonTables.obj (.const:WeightsQ31_8192)
             00110100  00010000               : CommonTables.obj (.const:Weights_8192)
             00120100  00010000               : CommonTables.obj (.const:twiddleCoefF64_4096)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我刚想您必须将'standard'.text 段名称用于编译 CMSIS 库时会使用的可执行代码。

    有输入段和输出段。 用户(通常)必须对输入段使用.text、因为对这一点几乎没有控制权、但可以 根据需要为输出段命名。 这只是一个将一组输入段分组的名义标签、但必须是唯一的。  似乎这种非唯一性会导致十六进制程序跳过其中一个输出段。

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

    Kier、

    对我来说是一个很好的时刻。 阅读文献时、不清楚输出段的名称是任意的、正如您在下面指出的。 不管怎样、它是有效的。 我已验证 project.hex 文件现在包含缺少的 CMSIS 段、没有警告。 您是一名专业人士。

      .any_out_section_name_you_wange_to_use:> model
      {
        --- library=DSP_CMSIS580_CM4F.lib (.text)
      }

    非常感谢、

    Jim Eno