我在设置gcc的section属性时遇到问题,无法定义变量应该驻留在特定的内存部分而不是默认值。
我使用了手臂皮层m3 LPC1759。我从LPCXpresso IDE获得了链接文件,但我没有使用它,我有自己的makefile。链接文件位于:
memory definition file这是前一个文件中包含的LPCmem.ld文件。
我强制将freertos堆变量放在自定义部分中,如下所示:
static unsigned char ucHeap[ configTOTAL_HEAP_SIZE ] __attribute__((section(".data_RAM2")));
对象文件的链接没有错误,但变量没有放在正确的内存位置,我可以用nm命令检查:
...
10000028 d ucHeap
10002028 d uxCriticalNesting
...
我尝试将该部分更改为其他不存在的部分,只是为了检查链接器是否验证了名称,显然它没有。
答案 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
。