我发现了一个我无法回答的问题。我在我的程序所在的部分之后放置了一个3个字节的表:
const uint8 AppVersion[] __attribute__((at(0x08006E00))) = {1,1,3);
我在Keil生成的十六进制中获得的是表格和额外数据: End of hex file after data added at arbitrary address
虽然不使用上述表格,但我在十六进制的末尾得到了相同的“额外”数据(364字节): End of hex file normally
你能告诉我申请结束时的内容吗?我没有在.map文件中找到任何线索。
谢谢! 帕维尔
答案 0 :(得分:0)
你必须查看.map
文件,看看它放在那里。但它可以是您的代码或库。您使用的是绝对地址,而不是“图像结束”的相对引用。
相反,请使用自定义linker file 明确将该表格链接到图片的末尾。
LR_IROM1 0x08000000 0x0007000 {
; Program ROM Area
ER_IROM1 0x08000000 (0x0007000-3) {
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
; Program SRAM Area
RW_IRAM1 0x20000000 0x00001000 {
.ANY (+RW +ZI)
}
; Version area
VERSION (0x08000000 + (0x0007000-3)) 0x3 {
version.o
}
}
我不知道您的目标布局,请自行调整数字。
在晴天,我写了little tool来阅读地图文件。也许它适用于您的keil版本?
<强>更新强>
您已共享.sct文件(链接器文件)。
LR_IROM1 0x08000000 0x00008000 {
ER_IROM1 0x08000000 0x00008000 {
*.o (RESET, +First) *(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM1 0x20000000 0x00001000
{
.ANY (+RW +ZI)
}
}
您的ROM区域LR_IROM1从0x08000000
跨越到0x08007FFF
因此0x08006E00
不是图像的结尾,并且允许链接器在静态链接的对象AppVersion
之后放置任何内容(.ANY)。
如果您不想这样,请明确告诉链接器仅为您的version
对象创建一个区域,如上例所示。