第一部分
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文件时地址是连续的