最近在优化一个项目,想要尽可能地压缩代码,腾出空间写新的业务逻辑。看多了.map文件,有了一些新的理解。我用的编译器是IAR,可能编译出来的.map文件跟keil不一样,但是原理应该是一致的。
先说一些基本的概念。
程序编译后,主要分成三大部分。text,data,bss。
text就是编译后的代码
data就是变量,全局变量,局部的静态变量,而且还是有初始值的,亦即是是初始值不是0。至于为啥要单独存储全局变量和局部的静态变量待会说。
bss也是变量,也是全局变量,局部的静态变量,但是是没有初始值的,亦即是初始值是0。
放几张.map文件的图来看一下。
可以看出来,.intvec也就是中断向量表,被放在了flash的起始地址,这个是M3内核决定的。
.text也就是代码,kind里也写着了,ro code。只读代码。很重要的信息是size 和object。object告诉你是哪个源文件,size告诉你多大。有了这两个信息,我们就可以知道代码中有哪个源文件占用空间多,可以定点打击,专门优化。