近期,经历完印象深刻的校园招聘,好不容易静下心来,重返实验室继续我的项目,发觉基础真的很重要,比如在做嵌入式设计的时候,数据的动态存储、静态存储等等,violate变量与code变量,define与typedf等的区别。在这里我想说说编译器编译完文件后生成的map文件的重要性,望各位指正。
这里以MDK为例,实际IAR、ADS都是类似的,经过编译后,我们会看到类似- Program Size: Code=1076 RO-data=288 RW-data=20 ZI-data=612
的编译结果,在我之前的项目开发中,根本就没有考虑到占用内存及存储的概念,但实际是很重要的:
Code:指的是程序代码所占用的空间;
RO-data:指的是程序里面定义的常量所占用空间(一般是用code定义的);
RW-data:指的是程序里面变量所占用的空间(包括全局、局部?);
ZI-data:指的是程序里定义了但没有被引用的变量;
拿STM32F103VET6来说,有512Kb的flash,64Kb的SDRAM,虽然两个的值都挺大,在写小项目代码时根本就不用考虑以上Program Size的大小,但,若是换了个只有8K大小FLASH的器件或是更小的器件,这些就不得不考虑了。
在我们编译完程序之后,工程的根目录里面有个List文件夹,这个文件夹里面有个.map文件,这个是讲编译过程中的各个文件之间的链接关系,最后给出了- ==============================================================================
- Code (inc. data) RO Data RW Data ZI Data Debug
- 1076 82 288 20 612 452064 Grand Totals
- 1076 82 288 20 612 452064 ELF Image Totals
- 1076 82 288 20 0 0 ROM Totals
- ==============================================================================
- Total RO Size (Code + RO Data) 1364 ( 1.33kB)
- Total RW Size (RW Data + ZI Data) 632 ( 0.62kB)
- Total ROM Size (Code + RO Data + RW Data) 1384 ( 1.35kB)
- ==============================================================================
通过这个文件也很容易看到自己写的程序的实际将占用MCU多少资源,关于.map文件,大家有什么更好的解析不?
|