您好,多出来的区域是 .bss 段的内容。多出这部分的原因如下:
ARM® Compiler armclang Reference Guide
__attribute__((section("name"))) variable attribute
The section attribute specifies that a variable must be placed in a particular data section.
Normally, the ARM compiler places the data it generates in sections like .data and .bss. However, you
might require additional data sections or you might want a variable to appear in a special section, for
example, to map to special hardware.
If you use the section attribute, read-only variables are placed in RO data sections, writable variables
are placed in RW data sections.
If the section name starts with .bss., the variable is placed in a ZI section.
ref:Arm document
根据 armclang 的要求,自定义的 .bss 段名称需要以 .bss 开头。否则会认为该段是 .data 段,而其他的编译器中没有对应的限制。
MCAL的代码中,定义的段名称类似于.mcal_data,.mcal_bss,不能满足KEIL中的限制,所以都会识别为 data 段。而在对应的 scf 文件中,是通过类似如下代码固定其位置的:
LR_RAM_0 0x1fff8400
{
...
mcal_bss_region_start +0 EMPTY 0
{
}
mcal_bss_region +0 NOCOMPRESS
{
*(.mcal_bss)
}
mcal_bss_region_end +0 EMPTY 0
{
}
...
}
ScatterAssert(ImageLength(LR_RAM_0) <= 0xF800)
所以这一段 .bss 会被识别成 .data 段的数据,并存放到 load addr 0x1fff8400。
实际上这部分区域并不会影响程序的实际运行,因为 .bss 段 symbol 的地址是正确的。如果您不想要这部分代码的区域,您可以这样操作:
替换工程下的 .bss 段名称:
.mcal_bss -> .bss.mcal_bss
.mcal_bss_no_cacheable -> .bss.mcal_bss_no_cacheable
在配置工具中 Lock 住 Platform。
经过上述操作后,生成的代码段中就没有多余的区域了。