我正在编写一个程序来运行裸机。我正在尝试从自定义链接描述文件中获取变量以在C中使用,这是我尝试过的。
从C:
extern unsigned long* __START_OF_PROG_MEMORY;
volatile unsigned long *StartOfProgram = (unsigned long*) (&__START_OF_PROG_MEMORY);
Run Code Online (Sandbox Code Playgroud)
链接描述文件:
SECTIONS
{
. = 0x80000;
PROVIDE(__START_OF_PROG_MEMORY = .);
.text : { KEEP(*(.text.boot)) *(.text .text.* .gnu.linkonce.t*) }
.rodata : { *(.rodata .rodata.* .gnu.linkonce.r*) }
PROVIDE(_data = .);
.data : { *(.data .data.* .gnu.linkonce.d*) }
.bss (NOLOAD) : {
. = ALIGN(16);
__bss_start = .;
*(.bss .bss.*)
*(COMMON)
__bss_end = .;
}
_end = .;
PROVIDE(__END_OF_PROG_MEMORY = .);
/DISCARD/ : { *(.comment) *(.gnu*) *(.note*) *(.eh_frame*) }
} …Run Code Online (Sandbox Code Playgroud) 从任何自动生成的STM32CubeMx生成的链接器脚本的底部:
/* Remove information from the standard libraries */
/DISCARD/ :
{
libc.a ( * )
libm.a ( * )
libgcc.a ( * )
}
Run Code Online (Sandbox Code Playgroud)
从GNU Binutils ld(链接程序脚本)手册中,3.6.7输出节丢弃:
特殊输出节名称“ / DISCARD /”可用于丢弃输入节。分配给名为“ / DISCARD /”的输出节的任何输入节均不包含在输出文件中。
这3个输入目标文件包含什么,为什么我们丢弃它们中的所有内容(所有输入部分)?
我正在使用GCC。我在Flash中通过.ld链接器文件创建了一个SECTION,我在其中放置了一些数据(704字节),并带有指令__attribute__((section...
Data似乎在Flash中,但是如果我const在声明数据时不使用关键字,则会在RAM中分配相同的空间。
如果我不使用constRAM,则不会使用-但我注意到增加了对Flash的使用,因为它被分配了两次!
链接器文件:
FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 14K
USER_DATA_FLASH (rx) : ORIGIN = 0x8003800, LENGTH = 2K
}
SECTIONS
{ /* placing my named section at given address: */
.my_block 0x8003800 :
{
KEEP(*(.UserDataSector))
} > USER_DATA_FLASH
}
Run Code Online (Sandbox Code Playgroud)
数组声明具有初始化程序:
mytab_type __attribute__((section (".UserDataSector "))) progr16[16]=
{
{ {LIST1,LIST2....
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我没有使用const。假设这progr16被强制放在闪存中,并且如果在调试过程中我使用内存浏览器检查的话,它看起来确实在那里。但它似乎也占用RAM
FLASH RAM
text data bss dec
9268 772 1948 11988
Run Code Online (Sandbox Code Playgroud)
如果我添加const关键字:
FLASH RAM
text data bss …Run Code Online (Sandbox Code Playgroud)