I have a Hex file for STM32F427 that was built using GCC(gcc-arm-none-eabi) version 4.6 that had contiguous memory addresses. I wrote boot loader for loading that hex file and also added checksum capability to make sure Hex file is correct before starting the application. Snippet of Hex file:
:1005C80018460AF02FFE07F5A64202F1D00207F5F9 :1005D8008E4303F1A803104640F6C821C2F2000179 :1005E8001A460BF053F907F5A64303F1D003184652 :1005F8000BF068F907F5A64303F1E80340F6FC1091 :10060800C2F2000019463BF087FF07F5A64303F145 :10061800E80318464FF47A710EF092FC07F5A643EA :1006280003F1E80318460EF03DFC034607F5A64221 :1006380002F1E0021046194601F0F2FC07F56A5390
As you can see all the addresses are sequential. Then we changed the compiler to version 4.8 and i got the same type of Hex file.
But now we used compiler version 6.2 and the Hex file generated is not contiguous. It is somewhat like this:
:10016000B9BC0C08B9BC0C08B9BC0C08B9BC0C086B
:10017000B9BC0C08B9BC0C08B9BC0C08B9BC0C085B
:08018000B9BC0C08B9BC0C0865
:1001900081F0004102E000BF83F0004330B54FEA38
:1001A00041044FEA430594EA050F08BF90EA020FA5
As you can see after 0188 it is starting at 0190 means rest of 8 bytes(0189 to 018F) are 0xFF as they are not flashed.
Now boot loader is kind of dumb where we just pass the starting address and no of bytes to calculate the checksum.
Is there a way to make hex file in contiguous way as compiler 4.6 and compiler 4.8? the code is same in all the three times.
5条答案
按热度按时间o3imoua41#
如果后处理十六进制文件是一个选项,你可以考虑使用IntelHex python库。记录类型、地址、校验和等)而不是作为行,将例如创建具有正确行校验和的输出。
一种快速启动和运行此功能的方法是使用捆绑的方便脚本hex2bin.py和bin2hex.py:
第一行将输入文件
noncontiguous.hex
转换为二进制文件,在没有数据的地方填充FF
。第二行将二进制文件转换回十六进制文件。结果将是
变成
正如您所看到的,在输入没有任何数据的地方添加了填充字节,等效于将输入文件写入设备,然后再将其读取出来。输入文件中的字节保持不变,并且位于相同的地址。校验和也是正确的,因为将长度字节从
0x08
更改为0x10
可以补偿额外的0xFF
字节。如果填充了其他内容,IntelHex将输出正确的校验和您可以通过以下管道跳过临时文件的创建:省略第一行中的
tmp.bin
,并在第二行中将其替换为-
:另一种方法是使用一个包含所有
FF
的基本文件,并使用hexmerge.py
方便脚本将gcc的输出与--overlap=replace
合并到该文件上更长、更灵活的方法是使用英特尔Hex API实现您自己的工具。我在类似您的情况下使用了这种方法,效果很好--调整十六进制文件以满足更改成本很高的工具,但只能以编写工具时的方式处理十六进制文件。
twh00eeo2#
多种可能方式之一:
foo.hex
。现在,
foo2.hex
将具有所有16字节的行注意:* 所有这些 * 都是FF填充到0x10字节。它不检查地址或其他任何东西。
说明
perl -pe '<some script>' <input file>
会针对<input file>
的每一行执行<some script>
,并打印结果。指令码为:xyhw6mcr3#
另一种解决方案是更改链接器脚本,以确保前面的.isr_vector部分以16字节对齐方式结束,因为Map文件显示后面的.text部分是16字节对齐方式。
bxfogqkk4#
您可以使用bincopy将0xff填入所有空白区域。
z9smfwbn5#
使用
objcopy
的-gap-fill
选项,例如: