程序代码(.s 和 .c)源文件会经过预编译、编译、汇编、链接最后生成目标可执行文件,.ld文件是作用在链接过程。
链接的作用是:
生成可执行文件。
linker_flash.ld:Flash和SRAM内存分配,为Flash构建目标分配代码段和数据段;
linker_ram.ld:SRAM内存分配,为RAM构建目标分配代码段和数据段。
ENTRY命令:运行一个程序时第一个被执行到的指令的"入口点"。
MEMORY命令:内存块配置命令,一个连接脚本最多一个’MEMORY’命令。
SECTIONS命令:’段’命令,段中又包含多个’节’, SECTIONS命令告诉连接器如何把输入节映射到输出节, 如何把输入节放入到内存中。
KEEP()命令:防止垃圾收集机制把这个节排除在外,同时保证向量表在段中的位置处于最顶端。
ALTGN命令:以多少位对齐,例如ALTGN(4)表示以4位对齐。
*:‘’是一个通配符,可以与所有文件名匹配。例如表达式(.text)表示所有输入文件的.text输入段。
按照常用关键词去解析.ld文件内容即可。
__attribute__ ((at (0x10000000))) uint32_t value = 0x01;
会出现此警告:
__attribute__ ((section (".SectionName"))) uint32_t value=0x01;
因此需要自定义一个节用来存放变量或函数。
__attribute__ ((section (".standby_ram_data"))) uint32_t value=0x01;
编译后.map文件:
编译后.map文件:
在linker_flash.ld文件中将int_sram拆分出一段并命名为standby_sram:
在sections{}中编写新的节
编译后在.map文件中能够看到自定义的节:
在main.c文件中定义变量:
uint32_t value0 = 0x01; uint32_t value1 = 0x02; uint32_t zero0 = 0; uint32_t zero1 = 1;
将初始值不为‘0’的变量放入‘standby_ram_data’节,初始值为‘0’的变量放入‘standby_ram_bss’节。
编译后.map文件:
在maun.c文件中定义函数:
int fun0(void) { return (0U); } int fun1(void) { return (0U); }
将‘main()’、‘fun0()’、‘fun1()’放入‘abcd’节。
编译后.map文件: