keil中的Map文件
1、map文件在哪里
打开配置页面的Listing选项卡,可以看到map文件在listing文件夹中,或者直接双击工程名就能直接打开map文件
可以看到组框中有很多勾选项,功能如下:
最上面一个“Liinker Listing”是生成Map文件的功能,选中才会生成map文件 by----inurlcn-Map文件分析
选项 | 功能 | 说明 |
---|---|---|
Memory Map | 内存映射 | 各内存使用情况。 |
Callgraph | 图像映射 | callgraph 这里没有作用,但是在工程目录下有个 *.htm文件。callgraph 表示的是函数调用的堆栈使用以及子函数调用信息 |
Symbols | 符号 | Local Symbols和Global Symbols,各*.o文件里面的符号表 |
Cross Reference | 交叉引用 | Section Cross References,包括.text 参考 其他各段。或者各段之间的相互参考。 |
Size Info | 大小信息 | Object Name、Library Member Name、Library Name三大分类的各个.o文件(编译输出文件)所占用的Code类型、RO Data、RW Data、ZI Data、Debug类型所占用的空间 |
Totals Info | 统计信息 | Object Totals和Library Totals占用的总的统计,以及此二者之和,以及Total RO Size 、Total RW Size 、Total ROM Size 。并且给出了ELF文件的大小和存放在ROM里面占用的大小 |
Unused Section Info | 未调用模块信息 | Removing Unused input sections from the image.主要是显示未调用的Section(在ELF文件里面删除)的信息。可以当做是*.c文件编译了,但是没有被调用,所以被EFL文件里面删除了 |
Veneers Info | 装饰信息 | 这个暂时还没有信息,搜索了下Veneers的功能是:当linker发现有ARM指令和Thumb指令相互调用时(ARM-Thumb Interworking),就会插入一段代码(称之为veneer),从而实现程序状态的切换。 |
只有勾选了相应的选项Map文件中才会有对应的信息
2、map文件有什么作用
Map文件一种是通过编译得到的一个调试输出信息文件,通过Map文件可以知道函数的大小,入口地址,变量、参数的大小位置等一些重要信息。解决内存越界数据溢出等问题。
3、map文件分析
Map文件分为5大类
Map标号名 | 功能 |
---|---|
Section Cross References | 模块、段(入口)交叉引用 |
Removing Unused input sections from the image | 移除未调用模块 |
Image Symbol Table | 映射符号表 |
Memory Map of the image | 内存(映射)分布 |
Image component sizes | 存储组成大小 |
文件中以======================================
作为内容分隔
1、Section Cross References:模块、段(入口)交叉引用
配置中需要勾选:Cross Reference
具体内容如下:
比如第一条内容:
“startup_stm32f10x_hd.o(RESET) refers to startup_stm32f10x_hd.o(STACK) for __initial_sp”
表示startup_stm32f10x_hd.o文件里的RESET段引用了startup_stm32f10x_hd.o文件里的 Stack段里的一个全局符号__initial_sp,可能是全局变量也可能是一个函数。
如下表示在main中引用了myadd中的MyAdd函数,该Map是之前使用自有库的那个程序的,main.o是main.c生成的过程文件。
2、Removing Unused input sections from the image:移除未调用模块
配置中需要勾选:Unused sections info
显示的是编译时从映像中被移除的未调用模块,以及它们的大小
在最后是总体统计内容
该移除模块的功能与优化等级有关,在选项卡c/c++的Language/Code Generation中设置
3、Image Symbol Table:映射符号表
配置中需要勾选:Symbol
该部分显示符号映射表,包括两个部分:Local Symbol和Global Symbol
Local Symbol:局部符号
Global Symbol:全局符号
如上图,其中,几列分别为:
Symbol Name(符号名称)
Value(存储对应的地址)
Ov Type(符号对应的类型)
Size(存储大小)
Object(Section)(段目标)
4、Memory Map of the image:内存(映射)分布
配置中需要勾选:Memory Map
1、Image Entry point : 0x08000131:指映射入口地址
2、Load Region LR_IROM1 (Base: 0x08000000, Size: 0x000011b4, Max: 0x00080000, ABSOLUTE):指加载区域位于LR_IROM1开始地址0x08000000,大小有0x000011b4,这块区域最大为0x00080000.
3、Execution Region ER_IROM1 (Base: 0x08000000, Size: 0x00001188, Max: 0x00080000, ABSOLUTE):
4、 Execution Region RW_IRAM1 (Base: 0x20000000, Size: 0x00000430, Max: 0x00010000, ABSOLUTE):
3、4就是配置选项卡中的Target页面的存储器选择中内容,如下:
这里主要有几个点,首先就是映像的入口地址0x8000131,然后可以知道加载域的起始地址,大小,最后知道执行域ROM和RAM的起始地址和大小,其中0x20000000是RAM起始地址,0x08000000是ROM起始地址,在这里也就是flash。一些被丢弃掉的数据,比如没有使用的变量被优化后是不会在表中显示出来的。
项目 | 说明 |
---|---|
Base Addr | 存储地址 |
Size | 存储大小 |
Type | 类型 |
Attr | 属性 |
Section Name | 段名 |
Object | 目标 |
5、Image component sizes:存储组成大小
配置中需要勾选:Size Info 或只勾选Totals只显示总体信息
Code:代码数据
RO-data:指只读数据,除了内联数据之外的常量数据
RW-data:指可读写、已初始化的变量数据
ZI-data:指未初始化的变量数据
上面显示的是几个区域的总体占用大小,其中:
1、Code、Ro-data:位于FLASH中;
2、RW-data、ZI-data:位于RAM中;
3、RW-data已初始化的数据会存储在Flash中,上电会从FLASH搬移至RAM;
4、Total ROM Size就是下载到flash中的程序大小
以上map文件是在stm32F103下生成的,但还有很多内容在网络上没有找到答案,先记录这么多。