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

启动文件:0x08000000第一个字是栈顶,第二个字是复位入口

短文标题:启动文件:0x08000000第一个字是栈顶,第二个字是复位入口

你有没有想过一个问题:单片机通电后,执行的第一个指令在哪?为什么程序从main开始跑?不是main,甚至不是Reset_Handler。上电后,硬件自动做两件事:先取栈顶地址,再取复位向量。没有栈,C语言无法运行——所以硬件第一步是设栈,第二步才取第一条指令。上电后硬件自动完成的两件事

  1. 从地址0x08000000读取栈顶地址(__initial_sp)→ 写入MSP(主栈指针)
  2. 从地址0x08000004读取复位向量(Reset_Handler地址)→ 跳转执行

这两个地址固定,由启动文件定义,不可更改。中断向量表的结构(存放在Flash起始)

栈顶地址错误会怎样?

  • 指向ROM(Flash)→ 压栈操作覆盖代码区 → 立即HardFault
  • 超出RAM范围 → 压栈到未映射地址 → BusFault → HardFault
  • 未对齐(奇数地址)→ 总线错误

启动文件写错,单片机连启动都启动不了。

Reset_Handler做了什么?

Reset_Handler:

LDR R0, =SystemInit

BLX R0 ; ① 配置时钟

LDR R0, =__main

BX R0 ; ② C库入口(初始化data/bss,调用main)

SystemInit:配置Flash等待周期、设置PLL、切换系统时钟。

__main(不是main):初始化已初始化的全局变量(.data段)→ 清零未初始化的全局变量(.bss段)→ 最后调用main。

VTOR重定位(Bootloader→APP),通过SCB->VTOR寄存器可将向量表重定位到RAM或Flash其他地址:

SCB->VTOR = 0x08004000; // APP从偏移0x4000开始

Bootloader跳转APP前必须重设VTOR,否则APP的中断向量仍指向Bootloader区。

这个故事的启示,main不是CPU执行的第一个函数。栈顶地址和复位向量,在main之前就已经被硬件加载。启动文件写错,main永远跑不起来。写在最后,调试“上电没反应”,最先检查中断向量表:查看0x08000000:第一个字是不是RAM地址?第二个字是不是Reset_Handler地址?

这两个地址对了,单片机才有可能“活”过来。


(本文灵感源于于振南《新概念ARM32单片机》教程第5.5节“ARM32启动流程与中断控制器配置”。)觉得有用?点赞、转发,让更多人看懂启动文件和向量表的底层逻辑。

http://www.cnnetsun.cn/news/3328477.html

相关文章:

  • Win11多软件报错排查指南:驱动冲突与系统修复实战
  • sRGB 100% 色域覆盖选购指南:3 步识别厂商参数陷阱,避免色彩过饱和
  • 非刚性ICP配准技术:解决点云千层饼现象,实现高质量3D重建
  • Unicode字符处理实战:解决用户输入特殊符号与表情的安全方案
  • 栈序列问题实战:5元素入栈序列的14种合法出栈序列枚举与验证
  • 利用 Blazor 与 Native AOT 提升客户端应用的离线体验
  • QMCDecode终极指南:3步释放QQ音乐加密音频的完整macOS解决方案
  • USB/IP 系统服务配置:3 种开机自启与 udev 自动绑定方案对比
  • MateClaw 1.8.0 发布:全开源个人 AI 操作系统,一句话把公众号图文写进草稿箱
  • HarmonyOS APP实战-画图APP - 第2篇:核心框架搭建
  • 从零开始:大气层整合包系统如何让Switch破解变得简单又安全
  • 2026 论文AI率助手横向对比:公认好用的,科研党救急指南
  • 星网宇达:公司与近期市场关注的长征十号乙运载火箭海上回收技术突破不存在业务关联
  • 题型归纳与重要模版
  • 工业负载控制:TPD2017FN与PIC18F57K42的智能驱动方案
  • C++14数字分隔符:提升代码可读性的零开销语法糖
  • ROS 2 Galactic 在 Ubuntu 22.04 环境下的 3 种安装方式与避坑实测
  • Linux 挖矿病毒应急响应:从 top 异常到 chattr 恢复的 5 步排查手册
  • SAP SD POD 配置与 VLPOD 操作:3步完成交货证明与开票数量同步
  • 龙魂蚁群引擎 v2.0 · 深度学习与融合报告
  • Canal 1.1.5 数据同步性能调优:解析并行度与MQ参数配置实测
  • 终极macOS窗口管理指南:用Loop告别桌面混乱的完整教程
  • [论文学习]LLM-based AI Agent 安全威胁与防御系统性综述
  • 如何用 DeepSeek 搭建自己的 RAG 知识库问答系统?
  • 30分钟快速搭建wvp-GB28181-pro:国标视频监控平台容器化部署终极指南
  • 面向演艺合作的头条号清单记录表设计
  • 高压与低压系统互联的光耦隔离技术解析
  • 编译原理实战:从正则表达式到DFA转换的5步算法与Python实现
  • ADP5350与PIC32MX460F512L构建智能电源管理系统
  • Oracle SQL Developer 23.1.1 安装配置:Windows/Linux/Mac 三平台 5 步避坑指南