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.

[参考译文] TMS570LC4357:ARM 十六进制实用程序会生成 BIN 文件内容不一致问题

Guru**** 2394015 points
Other Parts Discussed in Thread: UNIFLASH

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1415620/tms570lc4357-arm-hex-utility-generates-bin-file-content-misalignment-issue

器件型号:TMS570LC4357
主题中讨论的其他器件:UNIFLASH

工具与软件:

编译器版本为 TI v20.2.7.LTS。

将.out 文件输出到.bin 文件后、当我使用 UniFlash 将.bin 文件烧录到芯片时、固件无法正常工作。

开始分析 bin 文件的内容:

ArmHex 工具会为 bin 文件输出以下相关参数:

--fill=0xFF --map="xxx.map" --romwidth=32 --diag_wrap=off --binary -o "xxx.bin" "xxx.out"

添加输出 mapflie 以分析 bin 文件组合。

然后、使用 UniFlash 工具将.out 文件刻录到芯片中、导出闪存内容并另存为 a.bin 文件。 使用文件比较工具比较两个文件:

此处两个文件之间第一个差异的地址为0x003b304、而差异内容如下图所示:

在上图中、可从闪存导出的 bin 文件的内容位于左侧、由 ArmHex 工具生成的 bin 文件的内容位于右侧。

将 the.bin 映射文件与.out 映射文件进行比较。

==================================================================================
.out mapfile:

SEGMENT ALLOCATION MAP

run origin  load origin   length   init length attrs members
----------  ----------- ---------- ----------- ----- -------
00000000    00000000    0003b304   0003b304    r-x
  00000000    00000000    00000020   00000020    r-x .intvecs
  00000020    00000020    00000100   00000100    r-- section_image_header
  00000120    00000120    0003b1e4   0003b1e4    r-x .text
0003b320    0003b320    000027d4   000027d4    r--
  0003b320    0003b320    000027d4   000027d4    r-- .const
0003db00    0003db00    00000618   00000618    r--
  0003db00    0003db00    00000618   00000618    r-- __param
0003e120    0003e120    00000048   00000048    r--
  0003e120    0003e120    00000048   00000048    r-- clisection
0003e180    0003e180    000002b8   000002b8    r--
  0003e180    0003e180    000002b8   000002b8    r-- .cinit
08010000    08010000    0002c638   00000000    rw-
  08010000    08010000    0001a8c0   00000000    rw- .bss
  0802a8c0    0802a8c0    00009d76   00000000    rw- .data
  08034638    08034638    00008000   00000000    rw- .sysmem


==================================================================================
.bin mapfile:

OUTPUT TRANSLATION MAP
--------------------------------------------------------------------------------
00000000..ffffffff  Page=0  Memory Width=8  ROM Width=8
--------------------------------------------------------------------------------
   OUTPUT FILES: xxx.bin [b0..b7]

   CONTENTS: 00000000..0000001f   xxx.out(.intvecs)
             00000020..0000011f   xxx.out(section_image_header)
             00000120..0003b303   xxx.out(.text)
             0003b320..0003daf3   xxx.out(.const)
             0003db00..0003e117   xxx.out(__param)
             0003e120..0003e167   xxx.out(clisection)
             0003e180..0003e437   xxx.out(.cinit)

从两个映射文件中、您都可以看到.text 字段的地址为0x00000120到0x0003b303、以下.const 字段的地址为0x0003b320到0x0003daf3。

两个映射文件的描述是相同的、这意味着地址范围0x0003b304到0x0003b31应该用0xFF 或其他无用数据填充。

但是、在实际的 bin 文件内容中、可以发现 ArmHex 文件生成的 bin 文件中.const 字段的内容会连续写入地址0x0003b304、从而导致所有后续内容产生地址错位。

因此、ArmHex 生成的 bin 文件无法单独与映射文件输出对应、也无法正常运行。

需要提供一些技术支持来帮助解决这个问题。

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

     

    通常、我将通过以下方法生成 bin 文件:

    我将在编译后步骤中添加以下命令:

    "${CCS_INSTALL_ROOT}/utils/tiobj2bin/tiobj2bin "${BuildArtifactFileName}""${BuildArtifactFileBaseName}.bin""${CG_TOOL_ROOT}/bin/armofd "${CG_TOOL_ROOT}/bin/armhex "${CCS_INSTALL_ROOT}/utils/tiobj2bin/mkhex4bin

    之后、如果我们生成代码、则可以在调试文件夹中找到生成的.bin 文件、如下所示。

    现在、我使用 Uniflash 将该二进制文件编程到控制器中。

    我多次使用这种方法、但我从未看到任何问题、您能用这种方法进行测试并查看行为吗?

    ——
    谢谢、此致、
    Jagadish。

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

    你好、 jagadish gundavarapu、

    使用上述方法、我生成的 bin 文件可以正常工作。 非常感谢!

    顺便说一下、这里有一些测试结果、我一直在尝试通过不同的方法生成可用的 bin 文件。 在测试过程中、ArmHexUtility 生成的十六进制文件是正确的、因为十六进制文件本身描述了数据的地址。 通过 IntelHex 工具将 Hex 文件转换为输出 bin 文件也是正确的。 但我对这种方法仍然感觉有点不好。