【嵌入式学习笔记】嵌入式基础9——STM32启动过程

1.MAP文件浅析

1.1.MDK编译后生成的中间过程文件

在这里插入图片描述

1.2.Map文件构成:

  1. 程序段交叉引用关系(Section Cross References):描述各文件之间函数调用关系
  2. 删除映像未使用的程序段(Removing Unused input sections from the image):描述工程中未用到被删除的冗余程序段(函数/数据)
  3. 映像符号表(Image Symbol Table):描述各符号(程序段/数据)在存储器中的地址、类型、大小等
  4. 映像内存分布图(Memory Map of the image):描述各个程序段(函数)在存储器中的地址及占用大小
  5. 映像组件大小(Image component sizes):给出整个映像代码(.o)占用空间汇总信息

1.3.与MAP相关的概念

名词别称解释内存
Section/程序段/
RO(Read Only) data.constdata只读数据Flash(ROM)
RO(Read Only) code.text只读代码Flash(ROM)
RW(Read Write).data可写数据(定义了且初始化不为0)Flash(ROM)/SRAM
ZI(Zero initialized).bss定义了但没初始化(初始化为0)SRAM

总结:MAP文件是MDK编译代码后,产生的集程序、数据及IO空间的一种映射列表文件,简单说就是包括了:各种.c文件、函数、符号等的地址、大小、引用关系等信息。MAP的主要作用是分析各.c文件占用FLASH 和 RAM的大小,方便优化代码

2.STM32启动过程

2.1.STM32STM32启动模式(自举模式)

