在使用Keil编译器编译时,最后都会打印出信息:Program Size: Code=XX RO-data=XX RW-data=XX ZI-data=XX,我这里实际打印信息如下:
Program Size: Code=5688 RO-data=424 RW-data=48 ZI-data=1832
今天来详细讲解一下这段信息的含义。
一段代码包括代码段、只读常量数据、可读可写变量等。上述信息就代表了编译完后,代码、只读常量、可读写变量(初始化的变量)和未初始化的变量所占空间的大小。在工程中的.map文件最后会看到如下信息:
Code (inc. data) RO Data RW Data ZI Data Debug
5688 300 424 48 1832 524169 Grand Totals
5688 300 424 48 1832 524169 ELF Image Totals
5688 300 424 48 0 0 ROM Totals
==============================================================================
Total RO Size (Code + RO Data) 6112 ( 5.97kB)
Total RW Size (RW Data + ZI Data) 1880 ( 1.84kB)
Total ROM Size (Code + RO Data + RW Data) 6160 ( 6.02kB)
==============================================================================
(1)Code (inc. data): 包含代码和数据两部分。(参考官方文档:Shows how many bytes are occupied by code. In this image, there are 3712 bytes of code.This includes 1580 bytes of inline data (inc. data), for example, literal pools, and short strings.)存储在FLASH中。
-Code:即代码部分;
-inline data:比如literal pools(文字池) 和short strings(短字符串)。此部分一般忽略。
(2)RO-data: 表示程序中的只读常量数据。比如const类型的数据 (除inline data之外的只读数据)。存储在FLASH中。
(3)RW-data: 表示可读写变量的数据大小,即程序中已经初始化的变量大小。存储在FLASH中。初始化时RW-data从flash拷贝到SRAM。
(4)ZI-data: 表示程序中已定义但未初始化或者初始化值为0的变量大小。(编译器会默认把没有赋值的变量自动赋值为0)。存储在SRAM中。ZI-data不会被算做代码里因为不会被初始化。
从上表最后一栏看一看到:
RO Size =Code + RO Data //只读数据大小 = 代码大小 + 只读数据大小
RW Size =RW Data + ZI Data //读写数据大小 = 可读写数据(已初始化)大小 + 未初始化变量大小
ROM Size = Code + RO Data + RW Data //整个代码所占ROM空间(占用FLASH空间)大小
即,烧写到FLASH的被占用的空间为:ROM Size = Code + RO Data + RW Data
程序运行时芯片RAM占用空间为:RW Size =RW Data + ZI Data
之所以将RW Data存在ROM(FLASH)中,是因为芯片掉电后,RAM中数据丢失,再次开机后需要对已经初始化的变量重新初始化,所以,已经初始化的变量(RW Data)需要放在ROM(FLASH)中保存,以确保重新上电时能够进行初始化。而 ZI Data本身就没有初始化,或者初始化为0,重新上电时,芯片会将ZI Data区域清零,所以没有必要将ZI Data放在ROM(FLASH)中,那样会浪费内存空间。