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用于在代码中插入一个对齐标记,以确保后续代码的对齐。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言进阶之路-运算符小怪篇

目录 一、学习目标 二、运算符详谈 算术运算符 关系运算符 逻辑运算符 位运算符 特殊运算符 条件运算符 sizeof 运算符 打怪实战 三、控制流 二路分支 多路分支 const while与 do…while循环 语法: for循环 break与continue goto语句&#xff08…

Windows系统管理之备份与恢复

本章目录: 一. 本章须知: 前置条件 需要创建一个新的磁盘 前置条件2 给新添加的磁盘分盘 二. 了解开启并学会使用Windows sever backup 如何使用备份与恢复“备份计划”“一次性备份”“恢复” 最后是用命令行“一次性备份命令 ”完成一次备份 话不多说 …

常见位运算的详讲!

今日为大家详细讲解一番关于常见位运算的操作,本文主要介绍一些位运算的操作符,然后再通过简单->中等->困难的例题,让大家彻底搞懂关于位运算的知识! 位运算的介绍! 1.基础位运算 ">>"右移操作…

纵观手机市场,手机即鏖战全面屏

9月13日,在相继发布Apple TV、Apple Watch 和iPhone 8/8 Plus之后,当大家都以为苹果新品发布会临近结束之时,苹果前CEO史蒂夫乔布斯的这句经典名言再现屏幕,iPhone X终于揭开了神秘面纱。 “One more thing”。 9月13日&#xff…

第一百七十九回 自定义SlideImageSwitch

文章目录 1. 概念介绍2. 思路与方法2.1 实现思路 3. 代码与效果3.1 示例代码3.2 运行效果 4. 内容总结 我们在上一章回中介绍了"SlideSwitch组件"相关的内容,本章回中将介绍自定义SlideImageSwitch.闲话休提,让我们一起Talk Flutter吧。 1. 概…

4、LED闪烁

LED亮灭 使用STC-ISP软件的延时计算器自动生成延迟子函数 #include <REGX52.H> #include <INTRINS.H>//延迟函数 void Delay500ms() //12.000MHz {unsigned char i, j, k;//_nop_()需要导入<INTRINS.H>包_nop_();i 4;j 205;k 187;do{do{while (--k);}…

【数据库篇】关系模式的表示——(2)规范化

范式&#xff1a;范式是符合某一种级别的关系模式的集合 规范化&#xff1a;是指一个低一级的范式的关系模式&#xff0c;通过模式的分解转换为若干个高一级范式的关系模式的集合。 1NF 每个分量必须是不可分开的数据项&#xff0c;满足这个条件的关系模式就是1NF。 2NF 若…

c语言判断三角形

以下是一个用C语言编写的程序&#xff0c;用于判断输入的三个数能否构成三角形。 #include <stdio.h>int main() { int a, b, c; printf("请输入三角形的三条边长&#xff1a;\n"); scanf("%d%d%d", &a, &b, &c); if (a b…

为什么淘宝取消双12活动?

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 淘宝取消双12活动了&#xff0c;这条消息犹如一颗重磅炸弹&#xff0c;在整个电商圈中引发了轩然大波。 不过呢&#xff0c;淘宝为了过度&#xff0c;把双12改了个名字叫“好价节”。估计是官方都…

isis基础大全学习案例

R1配置&#xff1a; isis 1 is-level level-2 //本区域只启用level-2级别 cost-style wide //默认为narrow窄度量&#xff0c;开销只能最大63&#xff0c;并且不能打tag&#xff0c;wide宽度量的tlv和narrow不匹配&#xff0c;不能相互计算路由&#xff0c;两边都要改。 netwo…

Kotlin学习——kt里的集合List,Set,Map List集合的各种方法之Int篇

Kotlin 是一门现代但已成熟的编程语言&#xff0c;旨在让开发人员更幸福快乐。 它简洁、安全、可与 Java 及其他语言互操作&#xff0c;并提供了多种方式在多个平台间复用代码&#xff0c;以实现高效编程。 https://play.kotlinlang.org/byExample/01_introduction/02_Functio…

自动化部署 扩容openGauss —— Ansible for openGauss

前言 大家好&#xff0c;今天我们为大家推荐一套基于Ansible开发的&#xff0c;自动化部署及扩容openGauss的脚本工具&#xff1a;Ansible for openGauss&#xff08;以下简称 AFO&#xff09;。 通过AFO&#xff0c;我们只需简单修改一些配置文件&#xff0c;即可快速部署多种…

JavaScript基础—运算符、表达式和语句、分支语句、循环语句、综合案例-ATM存取款机

版本说明 当前版本号[20231125]。 版本修改说明20231125初版 目录 文章目录 版本说明目录JavaScript 基础 - 第2天运算符算术运算符赋值运算符自增/自减运算符比较运算符逻辑运算符运算符优先级 语句表达式和语句分支语句if 分支语句if双分支语句if 多分支语句三元运算符&am…

人工智能时代的内容写作

内容不再只是王道&#xff0c;正如俗话所说&#xff1a;它是一种流动的货币&#xff0c;推动了巨大的在线信息和影响力经济。 每个品牌都是一个故事&#xff0c;通过其服务和商品讲述自己。尽管如此&#xff0c;大多数客户还是会通过您的在线内容最了解您。 但随着我们进入人…

鸿蒙HarmonyOS 编辑器 下载 安装

好 各位 之前的文章 注册并实名认证华为开发者账号 我们基实名注册了华为的开发者账号 我们可以访问官网 https://developer.harmonyos.com/cn/develop/deveco-studio 在这里 直接就有我们编辑器的下载按钮 我们直接点击立即下载 这里 我们根据自己的系统选择要下载的系统 例…

Linux操作系统之apt常用命令记录

文章目录 apt 命令apt 语法apt 常用命令列出所有可更新的软件清单命令升级软件包列出可更新的软件包及版本信息升级软件包&#xff0c;升级前先删除需要更新软件包安装指定的软件命令&#xff1a;安装多个软件包&#xff1a;更新指定的软件命令显示软件包具体信息,例如&#xf…

MYSQL基础之【创建数据表,删除数据表】

文章目录 前言MySQL 创建数据表通过命令提示符创建表使用PHP脚本创建数据表 MySQL 删除数据表在命令提示窗口中删除数据表使用PHP脚本删除数据表 后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;Mysql &#x1f431;‍&#x1f453;博主…

搜索 C. Tic-tac-toe

Problem - C - Codeforces 思路&#xff1a;搜索&#xff0c;判断合法性。从起始态用搜索进行模拟&#xff0c;这样可以避免后面判断合法性这一繁琐的步骤。用一个map进行映射当前态及对应的结果。剪枝&#xff1a;如果当前字符串已经被搜索过&#xff0c;则直接跳过去。 代码…

如何在3dMax中根据AutoCAD地形规划文件对地形进行建模?

在3dMax中根据Autocad地形规划文件对地形进行建模的方法 直入主题&#xff0c;要根据包含地形图的DWG (Autocad) 文件进行地形建模&#xff0c;方法步骤如下&#xff1a; 1.运行3dmax软件&#xff0c;点击“文件&#xff08;File&#xff09;->导入&#xff08;Import&…

【RTP】RTPSenderAudio::SendAudio

RTPSenderAudio 可以将一个opus帧封装为rtp包进行发送,以下是其过程:RTPSenderAudio::SendAudio :只需要提供payload部分 创建RtpPacketToSend 并写入各个部分 填充payload部分 sender 本身分配全session唯一的twcc序号 if (!rtp_sender_->