启动文件的作用

1. 初始化栈顶指针SP
在这里插入图片描述
定义 Stack_Size 为 1KB
汇编一个数据段 名称是 STACK,不要初始化,读写,8Bytes对齐
SPACE分配一个(Stack_Size)1KB的空间
__initial_sp表示栈顶指针

启动文件的作用_第1张图片
__heap_base是堆的基地址,__heap_limit是堆的顶部

在这里插入图片描述
PRESERVE8为当前文件的堆 和 栈按照8字节对齐
使用THUMB指令集
启动文件的作用_第2张图片

; 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
启动文件的作用_第3张图片

启动文件的作用_第4张图片
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指外部的变量
启动文件的作用_第5张图片
启动文件的作用_第6张图片
3. 初始化中断向量表(存放的中断的地址)
4. 配置系统时钟
5. 调用main()函数
当中断向量表中的函数,在外部没有实现时,就会使用内部的函数,而这个内部的函数只会进入无限循环
启动文件的作用_第7张图片

;*******************************************************************************
; 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存放堆 和 栈 的起始地址和结束地址

你可能感兴趣的:(STM32)