IAR Embedded Workbench中的MCU启动过程分析

news/2025/9/21 22:24:08/文章来源:https://www.cnblogs.com/jiangchang/p/19104291
在嵌入式系统中,当MCU复位之后,需要运行对应的启动代码来对系统进行初始化,然后才会调用main函数,开始运行用户的代码。通常情况下,对应的启动代码一般是工具厂商或者芯片厂商提供,嵌入式软件开发工程师不需要特别关注。但是如果要实现和ROM和RAM相关的功能必须需要修改对应的启动文件。Step1当MCU复位之后,MCU会从对应的复位向量开始运行,初始化Stack pointer指向指定Stack区域的末尾。Stack区一般会在汇编中去定义起始地址和结束地址。
疑问1:为何第一步指向栈
向量表首项约定:Cortex-M系列MCU复位后,硬件会从0x00000000地址读取第一个32位值作为主栈指针MSP的初始值(即栈顶地址),第二个值(0x00000004)才是复位向量(程序入口地址)。这是ARM架构的硬性规定。若未初始化SP,后续的压栈操作(如函数调用、中断处理)会因栈空间未定义而崩溃,导致硬件错误(HardFault)。
疑问2:为何指向栈尾
大多数MCU的栈从高地址向低地址扩展(递减栈)。初始化SP指向栈区域的末尾(高地址),确保首次压栈操作(如保存寄存器)不会越界写入非法内存。若SP指向栈起始地址(低地址),压栈操作会覆盖相邻的堆或数据区,导致数据损坏或程序异常。Step2一般官网会提到调用_low_level_init函数进行相关的初始化。我们汽车电子针对Bootioader和安全等级写的启动文件会做如下动作:
初始化时钟,当然不是必选,对时钟响应要求不是很高的可以放在main函数的初始化实现。
关闭内部看门狗寄存器。后续main的初始化函数中可以再次选择激活与否,次操作确保启动过程中不激活。
芯片自带的ECC的check,ROM区check和RAM区check。ROM区一般会使用CRC校验,也有的仅简单的读取操作,通过读的过程去检测是否有硬件错误。RAM区的算法就十分常见,数据反转存储并还原。
初始化MCU所需要的中断。当然仅限于外设中断不包含芯片的硬件中断,比如HARDFAULT。
初始化watchdogtimer(非必须)。
读取RCM寄存器(ARM)获取复位信息从而做出软复位和硬复位。复位和汽车行业的UDS协议某些需求相关,需要谨慎配置。
硬复位会复位所有RAM区,不同产品可能会有细微的差别。
软复位一般针对栈区和某些特殊的BSS段。
_iar_data_init3属于库函数将ROM区的某些数据copy到RAM区,比如初始值为非0的变量,会从ROM拷贝到RAM。具体可以详见其它文档和库代码。简单说明:对于int i=1这类变量,编译器会将它们的初始值存储在Flash的,data段中,而运行时变量本身在RAM的.data区域。因此会有一个ROM到RAM的copy动作,同时表示这种变量既占用Flash又占用RAM。对于声明为int i=0的全局/静态变量,编译器会将它们分配到RAM的.bss段(Block Started by Symbol)。该段的特点是不占用Flash空间,仅记录变量大小。Step3运行main函数,可以个性化定制不同的应用需求。后记:
1.通常情况下,如果ICF文件中添加了initialize by copy命令,linker会自动选择并添加对应的启动代码来完成对应的启动过程。对应的启动代码通过库文件的方式进行link,可以通过map文件查询。
2.map文件里面INIT TABLE章节会列出对应的全局和静态变量的初始化信息:初始值为0的会使用_iar_zero_init3进行初始化,初始值为非0的会使用_iar_copy_init3(也有项目使用的是_iar_lz77_init_single3)进行初始化。参考文献:
1.IAR Embedded Workbench中的MCU启动过程

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

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

相关文章

CSP-S 2025

