前言

map文件保存了你的整个程序编译链接后的各种信息,包括编译器链接器信息,内存分配信息,对象依赖等,每次编译链接程序后,这个文件都会被覆盖重新生成。 
对我来说,它最主要的作用是它详尽的描述了整个程序最终在内存中的分布情况,有助于我们工程师完全掌控每一个对象(函数/变量/常量/栈……),以及对象间的相互关系,加深对编译链接过程的理解。 
其内容为文本形式,可以使用任意文本编辑器打开查看。

文件解释

就随便拿个最近在写的程序作为例子。默认的map文件名如上为Project.map。

打开后最上面 PROGRAM后跟着是项目abs文件的地址信息。

TARGET SECTION(编译目标)

里头列出了使用的处理器,链接器文件格式(ELF),使用的链接器的版本(CodeWarrior默认使用的是SmartLinker),地址模型。 
地址模型主要分为:SMALL、BANKED、LARGE。差别主要是其默认的地址分配和寻址方式不同,想要详细了解的话可以参考https://blog.csdn.net/lin_strong/article/details/78127072 里的相关介绍。

FILE SECTION(文件清单)

里头列举了用到的.o 文件,因为map是链接器生成的说明文件,对链接器来说它直接使用的是已经编译过的ELF格式的.o文件而不是最初的源代码.c文件。 
三列分别是:文件名, 此文件用到的地址模型, 使用的语言(如:C语言:ANSI-C;汇编:Assembler)。


STARTUP SECTION

描述了程序启动相关的函数和变量:

起始地址(Entry point)是程序的启动入口,这里是_Startup函数,在Start12.c中,是工程自动创建的,在其中会完成程序启动前的一系列初始化工作,然后才会跳转到我们熟知的C语言入口main函数。 
而_startupData这个初始化用的结构体则保存了初始化时用到的一些参数: 
nofZeroOut描述了后面数组的大小,如这里可以看出pZeroOut指向的三个区域; 
pZeroOut指向的区域会在初始化时被全部初始化为0,对应于C语言中的全局变量,观察下一个区块就可以看出他们之间的联系。 
toCopyDownBeg则保留着要初始化的RAM变量的初始化值,它们保存在非易失内存中。在_Startup中会把初始值拷贝到对应的变量处完成初始化。

  • 注:这里蛮提一个坑。可以看到第二个要清零的地址是24bit的,因为它们是放在分页区的向量,而在banked地址模型中默认的这个地址指针是16位的,所以要是直接编译的话就会看到0xF01000这个值变成了0x1000,那就变成从0x1000这个地址开始清零3204个字节了;因此如果使用了分页区的RAM的话要记得在编译器中添加-D__FAR_DATA选项,这样指针就会变成24bit的了。

SECTION-ALLOCATION SECTION(区块分配)

描述了每个数据段的名字、大小、类型(R只读、N/I不初始化、R/W可读写)、在存储器中的起始和结束地址、以及对应的分区(segment)。

我们可以看到.data、.bss和.common被连续分配到了RAM这个名字的分区中,对应这pZeroOut的第一个指针,在这几个段内的变量对应C语言中的全局变量。而PAGED_RAM被分配到了RAM_F0中,RAM_F1_744对应RAM_F1,分别对应pZeroOut的另两个指针,它们中是被分配到分页RAM中的全局变量。 
.stack则是栈的位置,上例中从0x2006到0x2105,大小为256字节。 
.abs_section_XXXX是编译器自动生成的段名,对应着程序中使用@直接定位地址的变量。 
如:.abs_section_8对应的是MC9S12XEP100.h中的这一行

extern volatile PORTESTR _PORTE @(REG_BASE + 0x00000008UL);
  • 1

这个块的最后我们可以看到一个summary,里头总结了各种类型的数据段实际占用的内存大小。

注:

代码量的计算并不是根据你文件编译出来的大小来确定的,链接器并不会链接那些没有用到的对象(除非用了某些语法强制进行链接),这些没用到的对象是不计入代码量的。所以程序实际上的大小并没有你在第一个图中看到的那个数字那么大。CodeWarrior 的试用版对代码量有限制指的就是这个最终的代码量。换句话说,不管你加再多代码,再多库到项目中;只要你不去用它们,一点代码量都不会增加。

VECTOR-ALLOCATION SECTION(中断向量分配)

描述了复位向量地址、初始值、以及具体的ISR函数名。 
由于我这个工程内直接使用的向量表,而不是在prm文件中使用VECTOR 0 _Startup这样来定义ISR的,所以这边没有列出。


OBJECT-ALLOCATION SECTION (对象分配)

这个部分直接按照模块(C语言中就是不同的.c文件)把程序中的具体对象的详细信息列出。 
包括对象的名字、所处模块、所在地址、十六进制表示的大小(hSize)、十进制表示的大小(dSize)、被引用次数、所在的段名。如果使用了reloacate把Flash上的程序重分配到了RAM中,还会跟上对应在新地址中的地址。

我们可以看到第一个对象就是刚刚举的那个地址在0x8处的变量的例子。其实际名字叫_PORTE,大小为1个字节,程序中没有任何地方直接使用到这个变量,但是因为他使用的是绝对定位,并没有被编译器优化掉。

同样的,地址如果是24bit的则说明使用了分页地址,16bit的说明使用的本地地址。

MODULE STATISTIC(模块统计)

列出不同模块的统计信息,包括 变量、代码、常量 的个数。

SECTION USE IN OBJECT-ALLOCATION SECTION

列出每个区块中分配的对象。

