Keil MDK map文件学习笔记

map文件组成

1.Section Cross References段交叉引用

在这里插入图片描述
记录了各函数段之间的相互调用关系

2.Removing Unused input sections from the image移除无用的段

在这里插入图片描述
此段内容表示移除掉未用用到的段数据,以减小代码体积,比如第一行表示移除堆数据段,因为启动文件中为堆区分配的0x200(512bytes)的空间,而程序中没有用到mallocalloc函数来分配堆内存,因而链接的时候会自动移除该部分的内容。
在这里插入图片描述

为了节省程序占用空间大小,配置选项中一定要勾选上上面红框内的选项。勾选上该选项后,可以将用不到的段数据在链接的时候自动移除

在这里插入图片描述

注:后面分析使用的map文件和上面分析使用的map文件不一样

3.Image Symbol Table镜像符号表

在这里插入图片描述
镜像符号表包含局部符号表和全局符号表
镜像符号表记录了各函数符号或全局变量符号在执行域空间的位置和大小

局部符号表

主要记录了作用域限定在本文件中的函数和变量。如静态函数的入口地址和代码大小,静态全局变量的地址和大小等信息,
在这里插入图片描述
上面两个红框中的内容分别对应于下面的两段代码截图,也从侧面证明了局部标号描述的是静态函数和静态全局变量
在这里插入图片描述
在这里插入图片描述

全局符号表

在这里插入图片描述
上面两个红框中的内容分别对应于全局函数和全局变量,并显示了所在执行域空间的位置和大小。上图中的最后一行记录了栈顶指针所在的位置。

4.Memory Map of the image镜像存储器映射

在这里插入图片描述
程序有两种状态未运行状态和运行状态,这里分别对应加载域执行域。程序默认是烧录到FLASH(ROM)空间的,程序未运行是此时的空间便成为加载域空间。程序运行时代码段和只读数据依旧在FLASH中,RW Data和ZIData Heap Stack等都会加载到SRAM(RAM)中,这是的代码空间称为执行域。
在这里插入图片描述

ROM区执行域

在这里插入图片描述

ROM区执行域的结束位置应为0x08020000+0x00010500=0x08030500。在下面的具体数据中根据类型(Type)和属性(Attr)可知:Code表示代码段,Data表示常量数据段。在上图最后一行数据中0x080304e0+0x00000020=0x08030500。此段描述的便是ROM区完整的执行域的内容,包括代码段和只读数据段

RAM区执行域

在这里插入图片描述
RAM区执行域记录了从FLASH向SRAM加载数据的内容,且加载的起始地址刚好就是ROM区执行域结束的地址,从flash的0x08030500位置开始加载数据,加载大小为0x000069b0大小的数据到RAM空间(上图最后一行0x200049b0+0x2000=0x200069b0)。这里要注意的是并非直接从0x08030500直接向后复制0x000069b0大小的数据到RAM中,实际是根据FLASH空间中的0x08030500后面的部分数据和之前的分散加载表等内容在RAM中生成的0x69b0空间。

5. Image component sizes镜像组件大小

汇总固件的大小信息

用户代码部分的信息汇总

在这里插入图片描述

库部分的信息汇总

在这里插入图片描述

固件信息

在这里插入图片描述
在这里插入图片描述

  • 24
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值