STM32 启动文件分析

news2024/12/22 23:44:36

STM32 启动文件分析

基于STM32F103VET6芯片的 startup_stm32f10x_hd.s 启动文件分析
在这里插入图片描述

  • 设置栈,将栈的大小Stack_Size设置为0x00004900(18688/1024=18KB),即局部变量不能大于18KB。(EQU等值指令,将0x00004900地址赋给标号Stack_Size。)
  • AREA 指令用于定义程序的不同区域,STACK表示栈区域,NOINIT表示该区域不需要进行初始化,READWRITE 表示该区域可读可写。ALIGN=3 表示该区域的起始地址需要按照 2^3 = 8 字节对齐。
  • Stack_Mem SPACE Stack_Size ;开辟一段大小为Stack_Size的内存空间作为栈。
  • __initial_sp表示程序的初始栈指针。栈通常从高地址向低地址生长。__initial_sp 定义为栈顶地址。程序启动时,编译器会使用 __initial_sp的值来初始化硬件的栈寄存器。

在这里插入图片描述

  • 设置堆,将堆的大小Heap_Size设置为0x00002400(9216/1024=9KB),堆用于动态分配内存。
  • AREA 定义HEAP堆区域,不需要初始化,可读可写,ALIGN=3 表示该区域的起始地址需要按照 2^3 = 8 字节对齐。
  • __heap_base 表示堆的起始地址。
  • Heap_Mem SPACE Heap_Size 开辟一段大小为Heap_Size的内存空间作为堆。
  • __heap_limit 堆空间结束地址。
  • PRESERVE8当前文件的堆栈按照8字节对齐,确保在运行程序时,堆栈数据能够正确地在内存中加载和存储。
  • THUMB表示后面指令兼容THUMB指令。THUMB是ARM以前的指令集,16位的,而现在Cortex-M系列都使用THUMB-2指令集,是32位的。
    在这里插入图片描述
  • AREA RESET, DATA, READONLY 表示定义一个只读数据段,数据段名称为RESET。(DATA表示数据段,用于存储全局变量和静态变量等可读写的数据。READONLY存储只读的数据,如常量字符串和只读变量等。这句话表示RESET数据段在程序执行期间可读写,在程序运行期间只读。)
  • EXPORT __Vectors 表示在程序中声明一个全局的标号__Vectors,该标号可在其他的文件中引用,中断向量表的入口地址。
  • EXPORT __Vectors_End 表示在程序中声明一个全局的标号__Vectors_End,中断向量表的结束地址。
  • EXPORT __Vectors_Size 在程序中声明一个全局的标号__Vectors_Size,中断向量表的大小。
    在这里插入图片描述
  • 建立中断向量表,DCD表示分配一个4字节的空间。首地址一定要是栈顶指针,Top of Stack,存放于FLASH中的0x8000000地址处,这部分是系统内部中断。
  • DCD指令:作用是开辟一段空间,其意义等价于 C 语言中的地址符 “&” 。中断向量表的建立类似于使用C语言定义了一个指针数组,其每一个成员都是一个函数指针,分别指向各个中断服务函数。
    在这里插入图片描述
  • 这部分是外部中断。
    在这里插入图片描述
  • __Vectors_End 中断向量表的结束地址
  • __Vectors_Size EQU __Vectors_End - __Vectors 中断向量表的大小
  • AREA |.text|, CODE, READONLY 定义只读代码段.text
    在这里插入图片描述
  • Reset_Handler 复位中断服务程序,PROC…ENDP结构表示程序的开始和结束。
  • EXPORT Reset_Handler [WEAK] 声明复位中断向量Reset_Handler为全局属性,外部文件就可以调用此复位中断服务。[WEAK]弱定义(Weak Definition),表示如果其他地方有Reset_Handler这个函数,用其他地方的Reset_Handler,如果没有,使用这里的Reset_Handler。
  • IMPORT 告诉编译器要使用的标号在其他源文件中定义,IMPORT __main,IMPORT SystemInit表示要调用__main和SystemInit两个函数。
  • LDR R0, =SystemInit 表示通过LDR将SystemInit地址给R0寄存区。(LDR 指令的作用是从指定的源地址读取数据,并将其加载到目标寄存器中。)
  • BLX 指令的作用是将当前指令的下一条指令的地址存储到链接寄存器(LR)中,并跳转到目标地址。这里会记下下一条指令的地址放入链接寄存器中,然后跳转到SystemInit地址执行,最后跳到链接寄存器地址继续执行。(BLX还会改变当前指令 THUMB—>ARM。)
  • LDR R0, =__main,将__main存储到R0,BX R0 表示跳转到刚刚R0存储值__main位置执行,并且最终会跳转到main(),进入C语言运行环境。(BX是无条件分支跳转指令,没有像BLX一样将下一条指令的地址存储到链接寄存器。跳转后就不会回来,BX也会改变当前指令THUMB—>ARM。)
    在这里插入图片描述
  • 这一段是异常处理程序,定义的都是弱函数,以NMI_Handler为例,如果程序其他地方没有NMI_Handler函数,会执行这里的函数,以确保程序的运行。
  • 这里只是给出基础的函数框架,具体的实现需要手动填充。可以在这里的弱函数里填充,也可以自己定义对应函数。一般,在stm32f10x_it.c文件中,可以填充这里同名的中断服务函数。也可以注释掉stm32f10x_it.c文件中的一些中断服务函数,在想要实现的文件中自己定义实现。
    在这里插入图片描述
    在这里插入图片描述
  • 这些是外围设备的中断处理函数,在使用对应中断事件时,需要在程序中编写处理函数来响应中断事件。
    在这里插入图片描述
  • 堆栈初始化,在上文中已经知道,中断向量表规定第一行必须是SP地址,第二行是复位中断入口地址,上电后,CPU首先就会读这两个值。上电时已经初始了SP,为什么这里又初始化堆栈?因为上电只是将_initial_sp值存入了SP寄存器,这只是一个栈顶指针,但堆的大小和栈的大小并没有初始化,所以在_main中要把在启动文件中定义好的值传给C库进行堆栈大小的初始化。
  • IF :DEF:__MICROLIB 如果使用Micro LIB微库(在keil的Target中可选择),将栈顶指针、堆起始地址、堆结束地址赋予全局属性供外部程序调用。
  • IMPORT __use_two_region_memory 定义全局标号
  • EXPORT __user_initial_stackheap 声明全局标号
  • __user_initial_stackheap 表示用户堆栈初始化程序入口
  • LDR R0, = Heap_Mem 加载堆的起始地址到寄存器 R0,
  • LDR R1, =(Stack_Mem + Stack_Size) 加载栈的结束地址到R1,
  • LDR R2, = (Heap_Mem + Heap_Size) 加载堆的结束地址到R2,
  • LDR R3, = Stack_Mem 加载栈的起始地址到寄存器 R3,
  • BX LR 返回到调用这个子程序的位置。
  • ALIGN用于在代码中插入一个对齐标记,以确保后续代码的对齐。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1251531.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

