STM32F103ZETx_FLASH.ld 解析
STM32F103ZETx_FLASH.ld 是一个链接脚本文件,用于描述 STM32F103ZETx 微控制器的内存布局和链接过程。
/*
******************************************************************************
**** File : LinkerScript.ld
**
** Author : Auto-generated by System Workbench for STM32
**
** Abstract : Linker script for STM32F103ZETx series
** 512Kbytes FLASH and 64Kbytes RAM
**
** Set heap size, stack size and stack location according
** to application requirements.
**
** Set memory bank area and size if external memory is used.
**
** Target : STMicroelectronics STM32
**
** Distribution: The file is distributed “as is,” without any warranty
** of any kind.
**
*****************************************************************************
** @attention
**
** <h2><center>© COPYRIGHT(c) 2019 STMicroelectronics</center></h2>
**
** Redistribution and use in source and binary forms, with or without modification,
** are permitted provided that the following conditions are met:
** 1. Redistributions of source code must retain the above copyright notice,
** this list of conditions and the following disclaimer.
** 2. Redistributions in binary form must reproduce the above copyright notice,
** this list of conditions and the following disclaimer in the documentation
** and/or other materials provided with the distribution.
** 3. Neither the name of STMicroelectronics nor the names of its contributors
** may be used to endorse or promote products derived from this software
** without specific prior written permission.
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
**
*****************************************************************************
*//* Entry Point */
ENTRY(Reset_Handler)/* Highest address of the user mode stack */
_estack = 0x20010000; /* end of RAM */
/* Generate a link error if heap and stack don't fit into RAM */
_Min_Heap_Size = 0x200; /* required amount of heap */
_Min_Stack_Size = 0x400; /* required amount of stack *//* Specify the memory areas */
MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K
FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 512K
}/* Define output sections */
SECTIONS
{/* The startup code goes first into FLASH */.isr_vector :{. = ALIGN(4);KEEP(*(.isr_vector)) /* Startup code */. = ALIGN(4);} >FLASH/* The program code and other data goes into FLASH */.text :{. = ALIGN(4);*(.text) /* .text sections (code) */*(.text*) /* .text* sections (code) */*(.glue_7) /* glue arm to thumb code */*(.glue_7t) /* glue thumb to arm code */*(.eh_frame)KEEP (*(.init))KEEP (*(.fini)). = ALIGN(4);_etext = .; /* define a global symbols at end of code */} >FLASH/* Constant data goes into FLASH */.rodata :{. = ALIGN(4);*(.rodata) /* .rodata sections (constants, strings, etc.) */*(.rodata*) /* .rodata* sections (constants, strings, etc.) */. = ALIGN(4);} >FLASH.ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH.ARM : {__exidx_start = .;*(.ARM.exidx*)__exidx_end = .;} >FLASH.preinit_array :{PROVIDE_HIDDEN (__preinit_array_start = .);KEEP (*(.preinit_array*))PROVIDE_HIDDEN (__preinit_array_end = .);} >FLASH.init_array :{PROVIDE_HIDDEN (__init_array_start = .);KEEP (*(SORT(.init_array.*)))KEEP (*(.init_array*))PROVIDE_HIDDEN (__init_array_end = .);} >FLASH.fini_array :{PROVIDE_HIDDEN (__fini_array_start = .);KEEP (*(SORT(.fini_array.*)))KEEP (*(.fini_array*))PROVIDE_HIDDEN (__fini_array_end = .);} >FLASH/* used by the startup to initialize data */_sidata = LOADADDR(.data);/* Initialized data sections goes into RAM, load LMA copy after code */.data : {. = ALIGN(4);_sdata = .; /* create a global symbol at data start */*(.data) /* .data sections */*(.data*) /* .data* sections */. = ALIGN(4);_edata = .; /* define a global symbol at data end */} >RAM AT> FLASH/* Uninitialized data section */. = ALIGN(4);.bss :{/* This is used by the startup in order to initialize the .bss secion */_sbss = .; /* define a global symbol at bss start */__bss_start__ = _sbss;*(.bss)*(.bss*)*(COMMON). = ALIGN(4);_ebss = .; /* define a global symbol at bss end */__bss_end__ = _ebss;} >RAM/* User_heap_stack section, used to check that there is enough RAM left */._user_heap_stack :{. = ALIGN(8);PROVIDE ( end = . );PROVIDE ( _end = . );. = . + _Min_Heap_Size;. = . + _Min_Stack_Size;. = ALIGN(8);} >RAM/* Remove information from the standard libraries *//DISCARD/ :{libc.a ( * )libm.a ( * )libgcc.a ( * )}.ARM.attributes 0 : { *(.ARM.attributes) }
}
Entry Point
ENTRY(Reset_Handler)
ENTRY(Reset_Handler)
定义了程序的入口点。当微控制器启动时,它将首先调用Reset_Handler
函数。
堆栈地址
_estack = 0x20010000; /* end of RAM */
_estack
变量定义了用户模式堆栈的最高地址,即 RAM 的末尾。
_Min_Heap_Size = 0x200; /* required amount of heap */
_Min_Stack_Size = 0x400; /* required amount of stack */
_Min_Heap_Size
和_Min_Stack_Size
定义了堆和栈所需的最小大小。
内存区域
MEMORY
{RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64KFLASH (rx) : ORIGIN = 0x8000000, LENGTH = 512K
}
MEMORY
语句定义了两种内存区域:RAM 和 FLASH。- RAM (随机存取存储器) 用于临时存储数据,起始地址为
0x20000000
,长度为 64KB。 - FLASH (闪存) 用于存储程序代码和常量数据,起始地址为
0x8000000
,长度为 512KB。
- RAM (随机存取存储器) 用于临时存储数据,起始地址为
输出段
SECTIONS
{/* ... 其他段定义 ... */
}
SECTIONS
语句定义了链接器应该创建的输出段。
中断向量表
.isr_vector :
{. = ALIGN(4);KEEP(*(.isr_vector)) /* Startup code */. = ALIGN(4);
} >FLASH
.isr_vector
段用于存储中断向量表,其中包含中断服务例程的地址。
程序代码和数据
.text :
{/* ... 程序代码和数据段定义 ... */
} >FLASH
.text
段包含程序代码和只读数据。
常量数据
.rodata :
{/* ... 常量数据段定义 ... */
} >FLASH
.rodata
段包含只读数据,如字符串和常量。
初始化数组
.preinit_array :
{/* ... 初始化数组段定义 ... */
} >FLASH
.preinit_array
、.init_array
和.fini_array
段包含程序初始化和终止的函数。
数据段
.data :
{/* ... 数据段定义 ... */
} >RAM AT> FLASH
.data
段包含初始化数据,这些数据在程序启动时从 FLASH 复制到 RAM。
未初始化数据段
.bss :
{/* ... 未初始化数据段定义 ... */
} >RAM
.bss
段包含未初始化的数据,这些数据在程序启动时初始化为零。
用户堆栈
._user_heap_stack :
{/* ... 用户堆栈段定义 ... */
} >RAM
._user_heap_stack
段定义了用户堆栈的大小。
废弃信息
/DISCARD/ :
{/* ... 废弃信息段定义 ... */
}
/DISCARD/
段用于删除标准库中的信息。
ARM 属性
.ARM.attributes 0 : { *(.ARM.attributes) }
.ARM.attributes
段包含 ARM 特定的属性信息。