Gcc 使用特定内存段内存链接变量

Gcc 使用特定内存段内存链接变量,gcc,linker,arm,Gcc,Linker,Arm,我在设置gcc的section属性以定义变量应该驻留在特定内存节而不是默认内存节中时遇到了问题 我用的是手臂皮质m3 LPC1759。我从LPCXpresso IDE获得了链接文件,但我没有使用它,我有自己的makefile。链接文件包括: 通用链接文件 内存定义文件 上面是上一个文件包含的LPCmem.ld文件 我强制freertos heap变量位于自定义部分,如下所示: static unsigned char ucHeap[ configTOTAL_HEAP_SIZE ]

我在设置gcc的section属性以定义变量应该驻留在特定内存节而不是默认内存节中时遇到了问题

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

通用链接文件 内存定义文件 上面是上一个文件包含的LPCmem.ld文件

我强制freertos heap变量位于自定义部分,如下所示:

static unsigned char ucHeap[ configTOTAL_HEAP_SIZE ]
        __attribute__((section(".data_RAM2")));
对象文件的链接没有错误,但变量未放置在正确的内存位置,我如何使用nm命令进行检查:

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

我试图将该部分更改为不存在的其他部分,只是为了检查链接器是否验证了名称,显然它没有验证;博士-您只是错过了美元符号

您将该部分命名错误。链接器文件的相关部分包括:

/* 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
目前,您在
.data\u RAM2
中有
ucHeap
。链接器文件使用了
.data.$RAM2*
,但这将不匹配。
*
是通配符。因此,
*(.data*)
将与您当前拥有的代码相匹配。我不知道你是否对

 static unsigned char ucHeap[ configTOTAL_HEAP_SIZE ] 
    __attribute__((section(".data_$RAM2")));
这似乎适用于我的gcc版本。您只是错过了美元符号。 请参阅,特别是。表格是,,
归档:对象文件(输入部分…);您可以使用通配符,也可以省略存档:,如果您愿意的话。通配符是有限的注册表形式。你可以给许多输入部分,如果你喜欢;例如,
*(.text*.rodata*)
将同一对象中的
.text
.rodata
放在一起。其中,
*(.text*)*(.rodata*)
将保留所有对象文件中的所有
.text
,然后放置
.rodata

谢谢,使用
\uuuu属性((.data.RAM2)部分)
它工作正常。现在,是否可以在不更改代码的情况下使用RAM2:我的意思是,不使用属性节,链接器能够自动解决此问题?您可以使用链接器脚本将所有
.data
放在节中特定对象文件中。如果只想将源/对象/编译单元中的特定变量放入一个节中,那么
attribute
是正确的方法。
/* 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
 static unsigned char ucHeap[ configTOTAL_HEAP_SIZE ] 
    __attribute__((section(".data_$RAM2")));