2017-08-08 26 views
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,留下一个空白位置,我可以放置字符串常量?

回答

0

一种方式做到这一点,是创建一个部分,然后使用该源代码,像堆叠在该示例[1]:

char stack[10000] __attribute__ ((section ("STACK"))) = { 0 };

[1] https://gcc.gnu.org/onlinedocs/gcc-3.3/gcc/Variable-Attributes.html

+0

创建部分并放置一个变量不是问题,我们已经在其他一些项目中做了这个。 问题是将此部分放在.text部分,告诉链接器自动链接.text围绕本节。 通过在const字符串前手动放置一些.o-files .text部分并在调用ROM部分中的*(.text)之前调用 KEEP(*(。identification))来解决此问题。 不是最优雅的方式,因为第一个.text可能会改变,让我现在检查地图文件,然后确保我不浪费太多的ROM。 为了更高雅的方式解决这个问题,我仍然很高兴 – viper1209

+0

哦,现在我明白了。我过去实际上遇到了同样的问题,但找不到一个好的解决方案。 – domen

相关问题