1. 初始化栈顶指针SP
定义 Stack_Size 为 1KB
汇编一个数据段 名称是 STACK,不要初始化,读写,8Bytes对齐
SPACE分配一个(Stack_Size)1KB的空间
__initial_sp表示栈顶指针
__heap_base是堆的基地址,__heap_limit是堆的顶部
PRESERVE8为当前文件的堆 和 栈按照8字节对齐
使用THUMB指令集
; Vector Table Mapped to Address 0 at Reset
AREA RESET, DATA, READONLY
EXPORT __Vectors
EXPORT __Vectors_End
EXPORT __Vectors_Size
EXPORT为全局变量的意思
AREA表示以下的空间,RESET 是空间名,DATA , READONLY是属性,详情参考MDK中的ARM Development Tools
2. 初始化程序指针,指向复位程序
; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT SystemInit
IMPORT __main
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
IMPORT指外部的变量
3. 初始化中断向量表(存放的中断的地址)
4. 配置系统时钟
5. 调用main()函数
当中断向量表中的函数,在外部没有实现时,就会使用内部的函数,而这个内部的函数只会进入无限循环
;*******************************************************************************
; User Stack and Heap initialization
;*******************************************************************************
IF :DEF:__MICROLIB
EXPORT __initial_sp
EXPORT __heap_base
EXPORT __heap_limit
ELSE
IMPORT __use_two_region_memory
EXPORT __user_initial_stackheap
__user_initial_stackheap
LDR R0, = Heap_Mem
LDR R1, =(Stack_Mem + Stack_Size)
LDR R2, = (Heap_Mem + Heap_Size)
LDR R3, = Stack_Mem
BX LR
ALIGN
ENDIF
END
R0 到 R3存放堆 和 栈 的起始地址和结束地址