什么放在Keil生成的hex文件的末尾

时间:2017-05-16 13:21:33

标签: arm stm32 keil

我发现了一个我无法回答的问题。我在我的程序所在的部分之后放置了一个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文件中找到任何线索。

谢谢! 帕维尔

1 个答案:

答案 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对象创建一个区域,如上例所示。