我有一个 STM32F427 的十六进制文件,它是使用具有连续内存地址的 GCC(gcc-arm-none-eabi) 4.6 版构建的。我编写了用于加载该 hex 文件的引导加载程序,还添加了校验和功能,以在启动应用程序之前确保 Hex 文件正确。十六进制文件的片段:
:10 05C8 0018460AF02FFE07F5A64202F1D00207F5F9 :10 05D8 008E4303F1A803104640F6C821C2F2000179 :10 05E8 001A460BF053F907F5A64303F1D003184652 :10 05F8 000BF068F907F5A64303F1E80340F6FC1091 :10 0608 00C2F2000019463BF087FF07F5A64303F145 :10 0618 00E80318464FF47A710EF092FC07F5A643EA :10 0628 0003F1E80318460EF03DFC034607F5A64221 :10 0638 0002F1E0021046194601F0F2FC07F56A5390
如您所见,所有地址都是连续的。然后我们将编译器更改为 4.8 版本,我得到了相同类型的 Hex 文件。
但是现在我们使用了 6.2 版本的编译器,生成的 Hex 文件不是连续的。有点像这样:
:10016000B9BC0C08B9BC0C08B9BC0C08B9BC0C086B
:10017000B9BC0C08B9BC0C08B9BC0C08B9BC0C085B
:08018000B9BC0C08B9BC0C0865
:1001900081F0004102E000BF83F0004330B54FEA38
:1001A00041044FEA430594EA050F08BF90EA020FA5
正如您在 0188 之后看到的那样,它从 0190 开始意味着其余 8 个字节(0189 到 018F)是 0xFF,因为它们没有被刷新。
现在引导加载程序有点愚蠢,我们只传递起始地址和字节数来计算校验和。
有没有办法像编译器 4.6 和编译器 4.8 一样以连续的方式制作 hex 文件?代码在所有三个时间都是相同的。