map 文件说明
map 文件是由链接器生成的,它主要包含交叉链接信息,查看该文件可以了解工程中各种符号之间的引用以及整个工程的 Code、 RO-data、 RW-data 以及 ZI-data 的详细及汇总信息。编译成功之后,双击工程名可以打开map文件。
如果是使用STM32cubemax生成的代码,默认情况下是无法双击打开的,需要更改Option设置下的listing目录设置,改到工程目录下编译生成的map文件处,一般在工程文件所在目录下,有一个和工程名字一样的文件夹,里边有很多.o .crf文件。
它的内容中主要包含了“节区的跨文件引用”、“删除无用节区”、“符号映像表”、“存储器映像索引”以及“映像组件大小”,各部分介绍如下:
1、节区的跨文件引用
在option中的c/c++设置中选择 one ELF section per function 可以按节区查看。
节区的跨文件引用 (Section Cross References)在这部分中,详细列出了各个 *.o 文件之间的符号引用。由于 *.o 文件是由 asm 或 c/c++ 源文件编译后生成的,各个文件及文件内的节区间互相独立,链接器根据它们之间的互相引用链接起来。
例如,开头部分说明的是 startup_stm32f40xx.o 文件中的“RESET”节区分为它使用的“__use_two_region_memory”符号引用了文件“(Special) to heapauxi.o(.text)”节区。
这些跨文件引用的符号其实就是源文件中的函数名、变量名。有时在构建工程的时候,编译器会输出“Undefined symbol xxx (referred from xxx.o)”这样的提示,该提示的 原因就是在链接过程中,某个文件无法在外部找到它引用的标号,因而产生链接错误。 这个就表示在main函数中无法在外部找到CAN_Transmit0函数,也是无法引用。
2、删除无用节区
map 文件的第二部分是删除无用节区的说明 (Removing Unused input sections from the image.) 这部分列出了在链接过程它发现工程中未被引用的节区,这些未被引用的节区将会被删除 (指不加入到 *.axf 文件,不是指在 *.o 文件删除),这样可以防止这些无用数据占用程序空间。
3、符号映像表
列出了被引用的各个符号在存储器中的具体地址、占据的空间大小等信息。
可以看到堆空间的地址是0x20000898 、类型是节区、大小是512kb。栈空间是的地址是0x20000a98 、类型是节区、大小事1024kb。再者还可以看到flash中的数据或者是SRAM中的数据的位置。
4、存储器映像索引
本工程的存储器映像索引分为 ER_IROM1 及 RW_IRAM1 部分,它们分别对应 STM32 内部 FLASH及 SRAM 的空间。
map 文件的第四部分是存储器映像索引 (Memory Map of the image)。
开头的时候可以看到存储的时候的ROM空间: Load Region LR_IROM1 (Base: 0x08000000, Size: 0x000049d8, Max: 0x00080000, ABSOLUTE)
程序运行的时候的ROM空间:Execution Region ER_IROM1 ( Load base: 0x08000000, Size: 0x0000499c, Max: 0x00080000, ABSOLUTE)
可以分析出来这个他们唯一不同的就是size尺寸大小。而我们知道程序在初始化的时候会将RW-data的数据先复制到SRAM中。所以这个两个的差值就是RW-data = 0x000049d8 - 0x0000499c = 0x3c = 60(字节)
加载视图中式一些函数所占节区的位置和大小其中PAD的补位对其指令,stm32是32位mcu,当程序不对齐的时候就需要PAD指令。
5、映像组件大小
map 文件的最后一部分是包含映像组件大小的信息 (Image component sizes)
这部分包含**各个使用到的 *.o 文件的空间汇总信息**、整个工程的空间汇总信息以及占用不同类型存储器的空间汇总信息,它们分类描述了具体占据的 Code、 RO-data、 RW-data 及 ZI-data 的大小,并根据这些大小统计出占据的 ROM 总空间。
一、所有节区信息汇总
① Grand Totals ,它表示整个代码占据的所有空间信息,其中Code 类型的数据大小为 10666字节,这部分包含了 532 字节的指令数据 (include .data) ,RO-data 占 8178 字节, RW-data 占 60 字节, ZI-data 占 3676 字节。
② ELF Image Totals,编译器压缩之后各个空间信息,主要是在RW-data有的程序可能有所不同,其他都是一样的。
③ROM Totals,它列出了各个段所占据的 ROM 空间,除了 ZI-data 不占 ROM 空间外,其余项都与 GrandTotals 中相等。
综合 map 文件的信息
① Total RO Size (Code + RO Data) 18844 ( 18.40kB) 当程序在 STM32 的内部 FLASH 运行时,需要使用的内部 FLASH 是从 0x0800 0000 地址开始的大小为 18844字节的空间;
② Total RW Size (RW Data + ZI Data) 3736 ( 3.65kB) 当程序运行时,需要使用的内部 SRAM 是从 0x20000000 地址开始的大小为 3736 字节的空间;
③ Total ROM Size (Code + RO Data + RW Data) 18904 ( 18.46kB) 当程序下载到 STM32 的内部 FLASH 时,需要使用的内部 FLASH 是从 0x0800 0000 地址开始的大小为 18904字节的空间。
|