1.startup_stm32f10x_hd.s文件简要说明
详见:https://blog.csdn.net/qwe15954250805/article/details/78185793
1.初始化栈指针和堆
/*;Amount of memory (in bytes) allocated for Stack
; Tailor this value to your application needs
; <h> Stack Configuration
; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>*/
Stack_Size EQU 0x00000400
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
/*
; <h> Heap Configuration
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
*/
Heap_Size EQU 0x00000200
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit
PRESERVE8
THUMB
2.向量表(略)
3.初始化中断向量表、时钟,调用C库的main进入C
// Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
IMPORT SystemInit
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
首先调用SystemInit,其次跳转_main。
Reset_Handler是系统上电后自动跳转至该处,然后开始执行其后的相关代码,其中_main并非C中的main函数,而是C库函数,其会初始化栈、堆,配置系统环境,在函数的最后调用用户编写的main函数,进入C的世界。
4.用户堆栈设置
/*******************************************************************************
; 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
2.相关TIPS
$Sub$$main:定义的新功能函数.在main()函数之前添加一段新的程序代码,如初始化硬件函数。
$Super$$main:直接跳转到main()函数。