一、在keil编译输出时,可以看到如下图1所示的编译信息。

图1
其中:
Code:是指程序代码所占用的ROM大小,存储在FLASH中,程序运行期间大小不变。
RO-data:只读常量,程序中所定义的指令和常量占空间大小。程序运行期间不变。如const类型,存储在FLASH中。
RW-data:可读可写变量,已被初始化的可读可写变量所占空间大小,存储在FLASH中。程序运行期间会变,初始化时RW-data会从FLASH拷贝到SRAM。
ZI-data:没有被初始化的或者已被初始化为0的可读可写变量占空间大小。存储在SRAM中。
二、增加或减少了初始化为非0的数据,为什么RW-data大小看着好像不变
cpp
INT16 m_i16_TVolt[10];
在程序中有定义一个全局变量数组m_i16_TVolt[10],如上图可见。在使用keil编译时,可见RW-data大小为2668,如图2所示。

图2
当我修改程序,将数组进行初始化,如下:
cpp
INT16 m_i16_TVolt[10]={10,10,10,10,10,10,10,10,10,10};
数组内容全部初始化为10。那再看下keil编译后,RW-data的大小,如图3所示。

图3
从图3可知,RW-data大小仍然为2668。为什么呢??数组进行了初始化,RW-data按理说应该增大呀!
这就需要我们查看程序编译后的map文件,map文件可详细看到关于程序中每个c文件的RW-data、Code、RO-data等所占据的大小。

图4
图5
图4和图5是数组m_i16_TVolt[10]未初始化的map文件。从图4和图5可计算得出,c文件Object Totals中RW-data是1776, Library Totals中RW-data是892,两者之和为1776+892=2668。

图6

图7
图6和图7是数组 m_i16_TVolt[10]成员全部初始化为10以后编译输出的map文件。从图6和图7可看到,c文件Object Totals中RW-data是1800,未初始化之前RW-data是1776。 Library Totals中RW-data是868,未初始化的时候该数值RW-data是892。但是两者之和仍然为1800+868=2668。
所以仅仅只是看编译信息,RW-data数值未变,不过实际上在变量初始化后,C文件中RW-data确实是有增加的。但map文件中的Library Totals里面的incl.Padding 减少了。最终两者之和不变而已。