一、概述
1、说明每一款芯片的启动文件都值得去研究,因为它可是你的程序跑的最初一段路,不可以不知道。通过了解启动文件,我们可以体会到处理器的架构、指令集、中断向量安排等内容,是非常值得玩味的。
STM32作为一款高端 Cortex-M3系列单片机,有必要了解它的启动文件。打好基础,为以后优化程序,写出高质量的代码最准备。 本文以一个实际测试代码--START_TEST为例进行阐述。
2、整体过程概括STM32整个启动过程是指从上电开始,一直到运行到 main函数之间的这段过程,步骤为(以使用微库为例): ①上电后硬件设置SP、PC ②设置系统时钟 ③软件设置SP ④加载.data、.bss,并初始化栈区 ⑤跳转到C文件的main函数
3、整个启动过程涉及的代码推荐阅读启动过程涉及的文件不仅包含 startup_stm32f10x_hd.s,还涉及到了MDK自带的连接库文件 entry.o、entry2.o、entry5.o、entry7.o等(从生成的 map文件可以看出来)。
二、程序在Flash上的存储结构
在真正讲解启动过程之前,先要讲解程序下载到 Flash上的结构和程序运行时(执行到main函数)时的SRAM数据结构。程序在用户Flash上的结构如下图所示。下图是通过阅读hex文件和在MDK下调试综合提炼出来的。
MSP初始值 编译器生成,主堆栈的初始值
异常向量表 不多说
外部中断向量表 不多说
代码段 存放代码
初始化数据段 .
data
未初始化数据段 .bss
加载数据段和初始化栈的参数
加载数据段和初始化栈的参数分别有4个,这里只讲解加载数据段的参数,至于初始化栈的参数类似。
- 0x0800033c Flash上的数据段(初始化数据段和未初始化数据段)起始地址
- 0x20000000 加载到SRAM上的目的地址
- 0x0000000c 数据段的总大小
- 0x080002f4 调用函数_scatterload_copy
复制代码
需要说明的是初始化栈的函数-- 0x08000304与加载数据段的函数不一样,为 _scatterload_zeroinit,它的目的就是将栈空间清零。
三、数据在SRAM上的结构
程序运行时(执行到main函数)时的SRAM数据结构
[size=0.83em]微信图片_20230926162144.jpg (26.45 KB, 下载次数: 0) 下载附件 [color=rgb(153, 153, 153) !important]2023-9-26 16:25 上传
|
|