以STM32为例的MCU启动过程
以STM32为例的MCU启动过程
在面试的时候,好多位面试官问过这个问题,即从上电后,到第一行main函数语句的执行,软件部分都在做什么。这次看了微控制器是如何启动的? |STM32 为例演示微控制器的启动这个视频后,觉得很好,顺便整理下。
0x00000004 Reset Handler
处理器复位时,从中断向量表0x00000004位置读取Reset Handler的入口。
初始化SP,并且获取Reset Handler的入口地址,判断当前的Boot配置。如果0x1F开头则代表是SRAM引导或Bootloader引导;如果是0x08开头则代表是从Flash引导。如果从Flash里面引导,则执行ApplicationStart。


C Runtime Init
简单来说,就是将Flash里.data段拷贝到SRAM中,.bss段的内容在RAM内初始化。
- 初始化地址寄存器
ldr r0, =sdata ; 将 .data 段的起始地址(SRAM 中)加载到 R0 中
ldr r1, =edata ; 将 .data 段的结束地址加载到 R1 中
ldr r2, =sidata ; 将 .data 段在 Flash 中的起始地址加载到 R2 中
movs r3, #0 ; 初始化偏移量 R3 为 0
R0:SRAM 中 .data 段的起始地址。
R1:SRAM 中 .data 段的结束地址。
R2:Flash 中 .data 段初始值的起始地址。
R3:用于指示当前处理的数据块的偏移。
- 数据拷贝主循环
b LoopCopyDataInit ; 跳转到循环条件检查
在进入拷贝主循环前,先跳转到循环条件检查部分。
- 数据拷贝过程
CopyDataInit:
ldr r4, [r2, r3] ; 从 Flash 的 sidata 段中加载一个 4 字节值到 R4
str r4, [r0, r3] ; 将 R4 的值存入 SRAM 的 .data 段
adds r3, r3, #4 ; 偏移量增加 4 字节(指向下一个数据单元)
从 Flash 中 .data 段的初始值区域读取一个数据单元(4 字节)。
将该数据单元写入到 SRAM 中对应的 .data 段。
偏移量加 4,准备处理下一个数据单元。
- 循环条件检查
LoopCopyDataInit:
adds r4, r0, r3 ; 将当前拷贝目标地址 (R0 + R3) 存入 R4
cmp r4, r1 ; 比较目标地址是否到达 .data 段的结束地址
bcc CopyDataInit ; 如果目标地址小于结束地址,则继续拷贝
adds r4, r0, r3:当前的拷贝目标地址 = 起始地址 + 偏移量。
cmp r4, r1:判断当前目标地址是否已经超出 .data 段的结束地址。
bcc CopyDataInit(Branch if Carry Clear):如果目标地址尚未到达结束地址,继续拷贝。
SystemInit
跳转到该函数,做时钟等外设或其他配置的初始化。
void SystemInit(void)
{
/* FPU settings ------------------------------------------------------------*/
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */
#endif
#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM)
SystemInit_ExtMemCtl();
#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */
/* Configure the Vector Table location -------------------------------------*/
#if defined(USER_VECT_TAB_ADDRESS)
SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
#endif /* USER_VECT_TAB_ADDRESS */
}
libc_init_array
调用构造函数,主要与C++相关。
main
跳转到main函数的第一行,开始执行用户代码。
以STM32为例的MCU启动过程的更多相关文章
- 关于linux的一点好奇心(一):linux启动过程
一直很好奇,操作系统是如何工作的?我们知道平时编程,是如何让代码跑起来的,但那些都是比较高层次的东西.越往后,你会越觉得,像是空中楼阁,或者说只是有人帮你铺平了许多道理,而你却对此一无所知. 1. 操 ...
- STM32启动过程--启动文件--分析
一.概述 1.说明 每一款芯片的启动文件都值得去研究,因为它可是你的程序跑的最初一段路,不可以不知道.通过了解启动文件,我们可以体会到处理器的架构.指令集.中断向量安排等内容,是非常值得玩味的. ST ...
- STM32启动过程解读与跟踪验证
经过查阅各种官方文献和对代码进行单步跟踪,详细地叙述了STM32加电启动的具体过程.对于关键性的语句都指明了出处.下面将学习成果分享给大家,由于笔者知识有限,不当之处敬请指出. 为了更好的说明问题,先 ...
- 专家揭秘:STM32启动过程全解
电子发烧友网核心提示:本文主要阐述了STM32启动过程全面解析,包括启动过程的介绍.启动代码的陈列以及深入解析. 相对于ARM上一代的主流ARM7/ARM9内核架构,新一代Cortex内核架构的启动方 ...
- 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU启动那些事(8)- 从Raw NAND启动
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RT系列MCU的Raw NAND启动. 前面铺垫了七篇启动系列文章,终于该讲具体Boot Device了,我们知道i. ...
- 痞子衡嵌入式:飞思卡尔Kinetis系列MCU启动那些事(9)- KBOOT特性(IntegrityCheck)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔Kinetis系列MCU的KBOOT之完整性检测(Integrity Check)特性. Application完整性检测是非常 ...
- linux驱动由浅入深系列:PBL-SBL1-(bootloader)LK-Android启动过程详解之一(高通MSM8953启动实例)
转自:http://blog.csdn.net/radianceblau/article/details/73229005 http://www.aiuxian.com/article/p-14142 ...
- 痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU启动那些事(7)- 从SD/eMMC启动
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MXRTxxx系列MCU的SD/eMMC卡启动. 关于 i.MXRT 启动设备,痞子衡之前写过很多篇文章,都是关于串并行 NO ...
- Linux启动过程详解(inittab、rc.sysinit、rcX.d、rc.local)
启动第一步--加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它.这是因为BIOS中包含了CPU的相关信息.设备启动顺序信息.硬 ...
- Linux启动过程详解
Linux启动过程详解 附上两张图,加深记忆 图1: 图2: 第一张图比较简洁明了,下面对第一张图的步骤进行详解: 加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的 ...
随机推荐
- VulnHub-DC-6靶机-wpscan爆破+命令注入反弹shell+nmap提权
一.环境搭建 选择扫描虚拟机 选择靶机路径 这里如果出现报错,无法导入,如VMware出现配置文件 .vmx 是由VMware产品创建,但该产品与此版 VMware workstation 不兼容,因 ...
- 在鹅厂做java开发是什么体验
离职已有好几个月,准备写一篇关于之前在腾讯做Java开发的经历,现在来谈谈在Java领域里,在腾讯做Java开发的体验.随便写写别较真. 首先,介绍一下腾讯里与Java相关的部门.主要有CDG(云与智 ...
- Windows 提权-不安全的 GUI 程序
本文通过 Google 翻译 Insecure GUI Applications – Windows Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进 ...
- 非容器环境中使用Selenium,提升Chrome与ChromeDiver兼容性
背景 在 Windows 环境下使用 Selenium 时,Chrome 浏览器版本与 ChromeDriver 版本的兼容性问题是一个常见的困扰. 由于 Chrome 频繁更新,而 ChromeDr ...
- Proteus中数码管动态扫描显示不全(已解决)
前言 我是直接把以前写的 51 数码管程序复制过来的,当时看的郭天祥的视频,先送段选,消隐后送位选,最后来个 1ms 的延时. 代码在 Proteus 中数码管静态是可以的,动态显示出了问题--显示不 ...
- Golang入门:Linux上的go语言安装与配置
Tips:本文以本文撰写时的 Go 语言最新版本,也就是 go.1.19.2 版本为例. Linux 发行版本使用 Ubuntu 22.04.1 LTS 为例来做演示. 安装 C 工具 Go 的工具链 ...
- python pandas csv 大文件 DataFrame转换为List
python 将大文件读取为 DataFrame 时,直接对整个文件进行读取会比较耗时,甚至内存还会不足. https://pandas.pydata.org/pandas-docs/stable/u ...
- 基于pandas的数据清洗 -- 缺失值(空值)的清洗
博客地址:https://www.cnblogs.com/zylyehuo/ 开发环境 anaconda 集成环境:集成好了数据分析和机器学习中所需要的全部环境 安装目录不可以有中文和特殊符号 jup ...
- 如何不购买域名在云服务器上搭建HTTPS服务
step 1: 事前准备 step 1.1: 云服务器 购买一台云服务器(带有弹性公网IP),阿里云,腾讯云,华为云什么的都可以. 选择ubuntu系统 开放安全组策略(把你需要的协议/端口暴露出来) ...
- 阿里Java开发手册泰山版来袭
阿里Java开发手册自2016年12月7日发布公开版以来,距今已发布7个版本,被越来越多的公司拿来直接或略微修改后作为公司的Java开发规范手册,嫣然成为行业的标杆. 就在昨天早上8点,阿里Java开 ...