M3/M4/M7等内核复位后,做的第一件事:

  1. 从地址 0x0000 0000 处取出堆栈指针 MSP 的初始值,该值就是栈顶地址
  2. 从地址 0x0000 0004 处取出程序计数器指针 PC 的初始值,该值是复位向量
  3. 芯片厂商可以会把0x0000 0000和0x0000 0004地址映射到其它的地址(如0x0800 0000和0x0800 0004
    在这里插入图片描述
    启动模式选择表(STM32F1)
    (F4与其类似,FSMC可重映射到外部SRAM,F7/H7只有一个BOOT)
    在这里插入图片描述

2.2.STM32启动过程(以Flash为例)

  • 初始化MSP,从0x0800 0000获取堆栈指针 MSP,此时会设置堆(Heap_Size)和栈(Stack_Size)的大小
  • 初始化PC,从0x0800 0004获取程序计数器指针PC,此时PC指向中断向量表(Reset Vector,既__Vector),在中断向量表中,第一条指令即是Reset_Handler
  • 在Reset_Handler函数中,会调用SystemInit函数(可选),并调用标准C库函数__mian()执行一系列设置,调用main函数
  • __main()函数的细节
    __scatterload():把RW/RO输出段从装载域地址复制到运行域地址,并完成了ZI运行域的初始化工作
    __rt_entry():完成库函数的初始化
    __user_setup_stackheap():初始化堆栈

请添加图片描述

栈(Stack):编译器自动分配和释放,存放函数参数、函数调用、局部变量等
堆(Heap):程序分配和释放,如malloc、calloc、realloc等
函数局部变量较多,嵌套关系复杂时,需加大栈大小(Stack_Size)

Reset_Handler函数如下:

Reset_Handler   PROC								//PROC:定义子程序
													//WEAK:弱定义
                EXPORT  Reset_Handler   [WEAK]		//EXPORT:标明全局属性,可被外部调用
                IMPORT  __main						//IMPORT:申明来自外部文件,类extern
                IMPORT  SystemInit
                LDR   R0, =SystemInit
                BLX   R0               
                LDR   R0, =__main
                BX      R0
                ENDP								//ENDP:表示子程序结束

【注】Reset_Handler的作用:外部存储器配置;中断向量表地址配置。

在这里插入图片描述

__main()参考链接:
【1】STM32 启动解析__main main
【2】MDK __main()代码执行过程分析
【3】【stm32】stm32深入思考(1) 之 系统启动流程 main之前的过程,__main作用,start.s作用

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

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

相关文章

【驱动开发day4作业】

头文件代码 #ifndef __HEAD_H__ #define __HEAD_H__ typedef struct{unsigned int MODER;unsigned int OTYPER;unsigned int OSPEEDR;unsigned int PUPDR;unsigned int IDR;unsigned int ODR; }gpio_t; #define PHY_LED1_ADDR 0X50006000 #define PHY_LED2_ADDR 0X50007000 #…

使用Wps减小PDF文件的大小

第一步、打开左上角的文件 第二步、点击打印选项 第三步、点击打印按钮

[数据库]对数据库事务进行总结

文章目录 1、什么是事务2、事务的特性(ACID)3、并发事务带来的问题4、四个隔离级别: 1、什么是事务 事务是逻辑上的一组操作,要么都执行,要么都不执行。 事务最经典也经常被拿出来说例子就是转账了。假如小明要给小红…

基于Fringe-Projection环形投影技术的人脸三维形状提取算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 .................................................................... figure; imshow(Im…

用windeployqt.exe打包Qt代码

首先找到我们编译Qt代码的对应Qt版本的dll目录,该目录下有windeployqt.exe: D:\DevTools\Qt\5.9\msvc2017_64\bin 在这个目录下打开cmd程序。 然后把要打包的exe放到一个单独的目录下,比如: 然后在cmd中调用: winde…

Qt : day4

1.思维导图 2.服务器 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//给服务器指针实例化空间server new QTcpServer(this);}Widget::~Widget() {delete ui;…

25.8 matlab里面的10中优化方法介绍—— 拉各朗日乘子法求最优化解(matlab程序)

1.简述 拉格朗日乘子法: 拉格朗日乘子法(Lagrange multipliers)是一种寻找多元函数在一组约束下的极值的方法。通过引入拉格朗日乘子,可将有 变量与 约束条件的最优化问题转化为具有变量的无约束优化问题求解 举个例子&#xff…

【MATLAB第60期】【更新中】基于MATLAB的ARMAX具有外生回归因子的移动平均自回归模型

【MATLAB第60期】【更新中】基于MATLAB的ARMAX具有外生回归因子的移动平均自回归模型 版本更新: 2023/7/29版本: 1.增加自定义参数,方便直接套数据运行。 pre_num3;%预采样数据个数 learn_pr0.85; %训练数据比例(不包括预采样数…

使用 ChatGPT 进行研究的先进技术

在这篇文章中,您将探索改进您研究的先进技术。尤其, 分析和解释研究数据进行文献综述并找出研究差距废话不多说直接开始吧!!! 分析和解释研究数据 一家小企业主希望分析客户满意度数据以改善客户服务。他们使用包含 10…

边缘计算对现代交通的重要作用

边缘计算之所以重要,是在于即使在5G真正商用之时,可以实现超大带宽(eMBB)的应用场景,但庞大数据量的涌现也就意味着需要在云和端传输过程中找到一个承接点,对数据进行预处理再选择是否上云。 边缘计算应用演…

源码学习初章-基础知识储备

文章目录 学前准备源码地址引言extern "C" 宏定义平台宏跨平台宏vstdio平台禁用警告宏 连接、双层宏定义函数宏系统函数宏自定义函数宏多语句执行宏do while0 普通宏定义 C的一些必备函数知识回调函数和函数指针回调函数wireshark-4.0.7源码例子函数指针wireshark4.0…

kafka集群搭建(Linux环境)

zookeeper搭建,可以搭建集群,也可以单机(本地学习,没必要搭建zookeeper集群,单机完全够用了,主要学习的是kafka) 1. 首先官网下载zookeeper:Apache ZooKeeper 2. 下载好之后上传到…

自动化测试框架unittest与pytest的区别!

引言 前面文章已经介绍了python单元测试框架,大家平时经常使用的是unittest,因为它比较基础,并且可以进行二次开发,如果你的开发水平很高,集成开发自动化测试平台也是可以的。而这篇文章主要讲unittest与pytest的区别&…

Grafana - TDEngine搭建数据监测报警系统

TDengine 与开源数据可视化系统 Grafana 快速集成搭建数据监测报警系统 一、介绍二、前置条件三、Grafana 安装及配置3.1 下载3.2 安装3.2.1 windows安装 - 图形界面3.2.2 linux安装 - 安装脚本 四、Grafana的TDEngine配置及使用4.1 登录4.2 安装 Grafana Plugin 并配置数据源4…

流数据湖平台Apache Paimon(一)概述

文章目录 第1章 概述1.1 简介1.2 核心特性1.3 基本概念1.3.1 Snapshot1.3.2 Partition1.3.3 Bucket1.3.4 Consistency Guarantees一致性保证 1.4 文件布局1.4.1 Snapshot Files1.4.2 Manifest Files1.4.3 Data Files1.4.4 LSM Trees 第1章 概述 1.1 简介 Flink 社区希望能够将…

10.python设计模式【代理模式】

内容:为其他对象提供一种代理一控制对这个对象的访问 应用场景: 远程代理: 为远程的对象提供代理虚代理:根据需要创建很大的对象保护代理:控制对原始对象的访问,用于对象有不同访问权限时 UML图 举个例…

新零售行业如何做会员管理和会员营销

蚓链数字化营销系统全渠道会员管理解决方案,线上线下统一管理,打造私域流量,微信、门店会员全渠道管理,打通私域流量池,实现裂变营销: 开启新零售之路,必然要摒弃原有的管理模式,大…

实训笔记7.27

实训笔记7.27 7.27笔记一、Hive数据仓库基本概念(处理结构化数据)1.1 Hive的组成架构1.1.1 Hive的客户端1.1.2 Hive的驱动程序1.1.3 Hive的元数据库 1.2 Hive和数据库的区别 二、Hive的安装配置三、Hive的相关配置项四、Hive的基本使用方式4.1 使用Hive的…

DMA传输原理与实现详解(超详细)

DMA(Direct Memory Access,直接内存访问)是一种计算机数据传输方式,允许外围设备直接访问系统内存,而无需CPU的干预。 文章目录 Part 1: DMA的工作原理配置阶段:数据传输阶段: Part 2: DMA数据…

Jmeter+MySQL链接+JDBC Connection配置元件+使用

参考大大的博客学习:怎么用JMeter操作MySQL数据库?看完秒懂!_jmeter mysql_程序员馨馨的博客-CSDN博客 注:里面所有没打码的都是假数据,麻烦大家自行修改正确的信息。 一、背景 需要取数据库中的值,作为…