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.

[参考译文] TMS320F280025C:编译后若要生成.bin 文件、大小太大

Guru**** 2419530 points
Other Parts Discussed in Thread: TMS320F280025C, TMS320F280049C, C2000WARE, CC1100

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1113498/tms320f280025c-post-build-to-generate-bin-file-the-size-is-too-big

器件型号:TMS320F280025C
主题中讨论的其他器件: TMS320F280049CC2000WARE

器件型号 TMS320F280025C

我现在已将器件从 TMS320F280049C 更改为 TMS320F280025C、但生成的*。bin 文件大小存在问题。 TMS320F280049C 的*。bin 文件大小为69KB、但我使用了相同的过程、使用 su 为 TMS320F280025C 生成的新*。bin 文件大小为1040KB。
我已将 C2000ware 工具从 C2000ware_3_04_00_00更改为2000ware_4_01_00_00、所有其他工具均未更改。

新的*。bin 文件中有很多00s。 我搜索并获得了以下链接、但这没有解决我的问题。 请提供帮助。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1068860/tms320f28335-ccs-generates-binary-output-in-too-large-size?tisearch=e2e-sitesearch&keymatch=.bin%2525252525252520file#

 

编译后、我使用: "${CCE_INSTALL_ROOT}/utils/tiobj2bin/tiobj2bin""${BuildArtifactFileName}""${BuildArtifactFileBaseName}.bin""${CG_TOOL_ROOT}/fid2000""${CG_TOOL_ROOT"}/hexobbin

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

    尊敬的 John:

    输出文件中是否存在类似的差异、输出文件的大小是否相同?

    谢谢、此致、

    桑托什

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

    您好、Santosh、

    是的,输出文件的大小几乎相同。 以下是相关信息:

    280025.  
    BIN 文件大小为1040KB;从地址0 ~ 0x000F168F 全部为00、地址0x000F1690 ~ 0x00103F6C 为数据、即75996B、约为74KB
    输出文件大小为364KB
    十六进制文件大小为71KB

    280049的 bin 文件大小为68KB;地址0x0 ~ 0x00010F4F 的数据为69455B、约为67KB;  
    输出文件大小为358KB
    十六进制文件大小为61KB
    谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    John、

    我正在联系主题专家来研究这一点。 请在一天内回复。

    谢谢、此致、

    桑托什

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

    请附加   TMS320F280025C 构建中的映射文件。  因此论坛将接受它、并将文件扩展名.txt 添加到它。

    谢谢、此致、

    乔治

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

    尊敬的乔治:

    感谢您查看我的问题。 附件是包含.txt 文件的映射文件。

    Qifenge2e.ti.com/.../DS3_5F00_280025_5F00_20220629_5F00_Rev1_5F00_V5_5F00_T34R22.txt

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

    John、

    乔治今天外出,但明天返回时将作答。

    此致、

    John

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

    有关一般背景、请参阅文章 二进制文件简介。  重点讨论孔洞的发生方式以及可以采取哪些措施来避免它们。

    在本例中、.cinit 段的末尾.text.2段的开头之间存在0x6a4字的间隙。  您可能可以通过更改链接器命令文件来避免此漏洞。  有关该文件的一般背景信息、请参阅文章 链接器命令文件入门。  需要考虑的一个变化... 将闪存的三个存储器范围折叠为一个存储器范围。

    请告诉我这些建议是否能解决问题。

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的乔治:
    感谢您的回复。 主要问题不是"段 .cinit 末 尾与段 .text.2开头之间存在0x6a4字的间隙。"。  主要问题是9652002 的地址0x0 ~ 0x000F168F 的空洞, 这些地址的所有数据都是00。 附件是文件。 请帮助我了解这些空穴是如何产生的。 如果此问题得到解决、则几个孔不是大问题。
    bin 文件具有以下地址/数据:
    地址0 ~ 0x000F168F,带00,大约为965KB --这些00s 来自哪里?
    地址0x000F1690 ~ 0x00103F6B 实数数据、74KB
     
    谢谢
    John
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="377851" URL"~μ C/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1113498/tms320f280025c-post-build-to-genere-bin-file-the-size-ise-to-big/4133740#4133740"] 引用的主要问题是0x8F000F ~的地址

    我不明白这是怎么发生的。   

    [引用 userid="377851" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1113498/tms320f280025c-post-build-to-genere-bin-file-the-size-ise-to-big/4133740#4133740"]附件是文件[引用]。

    我看不到任何附件。  此外、如果我有二进制文件、那将不会大有帮助。  相反、请提交由链接器创建的.out 文件。  请将 其压缩、然后将该 zip 文件附加到您的下一个帖子中。

    谢谢、此致、

    乔治

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

    尊敬的乔治:

    280025是否可能出现问题? 我们使用的 cmd 文件几乎与280049相同、280049不存在此问题。

    谢谢

    John

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

    尊敬的乔治:

    很抱歉、我无法从此处发送我的输出文件。

    谢谢

    John

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

    e2e.ti.com/.../DS3_5F00_testcase.zipHi

    我根据您的请求附上了输出文件。

    谢谢

    John

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

    感谢您提交由链接器创建的.out 文件。

    您似乎在 tiobj2bin 中发现了一个新错误。  分析未完成。  但我基本上肯定了这一点。  我会再来的。

    谢谢、此致、

    乔治

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

    尊敬的乔治:

    感谢您的消息、今天是否有更新?

    谢谢

    John

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

    很抱歉、这需要很长时间。  我希望明天能回来。

    谢谢、此致、

    乔治

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

    我可以确认 tiobj2bin 中存在错误。  如果系统是为 EABI 构建的 C28x、并且至少有一个段具有不同的加载和运行地址、则可能会错误计算此类段的加载地址、这最终导致二进制文件出错。  在您的特定情况下、二进制文件以大量字节开头、值为0。  这只是问题本身的一种表现方式。

    本文的其余部分介绍了一种解决方法。  这是不方便的、但不可避免。

    使用 hex2000实用程序创建二进制文件。  为此、必须使用映像模式、这意味着必须在命令文件中提供 ROMS 指令。  此 ROMS 指令告诉 hex2000可执行.out 文件(由链接器创建)的存储器范围以转换为二进制文件。 此存储器范围是所有初始化段(如.text.const)所在的位置。  所有未初始化的段(如.stack.bss)都将被忽略。  

    用伪代码表示,这就是 ROMS 指令看起来的样子...

    ROMS{
      all_mem:O =最低初始化地址、l =最高初始化地址-最低初始化地址

    获取这些初始化地址有两种方法。

    我描述的第一种方法是从链接器命令文件的 MEMORY 指令中获取这些地址。  这种方法的优点是它更可靠。  随着版本的变化、您无需修改 ROMS 指令。  这种方法的缺点是二进制文件的时间将长于严格必要的时间。  它将以不需要的一定数量的零字节结束。   

    我描述的第二种方法是从链接器生成的映射文件中获取这些地址。  这种方法的优点是生成的二进制文件完全符合需要、不再是。  缺点是您需要在构建更改时随时更改 ROMS 指令。   

    第一道...

    我没有您的链接器命令文件、但我有这些行来自您的链接器映射文件、它们具有相同的信息。

      BEGIN                 00083020   00000002  00000002  00000000  RWIX
      FLASH_BANK0_SEC1_2_3_ 00083040   00003fc0  00003911  000006af  RWIX
      FLASH_BANK0_SEC7_8_9_ 00087000   00005000  00005000  00000000  RWIX
      FLASH_BANK0_SEC11_12_ 0008c000   00004000  0000048e  00003b72  RWIX

    这些都是包含已初始化段的存储器范围。  以下是前三列的内容。

    • 存储器范围的名称
    • 起始地址
    • 长度

    根据您计算的结果:

    • 最低初始化地址= 0x00083020
    • 最高初始化地址= 0x0008c000+0x00004000 = 0x00090000
    • 对于长度、减去这两个值:0x00090000 - 0x00083020 = 0x0000cfe0

    这些地址都是以16位字为单位的。  在 C28x 上、每个地址对应一个16位字、而不是一个8位字节。  然而、在 hex2000的二进制模式中、地址以8位字节的形式计数。  因此、我们必须将这些值乘以2。  将其全部整合在一起、然后它就会形成该 ROMS 指令。

    ROMS {
       all_mem: o = 0x106040, l = 0x19fc0
    }

    要创建二进制文件,请发出类似于...的命令。

    hex2000 -q -b -image -o binary_file.bin roms_directive_file.txt final_execute_file.out

    第二条路...

    从映射文件获取段的地址。  浏览名为 部分分配映射的映射文件部分。  忽略任何标记为未初始化DSECT 或长度为0的段。  在您的特定情况下,以下是地址最低的一个...

    codestart 
    *          0    00083020    00000002     

    第二个到最后一个数字是地址、最后一个数字是长度。

    这是地址最高的一个...

    .const     0    0008c000    0000048e     

    计算方法与第一种方法相同、但最高初始化段的长度会发生变化。

    • 最低初始化地址= 0x00083020
    • 最高初始化地址= 0x0008c000+0x0000048e = 0x0008c48e
    • 对于长度、减去这两个值:0x0008c48e - 0x00083020 = 0x0000946e

    请记住将 ROMS 指令的值乘以2 ...

    ROMS {
       all_mem: o = 0x106040, l = 0x128dc
    }

    hex2000命令与以前相同。

    谢谢、此致、

    乔治

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

    尊敬的乔治:

    非常感谢您花时间找到问题并提出解决建议。 但我对 TI DSP 系统较新。 我不知道如何使用 ROMS{}、我应该将这些 ROMS 放在哪里{}? 我尝试执行以下步骤:

    1.生成一个 txt 文件:roms_directive_file.txt,如下所示:
    ROMS{
    all_mem:O = 0x106040、l = 0x19fc0

    2.修改编译\编译后处理步骤


    "${CCE_INSTALL_ROOT}/utils/tiobj2bin/tiobj2bin""${BuildArtifactFileName}""${BuildArtifactFileBaseName}.bin""${CG_TOOL_ROOT}/bin/ofd2000""${CG_TOOL_ROOTK/hex4intrues/hexobj4bin"}/hexobtid/hex4bin

    至"${CCE_INSTALL_ROOT}/utils/tiobj2bin/tiobj2bin""${BuildArtiftFileName}""${BuildArtifactFileBaseName}.bin""${CG_TOOL_ROOT}/bin/ofd2000""${CG_TOOL_BINM/hex4ms"

    我收到以下消息:

    构建次要目标:"ds3_testcase.bin"
    调用:C2000十六进制实用程序
    "C:/ti/ccs1100/ccs/tools/compiler/ti-cgt-C2000-21.6.0.ls/bin/hex2000"-memwidth=16 --romwidth=16 --diag_wrap=off --binary -o "DS3_testcase.bin""DS3_testcase.out"
    正在转换为二进制格式...
    "ds3_testcase.out" codestart => codestart
    "ds3_testcase.out".TI.ramfunc =>.TI.ramfunc
    "ds3_testcase.out".text.1 =>.text.1
    "ds3_testcase.out".cinit =>.cinit
    "ds3_testcase.out".text.2 =>.text.2
    "ds3_testcase.out".const =>.const
    已完成构建次要目标:"ds3_testcase.bin"

    "c:/ti/ccs1100/ccs/utils/tiobj2bin/tiobj2bin""ds3_testcase.out""ds3_testcase.bin""C:/ti/ccs1100/Ccs/tools/compiler/ti-cgt-C2000-21.6.0.sps/bin/hexd2000""ccs_tools/ti_ccs_1100/tools/hexobti201.6/ti/c2000-in/ccs/ti/ti/cctids/ti_in/ti/cc2bin/tids/tirom/cc1100/tids/tids/tids/in/cc2in/ti/ti/cctids/tids/tids/in/cc2bin/tids/tids/in/ccs/tids/in
    C:/ti/ccs1100/Ccs/utils/tiobj2bin/mkhex4bin 发生故障。 放弃。

    "ROM_directive.txt"不能识别为内部或外部命令、
    可操作的程序或批处理文件。

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

    那么、如何使用 ROMS{}、以及在何处放置 ROMS_direction.txt?

    谢谢

    John

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

     尊敬的乔治:

    在周末阅读 TI 文档后、我找到了有关 ROMS{}的信息、现在可以使用了。 问题现已解决。

    非常感谢!

    John