浅析STM32H750启动文件

目录

概述

1 启动文件介绍

1.1 启动文件功能

1.2 汇编语言指令

 2 启动代码细节

2.1 分配栈空间

 2.2 分配堆空间

2.3 中断向量表

 2.4 复位程序

2.5 中断服务程序

2.5.1 CPU内部中断程序

2.5.2 CPU内部扩展中断程序

 2.6 用户堆栈初始化

3 总结


概述

本文以startup_stm32h750xx.s为例,介绍stm32h750的启动代码的内容,本文对启动的每一个环节实现的功能做了简要分析,了解ARM CM7内核是如何从启动代码中跳到用户程序中,执行用户程序。

1 启动文件介绍

1.1 启动文件功能

启动文件由汇编编写,是系统上电复位后第一个执行的程序。主要做了以下工作:

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

2)初始化PC指针=Reset_Handler

3)初始化中断向量表

4)配置系统时钟

5)调用C库函数_main初始化用户堆栈,最终跳到C语言代码段

1.2 汇编语言指令

指令名称

作用

EQU

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

AREA

汇编一个新的代码段或者数据段

SPACE

分配内存空间

PRESERVE8

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

EXPORT

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

DCD

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

PROC

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

WEAK

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

IMPORT

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

B

跳转到一个标号

ALIGN

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

END

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

IF,ELSE,ENDIF

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

 2 启动代码细节

2.1 分配栈空间

代码第32~34行:

开辟栈的大小为0x400(1KB),名字为STACK,NOINIT即不初始化,可读可写,8(2^3)字节对齐。栈的作用是用于局部变量,函数调用,函数形参等的开销,栈的大小不能超过内部SRAM的大小。如果编写的程序比较大,定义的局部变量很多,那么就需要修改栈的大小。如果某一天,你写的程序出现了莫名奇怪的错误,并进入了硬fault的时候,这时你就要考虑下是不是栈不够大,溢出了。

 2.2 分配堆空间

代码第43~51行:

开辟堆的大小为0x200(512字节),名字为HEAP,NOINIT即不初始化,可读可写,8(2^3)字节对齐。

__heap_base: 表示对的起始地址

__heap_limit: 表示堆的结束地址, 堆是由低向高生长的,跟栈的生长方向相反

2.3 中断向量表

代码第54~58行:

定义一个数据段,名字为RESET,可读。并声明 __Vectors、__Vectors_End和__Vectors_Size这三个标号具有全局属性,可供外部的文件调用。

代码第230行:

__Vectors为向量表起始地址,__Vectors_End 为向量表结束地址,两个相减即可算出向量表大小。

 2.4 复位程序

代码第234~245行:

复位子程序是系统上电后第一个执行的程序,调用SystemInit()函数初始化系统时钟,然后调用C库函数_mian(),最终调用main函数去到C的世界。

WEAK:表示弱定义,如果外部文件优先定义了该标号则首先引用该标号,如果外部文件没有声明也不会出错。 这里表示复位子程序可以由用户在其他文件重新实现,这里并不是唯一的。

IMPORT:表示该标号来自外部文件,和C语言中的EXTERN关键字类似。这里表示SystemInit和__main这两个函数均来自外部的文件。

SystemInit()是一个标准的库函数,在system_stm32f7xx.c这个库文件中定义。主要作用是配置系统时钟,这里调用这个函数之后,配置系统时钟。

__main是一个标准的C库函数,主要作用是初始化用户堆栈,最终调用main函数调到C语言中。这就是为什么写的程序都有一个main函数的原因。 如果在这里不调用__main,那么程序最终就不会调用我们C文件里面的main,如果是调皮的用户就可以修改主函数的名称, 然后在这里面IMPORT你写的主函数名称即可。

2.5 中断服务程序

2.5.1 CPU内部中断程序

2.5.2 CPU内部扩展中断程序

在启动文件里定义中断服务函数,其是一个weak函数,真正的中断复服务程序需要在外部的C文件里面重新实现,这里只是提前占了一个位置而已。

代码292~434行: 定义所有的外部中断函数名

 2.6 用户堆栈初始化

代码587~596行:判断是否定义了__MICROLIB ,如果定义了则赋予标号__initial_sp(栈顶地址)、__heap_base(堆起始地址)、__heap_limit(堆结束地址)全局属性,可供外部文件调用。如果没有定义(实际的情况就是我们没定义__MICROLIB)则使用默认的C库,然后初始化用户堆栈大小,这部分有C库函数__main来完成,当初始化完堆栈之后,就调用main函数去到C的世界。

