当前位置:网站首页>STM32的启动过程 — startup_xxxx.s文件解析(MDK和GCC双环境)
STM32的启动过程 — startup_xxxx.s文件解析(MDK和GCC双环境)
2022-08-06 11:50:00 【InfoQ】
一、什么是启动文件
二、STM32的启动方式

三、启动文件分析(MDK环境)
- 设置堆栈指针 SP = _initial_sp
- 设置PC指针 = Reset_Handler
- 配置系统时钟
- 配置外部 SRAM 用于程序变量等数据存储(可选)
- 调用C库的 _main 函数,最终调用main函数
3.1 开辟栈空间和堆空间

- EQU是伪指令。伪指令的意思是指这个 “指令” 并不会生产二进制程序代码,也不会引起变量空间分配。
- ARER后面的关键字表示这个段的属性:STACK : 表示这个段的名字,可以任意命名。NOINIT: 表示此数据段不需要填入初始数据。READWRITE:表示此段可读可写。ALIGN=3: 表示首地址按照2的3次方对齐,所以栈空间是8字节对齐的
- SPACE 给 STACK 段分配 Stack_Size 的空间。
- __initial_sp只是一个标号,标号主要用于表示一片内存空间的某个位置,等价于C语言中的“地址”概念。地址仅仅表示存储空间的位置。此处的 __initial_sp 紧接着 SPACE 语句放置,表示了栈顶地址。

3.2 中断向量表部分

- 上图中的 AREA 定义了一段名为 RESET 的 READONLY 只读数据段,只读属性保存在 Flash 区(如果STM32从Flash启动,则此中断向量表的地址为0x0800 0000)
- 最后 EXPORT 指令,是使得 标号 可以被外部文件调用对应的有个 IMPORT 指令,指示后续符号是在外部文件定义的,外部文件的函数供汇编文件调用
- 标号__Vectors,表示中断向量表入口地址标号 __Vectors_End,表示中断向量表的结束地址标号__Vectors_Size,表示中断向量表的大号


- DCD指令:作用是开辟一段空间,其意义等价于 C 语言中的地址符 “&” 。中断向量表的建立类似于使用C语言定义了一个指针数组,其每一个成员都是一个函数指针,分别指向各个中断服务函数。
3.3 Reset_Handler 系统启动

- 图中的 Reset_Handler 中断服务函数使用了WEAK申明,说明我们在外部可以自定义 Reset_Handler 函数
- PROC、ENDP这一对伪指令把程序分为若干个过程,是程序结构更加清晰
- _main标号表示 C/C++标准实时库函数里的一个初始化子程序 _main的入口地址。该程序的一个主要作用是初始化堆栈(跳转_user_initial_stackheap标号进行初始化堆栈),并初始化映像文件,最后跳转到C程序中的main函数。这也正解释了为什么所有的C程序必须有一个main函数作为程序的起点,因为这是由C/C++标准实时库所规定的。
3.4 中断服务程序



stm32f1xx_it.c
3.5 初始化堆栈

四、启动文件分析(GCC环境)
startup_xxxx.s.ld
4.1
.ld
链接文件
STM32L051C8Tx_FLASH.ld4.1.1 开辟栈空间和堆空间

4.1.2 指定布局

4.2
.S
文件
4.2.1 基本说明
startup_stm32l051xx.s
4.2.2 Reset_Handler

4.2.3 将data段从flash 移动到 ram

4.2.4 跳转到SystemInit 和 main
- 设置堆栈指针 SP = _initial_sp
- 设置PC指针 = Reset_Handler
- 配置系统时钟
- 配置外部 SRAM 用于程序变量等数据存储(可选)
- 调用C库的 _main 函数,最终调用main函数

4.2.5 中断向量表部分

边栏推荐
- Absolutely!Ali people explain tens of billions of high-concurrency systems in 7 parts (full-color booklet open source)
- MySQL数据库安装步骤(图文)
- NC3 链表中环的入口结点
- Kubernetes 污点和容忍
- shutdown procedure
- kubernetes grayscale release
- NetEase Cloud Media Center for Audio and Video Capabilities, Focusing on the Digital Transformation of the Banking Industry
- 微信小程序:如何让button中的文字居中
- SkiaSharp 之 WPF 自绘 粒子花园(案例版)
- WeChat applet: how to center the text in the button
猜你喜欢

A domestic placeholder service

【C# 学习笔记 ①】C# 程序结构和基本语法(VSCode工具配置、数据类型、修饰符、构造函数)

自己动手写数据库:并发管理的基本原理
How does MySQL implement multi-table query?

LeetCode high frequency question 75. Color classification: Dutch flag question

重谈联想5G编码投票事件

NC1 Addition of Large Numbers

Notion 中文:客户端、网页端汉化方案

公司系统太多,如何实现账号互通?
![[Software Test Written Questions] Alibaba (China) Network Technology Co., Ltd.](/img/69/b27255c303150430df467ff3b5cd08.gif)
[Software Test Written Questions] Alibaba (China) Network Technology Co., Ltd.
随机推荐
公司系统太多,如何实现账号互通?
在常州“超级虚拟工厂”,中国智造正在“原力觉醒”
Talk about the dynamic proxy IP
Kubernetes daily command
Too strong, an annotation can desensitize the returned data of the interface!
Guitar Pro8吉他软件更新内容日志介绍
湖仓一体电商项目(一):项目背景和架构介绍
工作六年的感悟
【SQL刷题】Day2----SQL语法基础查询
黑马程序员Request&Response
京东资深架构师教你搭建高可用高并发系统,亿级流量核心架构文档
How to upgrade Kubernetes gracefully
Office宏上线Cobalstrike
LNK2001 无法解析的外部符号 cuGetErrorName解决
电脑死机是什么原因 怎样避免这个问题?
用代码画时序图!YYDS
How does MySQL implement multi-table query?
NetEase Cloud Media Center for Audio and Video Capabilities, Focusing on the Digital Transformation of the Banking Industry
架构实战营毕业总结
LeetCode_1046_最后一块石头的重量