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文件无法对应上,也无法正常运行。
这里需要提供一些技术支持来帮我解决一下这个问题。