代码606行:对指令或者数据存放的地址进行对齐,后面会跟一个立即数。缺省表示4字节对齐

代码610行:文件结束

3 总结

ARM Cortex-M7(CM7)内核的启动流程如下:

  1. 复位向量表:当系统复位时,程序计数器(PC)被设置为复位向量表的起始地址。复位向量表包含一系列指令地址,用于初始化处理器和引导操作系统。

  2. 复位处理:在复位向量表中,第一个指令的地址是复位处理程序的入口点。复位处理程序执行一系列初始化操作,包括初始化处理器和外设。

  3. 初始化堆栈指针:在复位处理程序中,堆栈指针(SP)被初始化为堆栈的起始地址。堆栈用于存储函数调用时的局部变量和返回地址。

  4. 初始化全局指针:在复位处理程序中,全局指针(GP)被初始化为全局变量的起始地址。全局变量存储在数据段中,可以被程序的任何部分访问。

  5. 初始化中断向量表:中断向量表包含一系列中断处理程序的入口点。在复位处理程序中,中断向量表被初始化为默认的中断处理程序入口点。后续可以通过修改中断向量表的内容来注册新的中断处理程序。

  6. 启用中断:在复位处理程序中,中断控制器(例如NVIC)被初始化并使能中断。使能中断后,当发生中断时,处理器会跳转到相应的中断处理程序并执行。

  7. 进入主程序:完成上述初始化操作后,处理器会跳转到主程序的入口点,开始执行应用程序的代码。

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

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

相关文章

基于springboot实现城镇保障性住房管理系统项目【项目源码+论文说明】

基于springboot实现城镇保障性住房管理系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了城镇保障性住房管理系统的开发全过程。通过分析城镇保障性住房管理系统管理的不足,创建了一个计算机…

Intewell-Win_V2.1.2_release版本正式发布-鸿道Intewell操作系统

Intewell-Win_V2.1.2_release版本 版本号:V2.1.2 版本发布类型:release正式版本 版本特点 修复此前版本中的授权问题 特殊说明 版本或修改说明 修改: 1.已授权设备用户ID直接从授权文件获取; 2.授权设备硬件指纹采集系统硬盘…

Odoo|手把手教你Odoo集成drools,完成物料规则配置与报价单自动审核!

一、背景介绍 在实际业务中,售前根据客户需求选择相应的产品和对应的物料来生成报价单。然而,在填写报价单的过程中,可能会出现物料漏选或数量不准确的情况,这会对后续备货和生产效率造成重大影响。此外,由于产品和物料…

ctfhub-ssrf(2)

1.URL Bypass 题目提示:请求的URL中必须包含http://notfound.ctfhub.com,来尝试利用URL的一些特殊地方绕过这个限制吧 打开环境发现URL中必须包含http://notfound.ctfhub.com,先按照之前的经验查看127.0.0.1/flag.php,发现没什么反应,按照题…

Java入门(JDK安装)

安装 JDK 下载 Java Downloads | Oracle 安装 下一步直接安装安装过程中,需要确定自己的安装位置 参考:D:\Java\jdk1.8.0_281_x64 演示位置 校验 终端输入 java -version 配置 1)删除默认 javapath 默认情况下,可以在cm…

04 JavaScript学习:输出

JavaScript 没有任何打印或者输出的函数。 JavaScript 显示数据 JavaScript 可以通过不同的方式来输出数据: 使用 window.alert() 弹出警告框。使用 document.write() 方法将内容写到 HTML 文档中。使用 innerHTML 写入到 HTML 元素。使用 console.log() 写入到浏…

【GoWeb框架初探————Gin篇】

