TMS570LC4357: Arm Hex Utility 生成的bin文件内容错位问题

Part Number: TMS570LC4357
Other Parts Discussed in Thread: UNIFLASH

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

我这里使用.out文件输出到.bin文件后,bin文件使用UniFlash烧录到芯片上之后,固件无法正常工作。

开始尝试分析bin文件内容:

ArmHex工具输出bin文件部分相关的参数配置如下:

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

添加输出map用于分析bin文件组成。

然后使用UniFlash工具将.out文件烧录至芯片,再将flash上内容导出并保存成.bin文件。通过文件对比工具比对两个文件差异:

我这里两个文件产生的第一个差异的地址是 0x003b304,差异内容如下图所示:

上图中左侧为flash内导出的能够正常运行的bin文件内容,右侧为通过ArmHex工具生成的bin文件内容。

结合上面的现象对比.bin的map文件和.out的map文件。

==================================================================================
.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)

从两个map文件都可以看出  .text 字段所占地址是 0x00000120~0x0003b303 , 后面的 .const字段所占地址为 0x0003b320~0x0003daf3。

两个map文件描述的内容是一致的,意味着地址 0x0003b304~0x0003b31 这个区间应由0xFF或其他无用数据填充。

但是实际bin文件内容里可以发现,由ArmHex文件生成的bin文件里 .const这个字段的内容被连续的写在了0x0003b304这个地址上,导致了后续所有内容产生了地址上的错位。

所以实际使用ArmHex生成的bin文件与自己输出的map文件无法对应上,也无法正常运行。

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