汽车电子expert成长之路

本博客发布的个人原创精品----嵌入式系统技术文章,欢迎大家参考学习,并转发分享!

CodeWarrior IDE使用tips之map文件详解

0
阅读(5264)

引言  

      很多工程师,在开发嵌入式MCU应用程序时,往往只重视编译链接结果中工程生成的elf文件和S19/HEX/binary下载文件,而忽略内存映射map文件。map文件是嵌入式MCU应用工程编译链接结果的内存映射结果文件,其中输出了工程编译器、链接器配置信息、用户代码和数据编译结果,函数调用关系,存储器资源分配和使用结果统计等非常详尽的信息,可以说是对编译结果所做分门别类的最详细描述。

        虽然其文件后缀名为.map,但其内容为文本信息,可以使用任意文本编辑器,比如记事本、写字板、word和notepad++等直接打开查看,十分方便。

CodeWarrior 5.1/2工程map文件详解

        下面就结合一个具体的S12G64的工程编译链接结果,给大家详细介绍一下CodeWarrior 5.1/2工程的map文件的内容和有用信息。

2.jpg

−TARGET SECTION(编译目标属性设置)

列举工程所使用的处理器类型(processor):Freescale HC12

内存模型:SMALL/BANKED/LARGE

输出文件格式:ELF/DWARF 2.0

链接器版本信息:SmartLinker V-5.0.52 Build 15249


−FILE SECTION(工程文件列表)

        列出所有工程链接使用的.c和.s文件,包括标准库文件编译之后的.o目标文件


−STARTUP SECTION(启动结构体信息)

        启动结构体,用于startup过程完成对RAM的初始化


−SECTION-ALLOCATION SECTION(区分配)

        系统默认段和用户自定义段分配和存储器分区映射统计结果,详细列出了每个段的段名(Section Name),所占的存储器大小(Size),属性(Type, R--只读,R/W--可读可写),在存储器中存储起始(From)和结束地址(To)和分区(Segment);


        从.stack段的分配信息,我们可以获得正常stack的地址空间,以此在调试时可以通过查看SP寄存器判断是否堆栈溢出或越界;


        在SECTION-ALLOCATION SECTION的最后是所有段所占RAM和Flash大小的统计结果:其中READ_ONLY(R) 为Flash的大小,而 READ_WRITE(R/W)为RAM大小:

3.jpg

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

        复位向量地址以及具体的ISR函数名以及ISR函数地址信息


−OBJECT-ALLOCATION SECTION(目标文件段分配)

        详细列举工程中每一个.s和.c文件编译后的.o目标文件里的函数(PROCEDURES)和变量(VARIABLES)的大小(hSize/dSize)和调用次数(Ref)以及所在段(Section):

4.jpg

−MODULE STATISTIC(目标文件编译结果统计)

        详细列出了工程中每一个被选择编译的.s和.c文件编译后的.o目标文件名字(Name),所占RAM(数据Data)和Flash(代码Code和常数Const)的大小

5.jpg

−SECTION USE IN OBJECT-ALLOCATION SECTION(目标使用区列表)

        详细列出每个段中的变量和函数名;

6.jpg

−OBJECT LIST SORTED BY ADDRESS(寄存器/全局变量/函数储存地址清单)

        列举具体每一个寄存器、函数和全局变量的名字,存储地址(Addr),大小(hSize--十六进制大小/dSize--十进制大小,单位为字节),被调用次数(Ref),以及所在的段(Section);

2.jpg

−UNUSED-OBJECTS SECTION(未使用函数清单)

        列出每一个目标函数中未使用的函数和全局变量;

8.jpg

−COPYDOWN SECTION(内存初始化copy down地址及大小)

        RAM初始化是全局变量有初始化值的拷贝信息;


−OBJECT-DEPENDENCIES SECTION (函数调用描述)

        以文本方式描述的应用工程中函数间的相互调用层级和关系;


−DEPENDENCY TREE(函数调用和依赖关系树)

        以树状图方式直观描述的应用工程中函数间的相互调用层级和关系;


−STATISTIC SECTION(统计段)

        统计最后工程编译链接结果需要下载到Flash中的数据+代码大小和所占Flash扇区(sector)的数量(下载该结果需要擦除的Flash扇区数量)统计结果。

该工程编译结果下载时总共需要擦除6个Flash扇区,下载420字节。


结论

        map文件中包括的丰富信息,对我们了解工程的编译链接结果十分重要,特别是在开发BootLoader或者需要对特定的代码和数据进行个性化处理(比如指定到某一特定的地址空间),是判断操作成功与否的最直观依据。另外结合DEPENDENCY TREE(函数调用和依赖关系树)的函数调用关系和SECTION-ALLOCATION SECTION(区分配)中的.stack段详细信息,我们可以在debug时判断堆栈是否溢出;通过查看SECTION-ALLOCATION SECTION最后的所有段占用RAM和Flash大小的统计结果,我们可以得到Memory的使用效率等等,这些对我们分析解决问题十分有用。


        其他嵌入式MCU软件开发IDE的map文件中的信息与这里介绍的类似,通过这篇文章的介绍,希望能够帮助大家学习和掌握所用的IDE工程编译链接所产的map文件格式和信息,重视map文件,利用好map文件,在分析和解决问题时能够编译结果胸有成竹、事半功倍。

胡恩伟

NXP汽车电子FAE

若对本文观点有任何意见和建议欢迎留言指出。

如果喜欢,可以关注本人公众号,阅读更多精彩内容。