mcu 启动流程

MCU启动流程

MCU启动流程

    • MCU启动流程
      • 1 MCU的启动方式
      • 2 MCU程序启动执行过程
      • 3 启动过程的执行工作
      • 4 keil调式过程验证
      • 5 调试文件map

1 MCU的启动方式

单片机的启动方式,以stm32为例,如下:
不同的下载方式对应的不同的启动方式,stm32主要有三种启动方式:flash memory、system memory、Embedded SRAM
在这里插入图片描述
flash启动(最常用):stm32的flash能够擦写数十万次,用户通过JTAG或SWD模式,将程序下载至此,重新启动从此处启动
sytem memory (系统存储器启动):系统存储器是芯片内的一块特定的区域,系统存储器中预置了一段bootloader,bootloder将程序下载到flash区,通过flash启动
内嵌SRAM启动:从内存中直接启动代码,避免因小修改反复擦写flash内存,一般用于高速调试

2 MCU程序启动执行过程

MCU上电,根据BOOT的引脚(BOOT0、BOOT1)电平,来确定启动地址。一般地址是0x0000000,个别如stm32的启动地址是0x8000000(flahs区启动)。
stm32内部闪存的起始地址为0x8000000,程序从此处写入,中断向量表位于该位置,首先从0x8000000取出MSP的栈顶指针(设置堆栈),然后从中断向量表中取出复位中断向量,并执行复位中断程序来完成启动。
程序执行过程如图:
1、STM32复位后,会从地址为0x8000004处取出复位中断向量的地址,并跳转执行复位中断服务程序,如图1中标号1️⃣​所示。
2、复位中断服务程序执行的最终结果是跳转至C程序的main函数,如上图中标号2️⃣所示,而main函数应该是一个死循环,是一个永不返回的函数。
3、在main函数执行的过程中,发生了一个中断请求,此时STM32的硬件机制会将PC指针强制指回中断向量表处,如图中标号3️⃣所示。
4、根据中断源进入相应的中断服务程序,如图1中标号5️⃣所示。
5、中断服务程序执行完毕后,程序再度返回至main函数中执行,如图中标号6️⃣所示。
在这里插入图片描述

3 启动过程的执行工作

启动过程主要完成两部分工作:硬件环境、软件环境
硬件环境操作:
初始化时钟:初始化内核时钟,主时钟和各个外设的时钟
关闭看门狗:看门狗用来检测应用程序异常跑飞而复位CPU,在初始化阶段,没有“喂狗“的动作,有可能导致CPU 不断的复位,此处需要关闭看门狗
建立中断向量表:中断向量表作为中断源的识别标志,可以形成相应的中断入口地址,或者中断服务程序的入口地址的偏移量和段基值。CPU利用中断向量表转入中断服务程序处理相关到事务
初始化堆栈:堆栈的作用就是保护现场(上下文),函数调用或中断发生时,将当前执行地址压栈,调用完再返回执行此次的地址。在启动阶段,初始化堆栈的寄存器、堆栈大小、起始地址等
内存初始化:选择内部或外部RAM
软件环境操作:
把RO、RW从它们的加载域复制到运行域
初始化ZI域
初始化堆栈指针:包括C库所需要的内存空间、程序执行的所需资源、C库初始化

4 keil调式过程验证

进入调试模式,首先进入一个启动文件starup_ARMCM4.s的启动文件,运行指示光标,会停在SystemInit上:

starup_ARMCM4.s代码的前面是:栈大小stack size设置、堆大小 heap size的设置、一堆中断向量表 Vect Table
当前运行所在处为Reset_Handle处,在执行main 之前还需要执行 SystemInit,SystemInit在system_ARMCM4.c文件中,如下跳转至system_ARMCM4.c中的SystemInit函数
在这里插入图片描述
执行完SystemInit,将执行__main函数
在这里插入图片描述
参考:单片机启动过程: main之前干了啥

5 调试文件map

xxx.map文件是一种通过编译得到的调试输出信息文件,通过map文件可以了解函数的大小,入口地址、变量、参数的大小位置等一些列信息,用于解决内存越界以及数据溢出等问题。
map文件是在配置页面的Linker Listing选项卡进行配置:

