Arm Keil生成的十六进制文件末尾放置了什么

Arm Keil生成的十六进制文件末尾放置了什么,arm,stm32,keil,Arm,Stm32,Keil,我发现了一个我无法回答的问题。我在程序所在的部分后放置了一个3字节的表: const uint8 AppVersion[] __attribute__((at(0x08006E00))) = {1,1,3); Keil生成的十六进制数是表加上额外数据: 然而,在不使用上述表格的情况下,我在十六进制末尾得到了相同的“额外”数据(364字节): 你能告诉我申请表的末尾是什么吗?我在.map文件中没有找到任何线索 谢谢! Paweł您必须查看.map文件以查看它在那里放置了什么。但它可以是您的代

我发现了一个我无法回答的问题。我在程序所在的部分后放置了一个3字节的表:

const uint8 AppVersion[] __attribute__((at(0x08006E00))) = {1,1,3);
Keil生成的十六进制数是表加上额外数据:

然而,在不使用上述表格的情况下,我在十六进制末尾得到了相同的“额外”数据(364字节):

你能告诉我申请表的末尾是什么吗?我在.map文件中没有找到任何线索

谢谢!
Paweł

您必须查看
.map
文件以查看它在那里放置了什么。但它可以是您的代码,也可以是一个库。您使用的是绝对地址,而不是对“图像结尾”的相对引用

相反,使用自定义链接将该表显式链接到图像的末尾

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
    }
}
我不知道您的目标布局,请自行调整数字。
有一次,在一个阳光明媚的日子,我写了一封信读地图文件。也许对你的keil版本有效

更新:
您已经共享了.sct文件(链接器文件)

ROM区域LR_IROM1的范围从
0x08000000
0x08007FFF

因此
0x08006E00
不是图像的结尾
,允许链接器在静态链接对象
AppVersion
之后放置任何内容(.ANY)


如果您不想这样做,请明确告诉链接器仅为您的
版本
对象创建一个区域,如上例所示。

Drogi Kolego Pawle-a dlaczego Cięto tak niepokoi。(我问过帕维尔他担心什么)。十六进制文件中的内容有什么不同吗?我认为实际加载的内容是important@PeterJ,我只是好奇。我想知道为什么事情会发生。这里的问题并不意味着担心。您已经查看了.map文件了吗?谢谢您的回复!正如我所说,.map文件中没有任何信息(最后一节提到的是0x08006E00处的3个字节)。很抱歉回复得太晚。我试过使用MapViewer,但它给我的印象与读取.map文件一样。除了内存末尾的3个字节(.ARM.uu at_0x08006E00,大小为3,是一个节,AppVersionE位于同一地址,大小与数据大小相同。)@PawełJ你能共享.sct文件吗?给你:LR_IROM1 0x080000000x0000800{;加载区域大小\u region ER_irom10x080000000x0000800{;加载地址=执行地址*.o(重置,+First)*(在根$$节中).ANY(+RO)}RW_IRAM1 0x200000000 0x00001000{;RW数据.ANY(+RW+ZI)}
LR_IROM1 0x08000000 0x00008000 {
    ER_IROM1 0x08000000 0x00008000 { 
        *.o (RESET, +First) *(InRoot$$Sections) 
        .ANY (+RO) 
    } 
    RW_IRAM1 0x20000000 0x00001000 
    { 
        .ANY (+RW +ZI) 
    } 
}