1
我需要在STM32F4的.text节中的特定地址上放置一个常量字符串。这是我记忆中应该是什么样子:在.text段中的特定地址上放置字符串
0x08000000 - 0x08007FFF reserved for bootloader
0x08008000 - 0x08012FFF .text (part1)
0x08013000 - 0x0801303F String constant (64 bytes reserved)
0x08013040 - (end of flash) .text (part2)
LD脚本,这样当前定义:
MEMORY
{
ROM (rx) : ORIGIN = 0x08008000, LENGTH = 512K
RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 128K
}
_IDENTIFICATION_START = 0x8013000;
SECTIONS
{
.text :
{
KEEP(*(.isr_vector))
*(.text*)
/* < init, ctors, dtors & rodata truncated for readability> */
} > ROM
.identification _IDENTIFICATION_START :
{
KEEP(*(.identification)) ;
}
/* < truncated for readability> */
}
,但得到的重叠警告。 我尝试这样做:
MEMORY
{
ROM1 (rx) : ORIGIN = 0x08008000, LENGTH = 0xB000
ROM2 (rx) : ORIGIN = 0x08013080, LENGTH = 512K
RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 128K
}
_IDENTIFICATION_START = 0x8013000;
_FWADDRESS_START = 0x8013020;
SECTIONS
{
.text :
{
KEEP(*(.isr_vector))
*(.text*)
} > ROM1
.text :
{
*(.text*)
/* < init, ctors, dtors & rodata truncated for readability> */
} > ROM2
.identification _IDENTIFICATION_START :
{
KEEP(*(.identification)) ;
}
/* < truncated for readability> */
}
现在它完全忽略了区域ROM1,把一切都在ROM2,但我还需要在代码0x08008000开始,因为那是引导程序跳转到地址。
是否有人知道如何分离.text,留下一个空白位置,我可以放置字符串常量?
创建部分并放置一个变量不是问题,我们已经在其他一些项目中做了这个。 问题是将此部分放在.text部分,告诉链接器自动链接.text围绕本节。 通过在const字符串前手动放置一些.o-files .text部分并在调用ROM部分中的*(.text)之前调用 KEEP(*(。identification))来解决此问题。 不是最优雅的方式,因为第一个.text可能会改变,让我现在检查地图文件,然后确保我不浪费太多的ROM。 为了更高雅的方式解决这个问题,我仍然很高兴 – viper1209
哦,现在我明白了。我过去实际上遇到了同样的问题,但找不到一个好的解决方案。 – domen