STM32学习——.map文件知识的学习
1.查阅.map文件,先寻找Memory Configuration
查看整个代码运行程序的详情,比如flash的起始地址、大小,RAM的起始地址和大小等,根据这些地址可以判断某些段是在flash当中还是在SRAM当中。
2.再看程序的入口和主代码区域
- _estack是栈顶指针;
- _Min_Heap_Size/_Min_Stack_Size是链接脚本里预留的最小堆/最小栈
- .isr_vector是中断向量表,放在Flash的起始地址
向量表结构:
前4字节为MSP初始值,后4字节为复位向量地址(即Reset_Handler函数地址)
- .text是代码段,有起始地址和大小
要懂得怎么看:先看段名,再看地址,再看大小
.text 0x08000190 0xb11c
代码段在 Flash 里,从 0x08000190 开始,占 0xb11c 字节
补充:
.rodata段:只读常量段。存放常量,一般由const修饰的变量,放在flash中局部变量在栈(stack)中
3.再看.data和.bss段
这两个是RAM的核心内容,都属于静态内存分配。
1).data段是已经初始化过的非零值全局变量和局部静态变量,存放在Flash当中,程序运行时从Flash当中拷贝到RAM当中。其中
0x20000000:运行地址(VMA - Virtual Memory Address),即.data段在RAM中的目标位置0x1d4:段大小,468字节(十六进制0x1d4转换为十进制)load address 0x0800eb7c:加载地址(LMA),即.data段在Flash中的实际位置
.data段存放的变量
2).bss段是未初始化的或初始化为0全局变量和局部静态变量
- .bss段(Block Started by Symbol)是程序内存布局中用于存储未初始化的全局变量和静态变量的静态内存区域。该段内容在可执行文件中不占用实际存储空间,其内存分配由链接脚本记录地址范围并由系统在运行时完成
- 初始化机制:程序启动时,操作系统会自动将.bss段清零,确保所有未初始化或初始化为0的变量在程序执行前已成0
_sidata:.data初值在 Flash 里的起始地址_sdata:.data在 RAM 里的起始地址_edata:.data在 RAM 里的结束地址_sbss:.bss起始地址_ebss:.bss结束地址_estack:栈顶地址
4.Discarded input sections区域
Discarded input sections指的是在链接过程中被识别为未使用的代码或数据段,这些段因为没有被其他部分引用而被链接器主动丢弃,不会包含在最终的二进制文件中
可以利用该部分查看未使用的函数和变量,从而优化代码
