Keil STM32中map使用文件说明

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字节的空间。
在这里插入图片描述

  • 6
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值