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 跨越 0x080000000x08007FFF
因此 0x08006E00 不是图像的结尾 并且 linker 可以在静态 linked 之后放置任何内容 (.ANY)对象 AppVersion.

如果您不想这样,请明确告诉 linker 只为您的 version 对象创建一个区域,如上例所示。