「Verilog学习笔记」数据累加输出

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网 在data_out准备好,valid_b拉高时,如果下游的ready_b为低,表示下游此时不能接收本模块的数据,那么,将会拉低ready…

UWB实时定位系统源码,历史活动轨迹显示,视频联动,电子围栏

UWB实时定位系统源码,工厂企业人员安全定位,UWB源码 行业背景 工业企业多存在很多有毒有害、高危高压等生产环境,带电设备众多,容易发生安全事故;人员只能凭记忆遵守各项生产安全规范,如某些危险区域范围、…

OpenCV简介及安装

前言 因为最近想做图像处理、人脸检测/识别之类的相关开发,所以就开始补OpenCV的相关知识,便开个专栏用于记录学习历程和在学习过程中遇到的一些值得注意的重点和坑。 学习过程基本上也是面向官方文档和Google。 简介 OpenCV(开源的计算机视觉库)是基于…

Python编程之魂之运算符的优先级教程

文章目录 前言优先级概述相同优先级结合性运算符优先级一览表运算符优先级重点说明结语关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资…

中职网安-Linux操作系统渗透测-Server2130(环境加qq)

B-9:Linux操作系统渗透测 任务环境说明:  服务器场景:Server2130  服务器场景操作系统:Linux(关闭链接) 1.通过本地PC中渗透测试平台Kali对靶机场景进行系统服务及版本扫描渗透测试,并将该操作显示结果中Apache服务对应的版本信息字符串作为Flag值提交; 2.…

救命~终于找到一款好看又舒适的家居服了

暖乎乎的软糯家居服 简直不要太好看太舒服了 双层舒棉绒舒适又暖和 防风收口设计,时尚与实用性兼具 经典版型不挑人穿 居家外出都可哦!!

03 _ 系统设计目标(一):如何提升系统性能?

提到互联网系统设计,可能听到最多的词就是“三高”,也就是“高并发”“高性能”“高可用”,它们是互联网系统架构设计永恒的主题。这里将整体探讨下高并发系统设计的目标,然后在此基础上,探讨下:如何提升系…