map文件分析:map文件主要分为5大类,如下:
在这里插入图片描述
Section Cross References:模块、段(入口)交叉引用
配置勾选----->Cross Reference
在这里插入图片描述
针对第四条内容:
startup_armcm4.o(RESET) refers to startup_armcm4.o(STACK) for __initial_sp
表示startup_armcm4.o中的RESET段引用了startup_armcm4.o中的STACK段中的一个全局变量(或函数)__initial_sp
Removing Unused input sections from the image:移除未调用模块
配置勾选----->Unused Section Info
显示的是编译时从映像中被移除的未调用模块,以及它们的大小及总体统计内容
在这里插入图片描述
Image Symbol Table:映射符号表
配置勾选----->Symbols
该部分显示符号映射表,包括两个部分:Local Symbol(局部变量)和Global Symbol(全局变量)
在这里插入图片描述
在这里插入图片描述

Memory Map of the image:内存(映射)分布
配置勾选----->Memory Map
在这里插入图片描述
Image Entry point : 0x000000c1 映射入口地址
Load Region LR_IROM1 (Base: 0x00000000, Size: 0x0000026c, Max: 0x00040000, ABSOLUTE):指加载区域位于LR_IROM1开始地址0x00000000,大小有0x0000026c,这块区域最大为0x00040000
Execution Region ER_IROM1 (Base: 0x08000000, Size: 0x00001188, Max: 0x00080000, ABSOLUTE)
在这里插入图片描述
Execution Region RW_IRAM1 (Exec base: 0x20000000, Load base: 0x00000268, Size: 0x00001068, Max: 0x00020000, ABSOLUTE)
在这里插入图片描述
首先就是映像的入口地址0x000000c1,然后可以知道加载域的起始地址,大小,最后知道执行域ROM和RAM的起始地址和大小,其中0x20000000是RAM起始地址,0x00000000是ROM起始地址,在这里也就是flash。一些被丢弃掉的数据,比如没有使用的变量被优化后是不会在表中显示出来的。
Image component sizes:存储组成大小
配置勾选----->Size Info
在这里插入图片描述
Code:代码数据
RO-data:指只读数据,除了内联数据之外的常量数据
RW-data:指可读写、已初始化变量
ZI-data:为初始化变量

上面显示的几个区域的总体占用大小,其中:
Code、Ro-data:位于FLASH
Rw-data、ZI-data:位于RAM中
RW-data已初始化的数据会存储在Flash中,上电会从FLASH搬移至RAM
Total ROM Size就是下载到flash中的程序大小

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

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

相关文章

truffle 进行智能合约测试

本方法使用了可视化软件Ganache 前两步与不使用可视化工具的步骤是一样的(有道云笔记),到第三步的时候需要注意: 在truffle插件下找到networks目录,提前打开Ganache软件 在Ganache中选择连接或者新建,我在…

如何学习Java集合框架? - 易智编译EaseEditing

要学习Java集合框架相关的技术和知识,可以按照以下步骤进行: 掌握Java基础知识: 在学习集合框架之前,确保你已经具备良好的Java编程基础,包括语法、面向对象编程(OOP)原理和常用的核心类库等。…

MySQL备份与还原/索引/视图

MySQL备份与还原/索引/视图练习 文章目录 一、备份与还原1、使用mysqldump命令备份数据库中的所有表2、备份booksDB数据库中的books表3、使用mysqldump备份booksDB和test数据库4、使用mysqldump备份服务器中的所有数据库5、使用mysql命令还原第二题导出的book表6、进入数据库使…

STM32案例学习 GY-39环境监测传感器模块

STM32案例学习 GY-39环境监测传感器模块 硬件平台 野火STM32F1系列开发板正点STM32F1系列开发板STM32F103ZET6核心板GY-39环境监测传感器模块 GY-39环境监测传感器模块 GY-39 是一款低成本,气压,温湿度,光强度传感器模块。工作电压 3-5v…

thinkphp 上传图片

