我有一个用例,我想在FLASH的末尾为用户数据保留Flash的可配置区域。如果代码段与“用户数据”区域重叠,则链接程序将不会产生错误(或至少发出警告)。 这是我在链接描述文件中定义的内容:
MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 160K
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 512K
}
SECTIONS
{
.text :
{
*(.text)
*(.text*)
*(.glue_7)
*(.glue_7t)
*(.eh_frame)
KEEP (*(.init))
KEEP (*(.fini))
_etext = .;
} >FLASH
/* Reserved FLASH area for user data (r/w data in Flash) */
__flash_data_size__ = DEFINED(FLASH_DATA_SIZE) ? FLASH_DATA_SIZE : 0K;
.flash_data ORIGIN(FLASH) + LENGTH(FLASH) - __flash_data_size__ (NOLOAD) :
{
. = ALIGN(2048);
__flash_data_start__ = .;
. = . + __flash_data_size__;
__flash_data_end__ = .;
} >FLASH
}
当我定义符号FLASH_DATA_SIZE时,我可以看到elf文件按预期在Flash的末尾包含一个NOLOAD节。但是,如果该部分与代码部分(.text)重叠,则不会出现任何链接器错误。 知道链接器为什么不抱怨吗?
或者有其他任何想法,我如何才能为用户数据保留Flash的“编译时”可配置部分,以防止代码部分重叠?
预先感谢, 托马斯
答案 0 :(得分:0)
我设法找到了一个可行的解决方案,并提供了重叠部分所需要的错误。我通过创建另一个具有可配置大小的MEMORY区域来解决了该问题。对于那些对解决方案感兴趣的人,我在下面提供了它:
_FLASH_SIZE = 512K;
_FLASH_DATA_SIZE = (DEFINED(FLASH_DATA_SIZE) ? FLASH_DATA_SIZE : 0K);
MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 160K
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = _FLASH_SIZE - _FLASH_DATA_SIZE
FLASH_DATA (rw) : ORIGIN = 0x08000000 + _FLASH_SIZE - _FLASH_DATA_SIZE, LENGTH = _FLASH_DATA_SIZE
}
SECTIONS
{
.text :
{
*(.text)
*(.text*)
*(.glue_7)
*(.glue_7t)
*(.eh_frame)
KEEP (*(.init))
KEEP (*(.fini))
_etext = .;
} >FLASH
.flash_data (NOLOAD) :
{
. = ALIGN(2048);
__flash_data_start__ = .;
. = . + _FLASH_DATA_SIZE;
__flash_data_end__ = .;
} >FLASH_DATA
}