6-STM32链接文件各部分解析

第一部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/* Entry Point */
ENTRY(Reset_Handler)

/* Highest address of the user mode stack */
_estack = 0x20010000; /* end of "RAM" Ram type memory【1】-0x2000ffff */

_Min_Heap_Size = 0x200 ; /* required amount of heap */
_Min_Stack_Size = 0x400 ; /* required amount of stack */


MCU_SECTORSIZE =2048;

MCU_FLASH_ADDR_START = 0x8000000; /*STM32L432RC的FLASH起始地址*/
GEC_USER_SECTOR_START =0; /* 26=USER程序开始扇区号,0=自启动【2】-26 */
GEC_USER_SECTOR_END =127; /*USER程序结束扇区号 */
GEC_USER_RAM_START =0x20000000; /*USER RAM区域起始地址 【3】-0x20002000*/
GEC_USER_RAM_END =0x20010000; /*USER RAM区域结束地址 */

ENTRY(Reset_Handler)

—–指定入口地址

_estack = 0x20010000

—–指定RAM的结束地址(起始地址为0x20000000,说明RAM区大小为64K)

_Min_Heap_Size = 0x200

—–指定堆的大小为512B

_Min_Stack_Size = 0x400

—–指定栈的大小为1KB

MCU_SECTORSIZE =2048

—–指定扇区大小

MCU_FLASH_ADDR_START = 0x8000000

—–指定Flash起始地址

GEC_USER_SECTOR_START =0

—–指定用户区起始扇区号

GEC_USER_SECTOR_END =127

—–指定用户区结束扇区号

GEC_USER_RAM_START =0x20000000

—–指定用户RAM开始地址

GEC_USER_RAM_END =0x20010000

—–指定用户RAM结束地址

第二部分

1
2
3
4
5
6
7
8
9
10
11
12
MEMORY
{
/*USER程序放置处。*/
USER_INTVEC(rx) : ORIGIN =MCU_FLASH_ADDR_START + MCU_SECTORSIZE * GEC_USER_SECTOR_START , LENGTH = MCU_SECTORSIZE

FLASH (rx) : ORIGIN = MCU_FLASH_ADDR_START + MCU_SECTORSIZE * (GEC_USER_SECTOR_START + 1) , LENGTH = MCU_SECTORSIZE * (GEC_USER_SECTOR_END - GEC_USER_SECTOR_START )


/*USER的RAM空间。*/
/* RAM (rwx) : ORIGIN = GEC_USER_RAM_START , LENGTH = GEC_USER_RAM_END - GEC_USER_RAM_START */
RAM (rwx) : ORIGIN = GEC_USER_RAM_START + 0x188, LENGTH = GEC_USER_RAM_END - GEC_USER_RAM_START - 0x188 /*【4】*/
}

MEMORY给出了地址的划分

这里的名字USER_INTVEC,FLASH,USER指的是一段地址,ORIGIN是起始地址,LENGTH是该段地址的长度。仔细观察可以发现,在下一部分SECTIONS中每段结束后会有 >USER_INTVEC,>FLASH,>USER,这个意思是将程序的各个内容放在USER_INTVEC,FLASH,USER所指的地址中。

第三部分

1
2
3
4
5
6
7
8
9
10
SECTIONS
{
/* The startup code into "FLASH" Rom type memory */
.isr_vector :
{
. = ALIGN(8);
KEEP(*(.isr_vector)) /* Startup code */
. = ALIGN(8);
} >USER_INTVEC
}

SECTIONS实际上指定了程序的各个内容该如何放置在FLASH或者RAM中。

. = ALIGN(8);

—– .表示当前地址,. = ALIGN(8)表示从当前地址开始后面的存储进行8字节对齐

KEEP(*(.isr_vector))

—– KEEP防止所有.isr_vector段被过滤掉,防止被优化

>USER_INTVEC

—– 将.isr_vector段的内容放置在USER_INTVEC中

一般的程序中包含常见的几个段:

text(存放程序)

rodata(存放被初始化的数据)

data(表示初始化不为0的变量)

bss(表示初始化值为默认的全局变量)

text,rodata放在flash中,data中的初始化值作为rodata放在flash中

变量在ram中占有空间,bss占ram空间

1
2
3
4
5
6
7
8
9
10
11
.malloc :
{
. = ALIGN(4);
__MALLOC_SYMBOLS = .; /* create a global symbol at ccmram start */
*(.malloc)
*(.malloc*)

. = ALIGN(4);
__EMALLOC_SYMBOLS = .; /* create a global symbol at ccmram end */
} >MALLOC AT> FLASH
/*结尾跳过*/

段可以自定义,如上面写的malloc段,由于编译obj过程中不会生成用户自定义的段,因此在源码中需要指定需要特殊处理的段

结尾的>MALLOC指上面花括号内的内容都放在第二部分中定义的MALLOC空间中。如果没有AT> FLASH,那么编译bin文件时地址是连续的