STM32 启动文件分析

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.mzph.cn/news/169562.shtml

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

相关文章

Arduio开发STM32所面临的风险

据说micro_ros用到了arduino,然后用arduino搞stm32需要用到这个Arduino STM32的东西,然后这里申明了:这些代码没有经过严格测试,如果是向心脏起搏器,自动驾驶这样要求严格的的情况下,这个东西不能保证100%不发生问题&a…

尺度为什么是sigma?

我们先看中值滤波和均值滤波。 以前,我认为是一样的,没有区分过。 他们说,均值滤波有使图像模糊的效果。 中值滤波有使图像去椒盐的效果。为什么不同呢?试了一下,果然不同,然后追踪了一下定义。 12345&…

一体化污水处理设备各种材质的优缺点

一体化污水处理设备的材质有多种,包括不锈钢、玻璃钢、聚乙烯塑料、碳钢等。每种材质都有其独特的优点和缺点。 不锈钢材质的优点是防腐性能好,耐磨损,使用寿命长,且外观美观。其缺点是成本较高,不适合在一些特殊的环…

ESP32 ESP-IDF5.1 在Visual Studio Code中自定义分区表与调整Flash大小

好记心不如烂笔头 使用ESP-IDF开发ESP32的时候,要是同时用到蓝牙和WIFI的话,很多时候会提示Flash不够, 我是照着这样解决的,存档记录 来源 : zaixingxing2539 大佬的 ESP32 ESP-IDF5.0 在VSCODE中自定义分区表 用Visual Studio Code自定义分区表 # ESP-IDF Partition Table…

VMware虚拟机网络配置详解

vmware为我们提供了三种网络工作模式,它们分别是:Bridged(桥接模式)、NAT(网络地址转换模式)、Host-Only(仅主机模式) 打开vmware虚拟机,我们可以在选项栏的“编辑”下的…

Vue新手必学:Vue的使用和Vue脚手架详解

文章目录 引言第一部分:Vue的基本使用1.1 安装Vue1.2 创建Vue项目1.3 编写第一个Vue组件1.4 在主页面中使用组件1.5 运行Vue项目 第二部分:Vue脚手架的使用2.1 Vue脚手架是什么2.2 创建Vue项目2.3 项目结构2.4 运行项目2.5 插件和配置 第三部分&#xff…

局域网的网络ip不稳定问题

在局域网的多个设备,互相通信时好时坏,不稳定。 遭遇过的情况如下: 用两个开发板:972开发板1和2,网口同时互相ping,出现1ping 2通--此时2ping 1不通,过段时间,1ping2不通--但2ping又…

前端学习网站推荐

1.菜鸟教程(程序员必备)菜鸟教程 - 学的不仅是技术,更是梦想! 2.npm库 npm | Home 3.uniapp学习官网 uni-app官网 4.vue官网 快速上手 | Vue.js 5.ECharts图表 Apache ECharts 6.ES6学习 ES6 入门教程 7.Three.js学习 Three.js…

基于人工蜂鸟算法优化概率神经网络PNN的分类预测 - 附代码

基于人工蜂鸟算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于人工蜂鸟算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于人工蜂鸟优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神…

Leetcode---372周赛

题目列表 2937. 使三个字符串相等 2938. 区分黑球与白球 2939. 最大异或乘积 2940. 找到 Alice 和 Bob 可以相遇的建筑 一、使三个字符串相等 这题把题目意思读懂,正常模拟就行,简单来说就是看三个字符串的最长公共前缀有多长, 代码如下…

操作系统:操作系统教程第六版(骆斌、葛季栋、费翔林)习题二处理器管理

目录 前言1. 简答题2. 应用题 前言 本系列文章是针对操作系统教程第六版(骆斌、葛季栋、费翔林)的习题解答,其中简答题部分为博主自己搜索整理的,错漏之处在所难免。应用题部分有答案为依据。 1. 简答题 (1&#xf…

数据查询,让表单之间“联动”起来!丨三叠云

数据查询 路径 表单设计 >> 字段属性 功能简介 「数据查询」增加触发「数据联动」功能。本次对「数据查询」字段的功能进行优化,这次升级包含「编辑关联数据」、「导入数据」「拷贝数据」,以提高数据操作时的便利。 适用场景: 销…

[数据结构]-红黑树

前言 作者:小蜗牛向前冲 名言:我可以接受失败,但我不能接受放弃 如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、红黑树的…

英文文献阅读工具和经验分享

在搞学术的时候需要阅读大量的英文论文或者是英文原著,我也一直在摸索如何方便高效的阅读。本篇仅为个人经验之谈,大家还是要找到合适自己的方式。 方法一:deepLGoodNotes 优点: 可以各种划线标注、手写笔记,加入图片…

github上不去

想要网上找代码发现github上不去了 发现之前的fastgit也用不了了 搜了很多地方终于找到了 记录保存一下 fastgithub最新下载 选择第二个下载解压就行 使用成功!

【C】内存函数

目录 1. memcpy 使用和模拟实现 2. memmove 使⽤和模拟实现 3. memset 函数的使用 4. memcmp 函数的使用 1. memcpy 使用和模拟实现 void * memcpy ( void * destination, const void * source, size_t num ); • 函数memcpy从source的位置开始向后复制num个字节的数据到d…

BUUCTF [HBNIS2018]caesar 1

BUUCTF:https://buuoj.cn/challenges 题目描述: 得到的 flag 请包上 flag{} 提交。来源:https://github.com/hebtuerror404/CTF_competition_warehouse_2018 密文: 下载附件,得到一个.txt文件。 解题思路: 1、用浏览…

pop链反序列化 [MRCTF2020]Ezpop1

打开题目 网站源码为 Welcome to index.php <?php //flag is in flag.php //WTF IS THIS? //Learn From https://ctf.ieki.xyz/library/php.html#%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E9%AD%94%E6%9C%AF%E6%96%B9%E6%B3%95 //And Crack It! class Modifier {protected …

【MATLAB源码-第89期】基于matlab的灰狼优化算法(GWO)无人机三维路径规划,输出做短路径图和适应度曲线

操作环境&#xff1a; MATLAB 2022a 1、算法描述 灰狼优化算法&#xff08;Grey Wolf Optimizer, GWO&#xff09;是一种模仿灰狼捕食行为的优化算法。灰狼是群居动物&#xff0c;有着严格的社会等级结构。在灰狼群体中&#xff0c;通常有三个等级&#xff1a;首领&#xff…

什么是判断能力?如何提高判断能力?

什么是判断能力&#xff1f; 人的大脑跟电脑有有着相似的工作原理&#xff0c;不论什么事情&#xff0c;如果要做出判断&#xff0c;那么首先是收集各类信息&#xff0c;跟这个事件相关的各种资料&#xff0c;仅供大脑的分析后&#xff0c;得出一个结论&#xff0c;从而形成判…