使用特定的内存部分内存来链接变量

时间:2014-07-30 14:07:09

标签: gcc linker arm

我在设置gcc的section属性时遇到问题,无法定义变量应该驻留在特定的内存部分而不是默认值。

我使用了手臂皮层m3 LPC1759。我从LPCXpresso IDE获得了链接文件,但我没有使用它,我有自己的makefile。链接文件位于:

generic link file

memory definition file这是前一个文件中包含的LPCmem.ld文件。

我强制将freertos堆变量放在自定义部分中,如下所示:

static unsigned char ucHeap[ configTOTAL_HEAP_SIZE ] __attribute__((section(".data_RAM2")));

对象文件的链接没有错误,但变量没有放在正确的内存位置,我可以用nm命令检查:

...
10000028 d ucHeap
10002028 d uxCriticalNesting
...

我尝试将该部分更改为其他不存在的部分,只是为了检查链接器是否验证了名称,显然它没有。

1 个答案:

答案 0 :(得分:1)

TL; DR - 您只是错过了美元符号

您将该部分命名为错误。链接器文件的相关部分是

/* DATA section for SRAM0 */
.data_RAM2 : ALIGN(4)
{
   FILL(0xff)
   *(.ramfunc.$RAM2)
   *(.ramfunc.$SRAM0)
    *(.data.$RAM2*)
    *(.data.$SRAM0*)
    /* *(.data_RAM2);   You need this, without a code change, */
    /*                  but it will still match data. */
   . = ALIGN(4) ;
} > SRAM0 AT>FLASH

/* Main DATA section (SRAM) */
.data : ALIGN(4)
{
   FILL(0xff)
   _data = . ;
   *(vtable)
   *(.ramfunc*)
   *(.data*)     /* Otherwise, this matches your section. */
   . = ALIGN(4) ;
   _edata = . ;
} > SRAM AT>FLASH

目前,ucHeap中有.data_RAM2。链接器文件使用.data.$RAM2*,但这不匹配。 *是一张外卡。因此,*(.data*)将与您当前拥有的代码相匹配。我不知道你是否有问题,

 static unsigned char ucHeap[ configTOTAL_HEAP_SIZE ] 
    __attribute__((section(".data_$RAM2")));

这似乎适用于我的gcc版本。您只是错过了美元符号。 请参阅gnu ld documentation,特别是input sections。表格是,  存档目标文件输入部分 ... );您可以在哪里使用通配符,如果愿意,可以省略存档:。通配符是有限的 reg-ex 形式。如果您愿意,可以提供许多输入部分;例如,*(.text* .rodata*)会将.text.rodata放在同一个对象中。其中,*(.text*); *(.rodata*);会将所有.text与所有目标文件保持在一起,然后放置.rodata