LiveGBS流媒体平台GB/T28181功能-查看国标设备会话列表直播会话、回放会话、下载会话、对讲会话

LiveGBS流媒体平台GB/T28181功能-查看国标设备会话列表直播会话、回放会话、下载会话、对讲会话 1、会话列表2、会话类型3、搭建GB28181视频直播平台 1、会话列表 LiveGBS-> 国标设备-》点击在线状态 点击会话列表 2、会话类型 下拉会话类型可以看到 直播会话、回放会话、…

哈希——位图、布隆过滤器

欢迎来到Cefler的博客😁 🕌博客主页:那个传说中的man的主页 🏠个人专栏:题目解析 🌎推荐文章:题目大解析(3) 目录 👉🏻位图概念bitset &#x1f4…

曲线拟合:走进数据建模中的艺术与科学

在现代科学和工程领域,曲线拟合是一项重要的数据分析技术,它可以通过数学模型来近似描述实际数据中的复杂关系。本文将详细介绍曲线拟合的基本概念、方法和应用领域,并探究其在数据建模中的艺术与科学。 第一节:曲线拟合的基本概…

UML建模图文详解教程08——部署图

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl本文参考资料:《UML面向对象分析、建模与设计(第2版)》吕云翔,赵天宇 著 部署图概述 部署图(deployment diagram)也被译作配置…

线程池(用于处理Runnable任务或Callable任务)

一&#xff0c;线程池 二&#xff0c; 如何创建线程池 案例&#xff1a; //1,通过ThreadPoolExecuter创建一个线程池对象ExecutorService pool new ThreadPoolExecutor(3,5,8,TimeUnit.SECONDS,new LinkedBlockingQueue<>(4),Executors.defaultThreadFactory(),new Thr…

Java LCR 089 打家劫舍

题目链接&#xff1a;打家劫舍 定义一个数组 dp&#xff0c;其中 dp[i] 表示从第 0 间房子到第 i 间房子&#xff08;包括第 i 间&#xff09;能够偷窃到的最高金额。 对于第 i 间房子有两种选择&#xff0c;偷或不偷&#xff1a; 偷就不能偷第 i - 1 间房子&#xff1a; dp[i]…

【教学类-06-08】20231125(55格版)X-Y之间“减法-题”(以10-20之间为例)(必须X>Y,题目少)

图片展示 需求&#xff1a; 20以内减法&#xff0c;不需要再练习其中10以内部分&#xff0c;改为10-20以内的减法&#xff0c;X-Y大于10&#xff0c;小于20的所有减法题。 代码展示&#xff1a; “-”减法 X-Y 之间的所有减法-题&#xff08;如10-20之间的所有减法&#xff0…

VSCode 警告:v-on event ‘@toggleClick‘ must be hyphenated

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

VUE留言板

效果预览图 完整代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>作业</title><styl…

快手AI布局:从直播电商到大模型,如何打造智能生态?

快手科技在2023年第三季度业绩中&#xff0c;首次披露了关于AI业务的一些重要信息&#xff0c;显示出其对AI的重视和投入。快手AI的核心业务和竞争优势是什么&#xff1f;AI的发展&#xff0c;对快手业绩带来了哪些方面的提振&#xff1f; 快手AI业务板块&#xff1a;直播电商…

百度AI布局:从财报看百度的核心竞争力和未来发展方向

百度是中国最大的搜索引擎&#xff0c;也是全球领先的人工智能&#xff08;AI&#xff09;公司。百度在2023年第三季度业绩中&#xff0c;展示了其在AI领域的强劲表现和广阔前景。 百度财报透露了关于AI业务的哪些重要信息&#xff1f; 百度在2023年第三季度的财报中&#xf…

1.5 C语言之字符输入输出

1.5 C语言之字符输入输出 一、概述二、字符计数三、行计数四、单词计数五、练习 一、概述 字符文本流&#xff0c;是由多行字符构成的字符序列&#xff0c;而每行字符都由0个或多个字符组成&#xff0c;行末是一个换行符。 标准库提供的输入输出模型&#xff0c;用于读取文本内…

【Python】(自定义类)计算语句执行时间

一个玩具&#xff0c;写着来玩的。 用的time模块&#xff0c;代码很简单(所以才说是个玩具) 代码&#xff1a; import time class TimeStamp:__timestampNone__keyNonedef __init__(self,tipsNone,keyNone):self.__timestamp{}self.NewStamp(tips,key)def NewStamp(self,tips,…