1. Gin 1.1 下载相应依赖 创建go项目,在项目下建立go.mod文件(若有则跳过) 命令行运行 go get github.com/gin-gonic/gin1.2 启动一个简单Web服务 package mainimport ("github.com/gin-gonic/gin""github.com/thinkerou/…

新手入门:大语言模型训练指南

在这个信息爆炸的时代,人工智能技术正以前所未有的速度渗透到我们生活的方方面面。从智能手机上的语音助手到自动驾驶汽车,AI的应用无处不在。而在这些令人惊叹的技术背后,大语言模型(LLM)扮演着至关重要的角色。它们不…

国外问卷调查如何做?需要借助海外住宅IP吗?

在数字化时代,国外问卷调查不仅是了解市场需求的重要手段,还成为了一项能够赚取额外收入的方式。随着全球范围内消费者行为的多样化,各类企业和机构越来越需要了解不同地区的用户观点和偏好,以优化产品和服务。 一、国外问卷调查…

我与C++的爱恋:日期计算器

​ ​ 🔥个人主页:guoguoqiang. 🔥专栏:我与C的爱恋 朋友们大家好啊,在我们学习了默认成员函数后,我们通过上述内容,来实现一个简易的日期计算器。 ​ ​ 头文件的声明 #pragma once #incl…

签约棒球自由球员算法设计

签约棒球自由球员算法设计 1. 问题描述2. 算法设计2.1 动态规划2.2 状态转移方程2.3 初始化2.4 最终结果 3. 算法实现3.1 伪代码3.2 C代码示例 1. 问题描述 假设你是一支棒球大联盟球队的总经理。在赛季休季期间,你需要签入一些自由球员。球队老板给你的预算为 X美…

攻防世界fileclude题解

攻防世界fileclude题解 ​​ 题目要求file1和file2参数不能为空 且file2这个文件内容值为hello ctf,用php://input 然后POST体内输入hello ctf即可满足这个if条件 满足这个条件后就会包含file1变量所指定的那个文件。用php伪协议来跨目录包含一下flag.php文件就可以…

Redis系列1:深刻理解高性能Redis的本质

1 背景 分布式系统绕不开的核心之一的就是数据缓存,有了缓存的支撑,系统的整体吞吐量会有很大的提升。通过使用缓存,我们把频繁查询的数据由磁盘调度到缓存中,保证数据的高效率读写。 当然,除了在内存内运行还远远不够…

linux 云计算平台基本环境(知识准备篇)

为了更多的了解云计算平台,结合云计算和linux的知识写了一篇云计算的介绍和汇总。 文章目录 前言1. centos的软件管理1.1 yum软件包管理1.1.1 yum命令语法:1.1.2 安装软件包的步骤1.1.3 yum源 2. 主机名管理与域名解析3. centos的防火墙管理4. openstack…

java锁介绍

乐观锁 乐观地认为并发访问不会造成数据冲突,只在更新时检查是否有冲突。乐观锁和CAS的关系可以用“乐观锁是一种思想,CAS是一种具体的实现”来理解。 当使用CAS操作修改数据时,如果版本号不匹配或者其他线程已经修改了要操作的数据&#x…

面试题集中营—分布式共识算法

分布式共识算法目标 分布式主要就是为了解决单点故障。一开始只有一个服务节点提供服务,如下图所示。那么如果服务节点挂了,对不起等着吧。 为了服务的高可用性,我们一般都会多引入几个副节点当备份,当服务节点挂了,就…

【Java框架】Spring框架(四)——Spring中的Bean的创建与生命周期

目录 SpringBean的创建步骤后置处理器(PostProcessor)BeanFactoryPostProcessorBeanPostProcessorInstantiationAwareBeanPostProcessorpostProcessBeforeInstantiationpostProcessAfterInstantiationpostProcessProperties SmartInstantiationAwareBeanPostProcessordetermine…

如何采集opc服务器数据上传云端

为了进一步提高生产效率,生产制造的不断朝着智能化发展和升级,传统的自动化生产系统已经不能满足需求。传统的SCADA系统一般是用于现场的数据采集与控制,但是本地控制已经无法满足整个工厂系统智能化数字化的需求,智能化数字化是需…

呼叫系统的技术实现原理和运作流程,ai智能系统,呼叫中心外呼软交换部署

呼叫系统的技术实现原理和运作流程可以涉及多个组成部分,包括硬件设备、软件系统和通信协议。以下是一般情况下呼叫系统的技术实现原理和运作流程的概述: 硬件设备: 服务器:用于承载呼叫系统的核心软件和数据库。电话交换机&#…

《手把手教你》系列基础篇(九十五)-java+ selenium自动化测试-框架之设计篇-java实现自定义日志输出(详解教程)

1.简介 前面宏哥一连几篇介绍如何通过开源jar包Log4j.jar、log4j2.jar和logback实现日志文件输出,Log4j和logback确实很强大,能生成三种日志文件,一种是保存到磁盘的日志文件,一种是控制台输出的日志,还有一种是HTML格…