上期我们学习了STM32的寄存器映射相关内容,本期我们一起来学习STM32MAP文件和启动过程的相关内容
MAP文件浅析
1.MDK中间文件
在MDK编译生成工程文件之后会产生大量的文件,其中有一些文件包含了项目工程的各种信息,称之为中间文件,常见的中间文件有以下:
文件类型 |
简介 |
.o |
可重定向对象文件,每个.c/.s文件都会对应一个.o文件 |
.axf |
可执行对象文件,由.o文件连接生成,仿真是会用到此文件(通过仿真器将其下载到MCU进行仿真调试) |
.hex |
.hex文件:它是由.axf转换而来的一个可执行对象文件(使用ISP软件进行程序下载的) |
.map |
连接器生成的列表文件,包含程序的函数调用关系、FLASH和RAM 占用情况及其详细的汇总信息 |
其他 |
.crf、.d、.dep、.lnp、.lst、.htm、.build_log.htm等一般用不到 |
注意:
- 可重定向是指该文件包涵数据、代码,但是没有指定地址,他的地址可以由后续链接的时候进行指定,不可重定向是指这种文件所包含的数据/代码都已经指定地址了,不能再改变
- hex文件和.bin文件的区别是:.bin文件不含地址信息,全部是可执行代码;而hex文件则是包含地址信息的可执行代码。同样的.bin文件也是由.axf文件转换而来的
2.MAP文件浅析
MAP文件是MDK编译代码后,产生的集程序、数据及IO空间的一种映射列表文件,它包含了:各种.c文件、函数、符号等的地址、大小、引用关系等信息,有助于我们分析.c文件的Flash和RAM占用大小,调试代码,优化程序。
如下为MAP文件的组成:
组成部分 |
简介 |
程序段交叉引用关系 |
描述个文件之间函数的调用关系 |
删除映像未使用的程序段 |
描述工程中未被用到而被删除的程序端(代码/函数) |
映像符号表 |
描述各符号(程序段/变量/数据)在存储器中的地址,类型,大小 |
映像内存分布图 |
描述各个程序段(函数)在存储器中的地址及占用大小 |
映像组件大小 |
给出整个映像代码(.o)占用空间汇总信息 |
实际的MAP文件:
-
映像符号表
- 映像内存分布图(我也看不太懂了)
-
映像组件大小(整个代码的空间汇总信息)
你找不到你的MAP文件???
这个是MAP文件的具体地址…………
如果还是找不到你的MAP文件的话,那你就应该检查一下是否勾选了生成map文件。
STM32启动过程
启动过程
1,内核复位后,从地址 0x0000 0000 处取出堆栈指针 MSP 的初始值,该值就是栈顶地址,MSP=_initial_sp,
2,从地址 0x0000 0004 处取出程序计数器指针 PC 的初始值,该值是复位向量, PC 指针=Reset_Handler
注意:
芯片厂商可以会把0x0000 0000和0x0000 0004地址映射到其它的地址!!!
不同在启动方式中,内核获取堆栈指针 MSP 的初始值和程序计数器指针 PC 的初始值的地址不同,在之前的 “夜深人静学32系列2——STM32设计原理&最小系统” 中我们介绍了BOOT启动电路,根据BOOT0引脚的电平状态决定启动方式。,具体的对应关系如下:
3,通过PC指针进入Reset_Handler函数后,初始化中断向量表,初始化系统时钟(SystemInit),初始化堆栈,调用__main函数,进入mian函数。
启动文件介绍
单片机启动后第一个执行的文件就是启动文件,启动文件主要负责以下内容:
这里介绍以下栈和堆的区别:
- 栈区:编译器自动分配和释放,存放函数参数、局部变量等
- 堆区:程序员分配和释放,如malloc、calloc、realloc等
当函数局部变量较多,嵌套关系复杂时,需加大栈大小(Stack_Size)!