启动文件的介绍

启动文件由汇编编写,是系统上电复位后第一个执行的程序。 启动文件主要做了以下工作: 即main函数之前要完成如下步骤:

1、初始化堆栈指针 SP = _initial_sp

2、初始化程序计数器指针 PC = Reset_Handler

3、设置堆和栈的大小

4、初始化中断向量表

5、配置外部 SRAM 作为数据存储器(可选)

6、配置系统时钟,通过调用 SystemInit 函数(可选)

7、调用 C 库中的 _main 函数初始化用户堆栈,最终调用 main 函数

stm32启动流程图

启动模式选择(下载方式)

在以前 ARM7/ARM9 内核的控制器在复位后,CPU 会从存储空间的绝对地址STM32 启动文件浅析 0x00000000 取出第一条指令执行复位中断服务程序的方式启动,即固定了复位后的起始地 址为 0x00000000(PC = 0x00000000),同时中断向量表的位置也是固定的。而 Cortex-M3 内核复位后的起始地址和中断向量表的位置可以被重映射。充映射的方法是通过启动模式的 选择,有以下 3 种情况:

• Boot0、Boot1选择启动方式(boot0/1==0/1) 最常用的是主Flash 三种启动方式

汇编语言

IMPORT

声明标号来自外部文件,跟 C 语言中的 EXTERN 关键字类似

EXPORT

声明一个标号具有全局属性,可被外部的文件使用

EQU

给数字常量取一个符号名,相当于 C 语言中的 define

AREA

汇编一个新的代码段或者数据段;用来声明一个内存区域的开始

SPACE

分配内存空间

PRESERVE8

当前文件堆栈需按照 8 字节对齐

DCD

以字为单位分配内存,要求 4 字节对齐,并要求初始化这些内存

PROC

定义子程序,与 ENDP 成对使用,表示子程序结束

WEAK

弱定义,如果外部文件声明了一个标号,则优先使用外部文件定义的标号,如果外部文件没有定义也不出错。要注意的是:这个不是 ARM的指令,是编译器的,这里放在一起只是为了方便。

B

跳转到一个标号

ALIGN

编译器对指令或者数据的存放地址进行对齐,一般需要跟一个立即数,缺省表示 4 字节对齐。要注意的是:这个不是 ARM 的指令,是编译器的,这里放在一起只是为了方便。

END

到达文件的末尾,文件结束

IF,ELSE,ENDIF

汇编条件分支语句,跟 C 语言的 if else 类似

STM32启动文件初探之startup_stm32f10x_hd.s

栈空间的开辟

Stack_Size      EQU     0x00004000    
AREA    STACK, NOINIT, READWRITE, ALIGN=3                                                
Stack_Mem       SPACE   Stack_Size   		
__initial_sp   						

第一行: EQU:宏定义的伪指令,给数字常量取一个符号名,类似与 C 中的 define。定义栈大小为 0x00004000 字节,即 16384B(1KB=1024B,16384/1024=16KB),常量的符号是 Stack_Size

第二行: AREA 汇编一个新的代码段或者数据段。段名为 STACK,段名可以任意命名; NOINIT 表示不初始 化; READWRITE 表示可读可写;ALIGN=3,表示按照 2^3 对齐, 即 8 字节对齐。

伪指令AREA,表示名字为 STACK,是这个内存区域的名称。在这里,它指代程序的堆栈区域,堆栈是用于存储函数调用时的局部变量、函数参数以及处理器的状态信息等的内存区域

NOINIT 这是一个属性,表示该区域中的数据在程序初始化时不赋予任何初始值。换句话说,这块内存区域的内容在程序开始执行时是未定义的,可能包含随机值。

READ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值