OBJECT LIST SORTED BY ADDRESS(地址顺序的对象清单)

类似OBJECT-ALLOCATION SECTION,但是是按地址升序排列的,方便按地址查找。

UNUSED-OBJECTS SECTION(未使用对象)

列出不同模块中未使用的对象。这些对象不会占用实际内存。

COPYDOWN SECTION

变量初始化相关信息。

OBJECT-DEPENDENCIES SECTION (对象依赖表)

列出每个对象依赖于(或说引用了)哪些对象。

DEPENDENCY TREE(依赖树状图)

用树状图的方式形象的表示出来对象间的相互依赖关系。

注:

一个对象每被另一个对象依赖,它在OBJECT-ALLOCATION SECTION中的Ref计数就会加1。然后你比如就可以到这个树状体中查找到底它是被哪个对象使用了。

STATISTIC SECTION

一些统计信息

结语

以上就是对整个map文件的介绍。熟悉map文件,可以使我们更好的掌控自己的程序,快速定位各种问题,良好地分配有限的MCU内存资源。希望这篇文章可以对各位朋友有一定的帮助。

CodeWarrior的map文件详解的更多相关文章

  1. C++中的STL中map用法详解(转)

    原文地址: https://www.cnblogs.com/fnlingnzb-learner/p/5833051.html C++中的STL中map用法详解   Map是STL的一个关联容器,它提供 ...

  2. vue-cli生成的模板各个文件详解(转)

    vue-cli脚手架中webpack配置基础文件详解 一.前言 原文:https://segmentfault.com/a/1190000014804826 vue-cli是构建vue单页应用的脚手架 ...

  3. Mybatis SQL映射文件详解

    Mybatis SQL映射文件详解 mybatis除了有全局配置文件,还有映射文件,在映射文件中可以编写以下的顶级元素标签: cache – 该命名空间的缓存配置. cache-ref – 引用其它命 ...

  4. Linux-apache httd.conf文件详解

    Linux-apache httd.conf文件详解 # This is the main Apache server configuration file. It contains the # co ...

  5. web.xml文件详解

      web.xml文件详解 Table of Contents 1 listener. filter.servlet 加载顺序 2 web.xml文件详解 3 相应元素配置 1 listener. f ...

  6. Linux中/proc目录下文件详解

    转载于:http://blog.chinaunix.net/uid-10449864-id-2956854.html Linux中/proc目录下文件详解(一)/proc文件系统下的多种文件提供的系统 ...

  7. SUBLIME TEXT 2 设置文件详解

    SUBLIME TEXT 2 设置文件详解 Preferences.sublime-settings文件: // While you can edit this file, it’s best to ...

  8. [转]AndroidManifest.xml文件详解

    转自:http://www.cnblogs.com/greatverve/archive/2012/05/08/AndroidManifest-xml.html AndroidManifest.xml ...

  9. delphi 资源文件详解

    delphi资源文件详解 一.引子: 现在的Windows应用程序几乎都使用图标.图片.光标.声音等,我们称它们为资源(Resource).最简单的使用资源的办法是把这些资源的源文件打入软件包,以方便 ...

随机推荐

  1. scrapy--dbmeinv

    第一次将自己的爬虫文件与大家分享.豆瓣美女网页图片爬取.比较简单,但很实用.给大家提供思路为主,增强个人的爬虫能力.希望能帮助到大家!!! 好了,让我们进入正题. 先给大家看下成果!!!激励大家赶快行 ...

  2. 11.VUE学习之提交表单时拿到input里的值

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

  3. C指针——简单总结

    简介: 指针变量在使用前,必须指向具体的有效的内存单元 指针变量在使用前不但要定义还要初始化 四个方面:指针的类型,指针指向的类型,指针的值或者指针所指向的内存区,指针本身所占的内存区 int *pt ...

  4. C# 输出结果有System.Byte[]

    byte[]类型直接输出或者调用ToString函数都会出现这个结果. 需要执行: byte[] a=new byte[10]; string text = "";for (int ...

  5. G - Dreamoon and NightMarket Gym - 101234G 优先队列+思路

    题目:题目链接 题意:给出n种食物,食物有自己的价格并且可以自由搭配,每天吃之前没吃过的花费最少的搭配,问第k天的花费. 思路:第k小我们考虑用优先队列处理,虽然n比较大,但由于1 ≤ K ≤ min ...

  6. Redis和Mecahe的简介

    Memcache介绍 概念:Memcache是一个高性能,分布式内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像.视频.文件以及数据库检索的结果等. ...

  7. C17K:Lying Island

    链接 题意: 有n个人,每个人可能会说: 第x个人是好人/坏人 如果第x个人是好人/坏人,则第y个人是好人/坏人 思路: 状压dp,首先每个人所说的人只能是他前面10个人,所以对于第i个人记录下,他前 ...

  8. Android log 引发的血案

    今天调试代码,我打印了一个东西: Log.d("WelcomeActivity", res.str); 结果总是代码执行不到这一行的下一行,程序也没有挂掉.后来,我自己去想各种可能 ...

  9. Android如何实现毛玻璃效果之Android高级模糊技术

    自从iOS系统引入了Blur效果,也就是所谓的毛玻璃.模糊化效果,磨砂效果,各大系统就开始竞相模仿,这是怎样的一个效果呢,我们先来看一下,如下面的图片: 效果我们知道了,如何在Android中实现呢, ...

  10. gulp相关

    'use strict'; var gulp = require('gulp'), webserver = require('gulp-webserver'), //gulp服务器 connect = ...