Keil生成的hex文件末尾放什么
What is placed at the end of hex file generated by Keil
我发现了一个我无法回答的问题。我在程序所在的部分之后放置了 3 个字节的 table:
const uint8 AppVersion[] __attribute__((at(0x08006E00))) = {1,1,3);
我在 Keil 生成的十六进制中得到的是 table 加上额外的数据:
End of hex file after data added at arbitrary address.
虽然没有使用上述 table,但我在十六进制末尾得到了相同的“额外”数据(364 字节):
End of hex file normally.
你能告诉我应用程序末尾的内容是什么吗?我在 .map 文件中没有找到任何线索。
谢谢!
帕维尔
您必须查看 .map
文件以了解它放在那里的内容。但它可以是您的代码或库。您使用的是绝对地址,而不是对 "end of image".
的相对引用
相反,使用自定义 linker file 到 显式 link 即 table 到图像的末尾。
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 文件(linker 文件)。
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
不是图像的结尾 并且 linker 可以在静态 linked 之后放置任何内容 (.ANY)对象 AppVersion
.
如果您不想这样,请明确告诉 linker 只为您的 version
对象创建一个区域,如上例所示。
我发现了一个我无法回答的问题。我在程序所在的部分之后放置了 3 个字节的 table:
const uint8 AppVersion[] __attribute__((at(0x08006E00))) = {1,1,3);
我在 Keil 生成的十六进制中得到的是 table 加上额外的数据: End of hex file after data added at arbitrary address.
虽然没有使用上述 table,但我在十六进制末尾得到了相同的“额外”数据(364 字节): End of hex file normally.
你能告诉我应用程序末尾的内容是什么吗?我在 .map 文件中没有找到任何线索。
谢谢! 帕维尔
您必须查看 .map
文件以了解它放在那里的内容。但它可以是您的代码或库。您使用的是绝对地址,而不是对 "end of image".
相反,使用自定义 linker file 到 显式 link 即 table 到图像的末尾。
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 文件(linker 文件)。
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
不是图像的结尾 并且 linker 可以在静态 linked 之后放置任何内容 (.ANY)对象 AppVersion
.
如果您不想这样,请明确告诉 linker 只为您的 version
对象创建一个区域,如上例所示。