返回> 网站首页
STM32启动文件
yoours2021-06-19 12:07:23
简介一边听听音乐,一边写写文章。
1. 启动文件简介
启动文件由汇编语言编写,是系统上电复位后第一个执行的第一段程序。主要做了以下工作:
初始化堆栈指针 SP = _initial_sp
初始化PC指针 = Reset_Handler
初始化中断向量表
配置系统时钟
调用C库函数_main初始化用户堆栈,从而最终调用main函数。
2. 汇编
LDR 从存储器中加载字到一个寄存器中
BL 跳转到由寄存器/标号给出的地址,并把跳转前的下条指令地址保存到LR
BLX 跳转到由寄存器给出的地址,并根据寄存器的LSE确定处理器的状态,还要把跳转前的下条指令地址保存到LR
BX 跳转到由寄存器/标号给出的地址,不用返回
3. 启动文件详解
Stack-栈
栈的作用是用于局部变量,函数调用,函数形参等的开销,栈的大小不能超过内部SRAM的大小。
33行:将数字常量0x00000400(1KB)定义为Stack_Size。
35行:汇编一个名为STACK的代码段,NOINIT表示不初始化,READWRITE表示可读可写,ALIGN=3,表示按照2^3对齐,即8字节对齐。
36行:分配一定大小的内存空间,单位为字节,这里指定大小等于Stack_Size。
37行:标号__initial_sp紧挨着SPACE语句放置,表示栈的结束地址,即栈顶地址,栈是由高向低生长的。
Heap-堆
堆主要用来动态内存的分配,像malloc函数申请的内存就在堆上面。
44行:将数字常量0x00000200(512字节),定义为Heap_Size。
46行:汇编一个名为HEAP的代码段,NOINIT表示不初始化,READWRITE表示可读可写,ALIGN=3,表示按照2^3对齐,即8字节对齐。
47行:__heap_base表示堆的起始地址。
48行:分配一定大小的内存空间,单位为字节,这里指定大小等于Heap_Size。
49行:__heap_limit表示堆的结束地址。
51行:指定当前文件的堆栈按照8字节对齐。
52行:表示后面指令兼容THUMB指令。
THUBM是ARM以前的指令集,16bit,现在Cortex-M系列的都使用THUMB指令集,THUMB-2是32位的,兼容16位和32位的指令。
Vector-中断
56行:定义一个数据段,名字为RESET,仅包含数据,而不是指令,可读。
57、58、59行:声明__Vectors、__Vectors_End 和__Vectors_Size这三个标号具有全局属性,可供外部的文件调用。
__Vectors为向量表起始地址,__Vectors_End为向量表结束地址,两个想减即可算出向量表大小__Vectors_Size。
中断-向量表