startup code和reset handler有何区别?微控制器启动/复位时调用哪个?
嵌入式开发启动相关问题解答
1. startup code与reset handler的核心区别
二者是嵌入式启动流程中前后衔接的两个模块,核心差异如下:
- 定位不同:Reset Handler是芯片硬件定义的复位异常入口,是整个系统上电/复位后第一个被硬件调用的代码节点,属于Startup Code的首个组成部分;Startup Code是微控制器从复位结束到进入
main函数之前,所有初始化代码的全集。 - 职责不同:Reset Handler的职责极精简,仅完成栈指针寄存器的初始赋值,之后直接跳转到Startup Code的主体逻辑执行;Startup Code负责完成C/C++运行环境搭建(清BSS段、复制全局变量到RAM、初始化静态变量)、核心硬件配置(系统时钟、外置DRAM/Flash初始化)、可选的系统级预配置,最终跳转到应用层入口
main函数。
2. 正常启动与复位操作的调用逻辑
不存在二选一的调用逻辑,二者是固定的先后执行顺序:
- 不管是正常冷启动(上电)还是任何形式的复位操作(软复位、硬件复位、看门狗复位等),芯片复位完成后硬件都会自动跳转到Reset Handler的地址执行。
- Reset Handler执行完最小初始化后,会直接调用Startup Code的其余逻辑。
3. Reset Handler的存放位置
绝大多数情况下,Reset Handler和Startup Code的汇编逻辑共同存放在startup.s文件中(ARM架构下通常会带上芯片型号命名,比如startup_stm32h750xx.s),属于启动汇编文件的核心组成部分。
少数厂商的SDK会将Reset Handler单独拆分到独立的汇编文件,编译后统一链接到向量表指定的固定地址段。
内容的提问来源于stack exchange,提问作者Jboud
相关产品推荐
相关产品推荐

