STM32 之 启动文件详细解析(V3.5.0)
本帖最后由 zzh90513 于 2012-6-5 19:03 编辑
;* 文件名 : startup_stm32f10x_hd.s
;* 库版本 : V3.5.0
;* 说明: 此文件为 STM32F10x 高密度设备的 MDK 工具链的启动文
件
;* 该模块执行以下操作:
;* -设置初始堆栈指针(SP)
;* -设置初始程序计数器(PC)为复位向量,并在执行 main 函数前初始化系统
时钟
;* -设置向量表入口为异常事件的入口地址
;* -复位之后处理器为线程模式,优先级为特权级,堆栈设置为 MSP 主堆栈
;*
Stack_Size EQU 0x00000200;定义堆栈的大小
;AREA 命令指示汇编器汇编一个新的代码段或数据段。
;段是独立的、指定的、不可见的代码或数据块,它们由链接器处理.
;段是独立的、命名的、不可分割的代码或数据序列。一个代码段是生成一个应
用程序的最低要求
;默认情况下,ELF 段在四字节边界上对齐。expression 可以拥有 0 到 31 的
任何整数。
;段在 2expression 字节边界上对齐
AREA STACK, NOINIT, READWRITE, ALIGN=3;堆栈段,未初
始化,允许读写,8 字节边界对齐
; 说明: Cortex-M3 的指令地址要求是字边界对齐(4 字节);但是代码段是 8
字节边界对齐的
Stack_Mem SPACE Stack_Size ; 分 配 堆 栈 空 间 , 把 首 地 址 赋 给
Stack_Mem
__initial_sp ;初始化堆栈指针,指向堆栈顶.
; 此处有个一个问题讨论,关于栈顶在 RAM 中所处位置问题,很多初学者一直以
为是编译器特意放在 HEAP 段之后是有意为之,并且认为这样可以利用 heap 未分
配空间来防止未知的栈溢出问题
; 这种理解是错误的,链接器并不会为栈的位置做特殊的处理,而且这样做也并
不会利用 heap 段,在此文件的最后对堆栈的初始化代码中可以看出他们是两个
互相独立的数据区。此处出现的现
; 象是因为 MDK 按数据段的字母顺序链接数据段的地址的,所以此处造成了堆的