public function upload_img(){// 读取图片资源// 存储路径$path "uploads/avatar";$file request()->file(background_img);// 存储图片$info $file->rule(uniqid)->move($path);// 存储成功if ($info) {//获取到上传图片的路径名称$name_img $path . …

linux查看ipynb文件

linux查看ipynb文件 使用jupyter查看 使用jupyter查看 安装 pip install jupyter添加配置好的环境到jupyter notebook的kernel中: python -m ipykernel install --user --name mmdet --display-name "mmdet"运行jupyter notebook (在ipynb…

WebSocket理论和实战

一 WebSocket理论 1.1 什么是http请求 http链接分为短链接、长链接,短链接是每次请求都要三次握手才能发送自己的信息。即每一个request对应一个response。长链接是在一定的期限内保持链接(但是是单向的,只能从客户端向服务端发消息&#x…

pycharm import的类库修改后要重启问题的解决方法

通过将以下行添加到pycharm中的settings-> Build,Excecution,Deployment-> Console-> Python Console中,可以指示Pycharm在更改时自动重新加载模块: %load_ext autoreload %autoreload 2

ubuntu 设置系统时间矫正

1、安装ntpdate,同步标准时间 2、修改时区 3、在.profile文件中写入上面提示的信息,保存退出、更新配置文件或者重启生效 3.1、或者配合上面的cp那条命令,用下面的命令保存到底层 $ hwclock --systohc 4、重启之后,查看日期时间已…

中间件上云部署 rocketmq

中间件上云部署 rocketmq rocketmq部署一、rokectmq介绍二、rokectmq特性三、使用rocketmq理由四、rocketmq 核心概念五、rocketmq角色六、rocketmq集群部署方式七、rocketmq集群部署7.1 环境说明7.2 构建rocketmq镜像7.3 获取rocketmq-dashboard镜像7.4 rocketmq部署描述文件编…

linux安装mysql以及使用navicat连接mysql

目录 一、下载mysql 二、安装mysql 三、使用Navicat连接MySQL 四、常见问题 1、启动服务时报错 Failed to start mysql.service: Unit not found. 的解决方法。 2、登录过程出现:access denied for user’root’‘localhost’(using password:Yes) 的解决方…

Redis的缓存问题

说起Redis的缓存,我们知道前端发出的请求到后端,后端先从Redis中查询,如果查询到了则直接返回,如果Redis中未查询到,就去数据库中查询,如果数据库中存在,则返回结果并且更新到Redis缓存当中&…

《遗留系统现代化》读书笔记(基础篇)

目录 为什么要对遗留系统进行现代化? 什么是遗留系统? 遗留系统的现代化价值 总结 遗留系统的四化建设 代码现代化 架构现代化 DevOps 现代化 团队结构现代化 总结 本文地址:《遗留系统现代化》读书笔记(基础篇&#xff…

通讯录(纯C语言实现)

相信大家都有过通讯录,今天我来带大家实现以下最简单的通讯录,通过本篇文章,相信可以让大家对C语言有进一步的认识。 话不多说,我们先放函数的实现 #define _CRT_SECURE_NO_WARNINGS 1 #include "Contact.h"int Chea…

高时空分辨率、高精度一体化预测技术之风、光、水能源自动化预测教程

详情点击链接:高时空分辨率、高精度一体化预测技术之风、光、水能源自动化预测 第一:预测平台及安装 一、高精度气象预测基础 综合气象观测数值模拟模式; 全球预测模式、中尺度数值模式; 二、自动化预测平台 Linux系统 Crontab…

记一次rabbitmq消息发送成功,消费丢失问题

记一次rabbitmq消息发送成功,消费丢失问题 背景 测试数据归档,偶现数据未归档 排查 idea线上调试,log日志,数据库消息发送记录,代码分块重复执行看哪块出的问题,结果均无问题,最后使用rabbi…

AI销售工具:驱动销售团队效率和个性化服务的未来

在数字化时代,AI销售工具成为推动销售行业发展的重要力量。这些创新工具融合了人工智能技术和销售流程,以提高销售团队的效率和提供个性化服务为目标。随着科技的不断进步,AI销售工具正引领着销售行业走向一个更加智能和高效的未来。 AI驱动的…

数据结构 ~ 栈、队列

栈 一个后进先出的数据结构、JS中没有栈,可以使用 Array 模拟 const stack [] stack.push(1) // 入栈 stack.push(2) // 入栈 const item1 stack.pop() // 出栈 const item2 stack.pop() // 出栈以上代码可以使用 nodeJs 断点调试(F5启动&#xff0…

【Linux】进程信号

文章目录 1. 信号的理解1.1 什么是进程信号1.2 见见进程信号1.3 信号的发送与记录1.4 信号的处理1.4.1 信号的三种处理方式1.4.2 核心转储 2. 信号的产生2.1 终端按键产生信号2.2 系统调用产生信号2.3 软件异常产生信号2.4 硬件异常产生信号 3. 信号的保存3.1 信号其他相关概念…

电子锁语音芯片方案,低功耗声音提示ic,WT588F02B-8S

随着科技的不断发展,电子锁已成为现代社会中,安全性和便利性并存的必备设备。如何为电子锁行业增添智能化、人性化的功能已成为行业内的热门话题。 在这个迅速发展的市场中,深圳唯创知音推出了一款语音交互方案——WT588F02B-8S 低功耗声音提…