完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980php
本章为你们介绍编译器生成的map和htm文件进行解析,经过这两个文件可让你们对工程代码的认识程度提高一个档次。函数
10.1 初学者重要提示学习
10.2 MAP文件分析优化
10.3 HTM文件分析spa
10.4 总结3d
一、 为了更好的学习本章知识点,能够看以前作的视频教程第11章,针对H7也将在今年发布视频教程:调试
http://www.armbbs.cn/forum.php?mod=viewthread&tid=15408。code
二、 本章节以MDK为例进行说明,使用IAR同理。component
经过map文件,能够方便的查看工程ROM/FLASH和RAM的占用状况,包括单个源文件,甚至具体到每一个函数的rom大小都给出了,经过这些信息能够很好的进行代码优化。MAP文件的内容可分为以下几部分:orm
下面将这个几个部分的含义逐一为你们作个说明。
要生成MAP文件,MDK中以下选项要选上:
将工程全编译,且没有错误后,双击这里就能够看到生成的map文件了:
认识MAP文件前先熟悉以下概念:
这部分主要是不一样文件中函数的调用关系(部分截图)
好比这句:main.o(i.main) refers to main.o(i.PrintfLogo) for PrintfLogo表示main.c文件中的main函数调用了PrintfLogo。
这部分主要是被删除的冗余函数,也就是添加到工程里面,可是没有调用到的,下面是部分被删除冗余函数的截图效果:
对于这个部分功能,用户最好将MDK中这个选项勾上,而后全编译工程,效果会比较好:
Image Symbol Table主要分为两类,分别是Local Symbols和Global Symbols。
Local Symbols记录了用static声明的全局变量地址和大小,C文件中函数的地址和用static声明的函数代码大小,汇编文件中的标号地址(做用域限本文件),下面是部分截图:
Global Symbols记录了全局变量的地址和大小,C文件中函数的地址及其代码大小,汇编文件中的标号地址(做用域全工程),下面是部分截图:
映像文件能够分为加载域(Load Region)和运行域(Execution Region):加载域反映了ARM可执行映像文件的各个段存放在存储器中的位置关系。下面是部分截图,另外映像中的入口点就是程序开始执行的位置。
运行域反映了ARM可执行映像文件各个段真正执行时在存储器中的位置关系:
简单的说,加载域就是程序在Flash中的实际存储,而运行域是芯片上电后的运行状态,经过下面的框图能够有一个感性的认识:
经过上面的框图能够看出,RW区也是要存储到ROM/Flash里面的,在执行映像以前,必须将已初始化的RW数据从ROM中复制到RAM中的执行地址并建立ZI Section(初始化为0的变量区)。
Image component sizes映像组件大小比较重要,好比下面内容表明的含义:
下面的Library Totals显示已提取并做为单个对象添加到映像中的库成员占用了多少字节。
下面是咱们常常要查看的内容:
MDK将工程全编译,且没有错误后,就会生成此文件。以开发板配套例子为例,htm文件位于路径:\Project\MDK-ARM(uV5)\Objects。
此文件的最大做用就是基本统计了全部被调用函数的栈stack使用状况(不考虑中断嵌套)。下面是整个工程的最大栈需求:
具体到每一个函数也给出最大的栈深度Max Depth,同时也给出函数自己的代码量大小和使用的栈大小,好比函数bsp_InitExtIO,最大栈深度是152字节。函数自己占用代码大小(Thumb指令集)28字节,使用栈8字节。
经过这个文件,咱们能够合理的配置启动文件里面的stack大小:
本章节的知识点比较重要,务必要熟练掌握。平时开发工程项目时,能够多关注map文件和htm文件。