/* 又是一年CSP,也许是最后一次了罢?谁知道呢。 经典GD CSP必下雨,被淋透了。半睡半醒地下大巴,今年为什么全ZS都去JZ啊,完全不分流可还行。 说不紧张都是假的,毕竟考不好真退役了。唉呦我去讨论区怎么这么多钓鱼…

ENVI系列教程(七)——自定义 RPC 资料图像正射校正

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

(多线程)线程安全和线程不安全 产生的原因 synchronized关键字 synchronized可重入特性死锁 如何避免死锁 内存可见性 - 详解

(多线程)线程安全和线程不安全 产生的原因 synchronized关键字 synchronized可重入特性死锁 如何避免死锁 内存可见性 - 详解2025-09-21 22:20 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !impo…

Linux 笔记本充电限制【转发】

Linux 笔记本充电限制【转发】https://www.bilibili.com/opus/970651970527297540 最近主要把笔记本放家里用。在学校用的时候搬来搬去,当然充满电最好。然而如果是固定地用,只要插电就行了,电量无所谓。 对于大部分…

别样的CSP-S初赛大战(又名:我和油一的那些年)

一次平凡的出行勾起的胡思乱想。事实上,这篇文章和标题有关的内容并不是很多,所以我补了个又名。但它的全部确实是由此引起的。(引用可以这样使用么?><今年的气温转变得很突然。前两天我还在嫌弃机房的空调太…

第01周 预习、实验与作业:绪论与Java基本语法

1.【1】企业级服务器后端开发 【2】Web应用后端/API构建 【3】Android移动应用等邻域 2.【1】Java程序编译一次就会生成.class文件,在任何有安装Java虚拟机(JVM)的操作系统上都能运行,不用重新编译。 【2】要安装J…

刷新记录:TapData Oracle 日志同步性能达 80K TPS,重塑实时同步新标准 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

范德蒙德卷积入门

范德蒙德卷积入门范德蒙德卷积 范德蒙德卷积(Vandermonde Convolution)是组合数学中的一个重要公式,常用来计算两个组合数的卷积。 定义 给出公式: \[\sum_{i=0}^{k}\binom{n}{i}\binom{m}{k-i} = \binom{n+m}{k} \]证…

详细介绍:算法题(203):矩阵最小路径和

详细介绍:算法题(203):矩阵最小路径和pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…

JAVA中ArrayList主要语法(小白)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

使用jdbcTemplate查询数据库

springboot2版本项目中已经整合了mybatis框架,yml文件中配置好了数据源, 现在想再使用jdbcTemplate查询另外一个数据库,需要怎么配置 # 这是你现有的MyBatis数据源配置(假设使用默认前缀) spring:datasource:url:…

STM32 单片机创建 - I2C 总线

STM32 单片机创建 - I2C 总线2025-09-21 21:55 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important…

线性结构之链表预备知识typedef[基于郝斌课程]

typedef:是c语言的一个关键字,用于给已知数据类型取一个别名 例如typedef unsigned char uint8;此时 uint8 也就是 unsigned char 与define的区别:typedef只可用于对数据类型进行取新名字,define无此限制 typedef由…

Excel滚动表格表头不见了,来回翻动很麻烦,Excel如何固定显示表头?

Windows 系统 冻结首行表头:选中第二行,按下 Ctrl + Shift + F,然后松开按键,再按 F 键,就能冻结首行,让表头始终显示。 冻结首列表头:选中第二列,按下 Ctrl + Shift + F,松开后按 C 键 ,即可冻结首列。 冻结…

asfp导入framework搭建环境

修改大内存,必须要32GB及以上 先关闭正在使用的 swapfile # 查看当前挂载的交换分区/文件 sudo swapon --show# 若显示有 /swapfile,执行以下命令关闭 sudo swapoff /swapfile# 创建新的 swapfile(以 16GB 为例,根…

赛前训练2 连通性问题

以下,斜体表示注意点,粗体表示技巧点。 A spfa 最长路、环具有特殊性质考虑缩点。 容易发现环上的点可以通过跑很多次直到点权全部为 \(0\),于是缩点跑 spfa 最长路即可。实现B 必经边考虑割边,割边考虑边双。 我们…

用 【C# + WinUI3 + 图像动画】 来理解:高数 - 函数 - 初等函数 - 行人-

我记性差,记不住数学公式,希望通过图像化来加深视觉记忆,转化为数学“感觉” “直觉”,在需要的时候,能够 “想到” 类似的场景。通过 C# + WinUI3,对 函数的分类、基本初等函数 进行了学习,图像中眼花缭乱的感…

ansible语句

when判断就是符合条件的话,就可以执行这个模块的内容了默认的when判断,识别变量名,不需要{{}}来引用变量,但是如果是值的话,就需要双引号或者单引号才行vars:name: rhel9when: name # 不需要引号when: "test…

Window 连接 Ubuntu远程桌面

打开Ubuntu远程桌面配置自动登录 编辑 GDM 配置文件(适用于 GNOME 桌面) sudo nano /etc/gdm3/custom.conf [daemon] AutomaticLoginEnable = true AutomaticLogin = 你的用户名 # 替换为实际用户名固定远程密码 创…