当前位置: 首页 > news >正文

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

在嵌入式系统中,当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.zskr.cn/news/9249.html

相关文章:

  • CSP-S 2025
  • ENVI系列教程(七)——自定义 RPC 资料图像正射校正
  • Linux 笔记本充电限制【转发】
  • 别样的CSP-S初赛大战(又名:我和油一的那些年)
  • 范德蒙德卷积入门
  • 用 【C# + WinUI3 + 图像动画】 来理解:高数 - 函数 - 初等函数 - 行人-
  • ansible语句
  • 代码随想录算法训练营第四天 |24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II
  • 完整教程:【前端面试题✨】Vue篇(一)
  • 算法随笔(一) - 实践
  • 学python的第7天
  • Revit二次开发环境配置
  • CF1016G Appropriate Team
  • 深入解析:STM32-FreeRTOS操作系统-任务管理
  • 202508_浙江省网络安全测试职业职工技能竞赛_misc-1
  • 广二联考题解补全计划:
  • 如何在 C# 中将文本转换为 Word 以及将 Word 转换为文本 - 教程
  • Chapter 8 Contour / Shape Detection
  • 【左程云算法笔记016】双端队列-双链表和固定数组实现 - 教程
  • 2025年运营商API安全建设最佳实践:某头部省级电信案例解析与方案推荐
  • 面向对象入门2与类的识别
  • 板子大全
  • 通过人大金仓数据库的逻辑备份与还原功能实现数据迁移
  • 完整教程:GS1-128(EAN-128)编码构造方式
  • 第十二节:订单普通下单、支付回调、退款、退款回调详解
  • Chapter 7 Color Detection
  • PyQt数字转大写金额GUI程序开发及财务规范实现
  • 从零开始训练推理模型:GRPO+Unsloth改造Qwen实战指南
  • 爱锋拍照工具 - 隐私政策
  • 周计划+总结