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

【STM32】启动过程分析

本文记录一下STM32F4系列的启动过程,也就是从STM32芯片上电复位执行的第一条指令,到执行用户编写的main函数这之间的过程。

1.启动模式

上电复位,硬件复位和软件复位。当产生复位,并且离开复位状态后,CM4 内核做的第一件事就是读取下列两个 32 位整数的值:
(1)从地址 0x0000 0000 处取出堆栈指针 MSP 的初始值,该值就是栈顶地址。
(2)从地址 0x0000 0004 处取出程序计数器指针 PC 的初始值,该值指向复位后执行的
第一条指令。

事实上,0x0000 0000 和 0x0000 0004 两个的地址可以被重映射到其他的地址空间。例如:我们将 0x0800 0000 映射到 0x0000 0000,即从内部 FLASH 启动,那么内核会从地址 0x0800 0000 处取出堆栈指针 MSP 的初始值,从地址 0x0800 0004 处取出程序计数器指针PC 的初始值。CPU 会从 PC 寄存器指向的地址空间取出的第 1 条指令开始执行程序,就是开始执行复位中断服务程序 Reset_Handler。将 0x0000 0000 和 0x0000 0004 两个的地址重映射到其他地址空间,就是启动模式选择。

2.启动文件

STM32 启动文件由 ST 官方提供,在官方的 STM32Cube 固件包里,对于 STM32F407 系列芯片的启动文件,我们选用的是 startup_stm32f407xx.s 这个文件。启动文件用汇编编写,是系统上电复位后第一个执行的程序。
启动文件主要做了以下工作:
1、初始化堆栈指针 SP = _initial_sp
2、初始化程序计数器指针 PC = Reset_Handler
3、设置堆和栈的大小
4、初始化中断向量表
5、配置外部 SRAM 作为数据存储器(可选)
6、配置系统时钟,通过调用 SystemInit 函数(可选)
7、调用 C 库中的 _main 函数初始化用户堆栈,最终调用 main 函数

3.启动流程

以代码下载到内部 FLASH的情况举例,即代码从地址 0x0800 0000 开始被执行。

当产生复位,并且离开复位状态后,CM4 内核做的第一件事就是读取下列两个 32 位整数的值:
(1)从地址 0x0800 0000 处取出堆栈指针 MSP 的初始值,该值就是栈顶地址。
(2)从地址 0x0800 0004 处取出程序计数器指针 PC 的初始值,该值指向中断服务程序Reset_Handler。

4.map文件分析

为了更好的分析 map 文件,我们先对需要用到的一些基础概念进行一个简单介绍,相关
概念如下:
⚫ Section:描述映像文件的代码或数据块,我们简称程序段
⚫ RO:Read Only 的缩写,包括只读数据(RO data)和代码(RO code)两部分内容,
占用 FLASH 空间
⚫ RW:Read Write 的缩写,包含可读写数据(RW data,有初值,且不为 0),占用
FLASH(存储初值)和 RAM(读写操作)
⚫ ZI:Zero initialized 的缩写,包含初始化为 0 的数据(ZI data),占用 RAM 空间
⚫ .text:相当于 RO code
⚫ .constdata:相当于 RO data
⚫ .bss:相当于 ZI data
⚫ .data:相当于 RW data

.map 文件是编译器链接时生成的一个文件,它主要包含了交叉链接信息。通过.map 文件,我们可以知道整个工程的函数调用关系、FLASH 和 RAM 占用情况及其详细汇总信息,能具体到单个源文件(.c/.s)的占用情况,根据这些信息,我们可以对代码进行优化。.map 文件可以分为以下 5 个组成部分:
1, 程序段交叉引用关系(Section Cross References)
2, 删除映像未使用的程序段(Removing Unused input sections from the image)
3, 映像符号表(Image Symbol Table)
4, 映像内存分布图(Memory Map of the image)
5, 映像组件大小(Image component sizes)

http://www.jsqmd.com/news/780504/

相关文章:

  • Windows光标转Linux主题:Project Sekai风格光标自动化转换指南
  • 原神144帧终极解锁指南:告别60帧限制,体验丝滑战斗
  • Cyclone III FPGA在LCD HDTV图像处理中的优势与应用
  • 说好的“常开常新”呢?上汽荣威这波操作,老车主彻底怒了!
  • 命令行工作流引擎cli-continues:基于状态的条件自动化实践
  • 山东化工厂楼顶大字设计指南:2024年安全规范与创新趋势解析
  • 微信小程序插画共享平台(30264)
  • AI主播与MCP协议集成:智能视频创作工作流实践
  • KG-RAG:基于知识图谱的检索增强生成技术,重塑生物医学问答
  • 从白炽灯到LED:家庭节日照明升级的技术原理、选购与实战指南
  • OpenClearn:AI智能体工作空间自动化清理工具实战指南
  • Verl-Tool:基于强化学习的工具调用智能体训练框架详解
  • DevContext:为AI编程助手构建持久化记忆系统的四层模型与实践
  • Redis分布式锁进阶第三十五篇
  • 2026年靠谱的除油氢氧化钠厂家综合对比分析 - 行业平台推荐
  • 实战入口:Claude 到底在哪用?网页版、桌面端与多端场景全解
  • OpenPicoRTOS:ARM Cortex-M微控制器上的极简实时操作系统设计与实战
  • AI绘画提示工程实战:从权重语法到高阶控制全解析
  • 为什么 k8s controller manager 会出现无限重启的情况?
  • 如何从上游策略实现抗体药物的质量控制?
  • 从零构建团队专属CLI工具:自动化项目脚手架与代码生成实践
  • Code Buddy:实时监控AI编程助手状态,提升开发效率与掌控感
  • 方形补偿器哪个靠谱?选型指南来了
  • Cursor AI编程规则配置指南:提升代码生成质量与团队协作效率
  • 6条Claude Code实践中的经验与思考
  • 国内内容创作者必收:Gemini 3.1 Pro解决办公问题的免费入口
  • Llama模型转ONNX:原理、实践与性能优化全解析
  • L-system与硬件补偿技术在自动钢琴音乐生成中的应用
  • Rust Trait对象与多态:实现灵活的代码复用
  • 从零构建C++/OpenGL轻量级渲染引擎:核心架构与实现详解