一般用 KEIL / MDK 开发cortex M系列内核MCU,编译工程后,可以在Build Output窗口看到内存大小相关的信息,如下图。并且会得到一个map文件,默认在路径:./Listings/xxx.map。
打开map文件,直接拉到文件的最底部,可以看到如下内容:
==============================================================================
Code (inc. data) RO Data RW Data ZI Data Debug
93080 5964 3868 948 3384 141071 Grand Totals
93080 5964 3868 948 3384 141071 ELF Image Totals
93080 5964 3868 948 0 0 ROM Totals
==============================================================================
Total RO Size (Code + RO Data) 96948 ( 94.68kB)
Total RW Size (RW Data + ZI Data) 4332 ( 4.23kB)
Total ROM Size (Code + RO Data + RW Data) 97896 ( 95.60kB)
==============================================================================
上面一栏:
1)Code(inc. data): 表示所有代码占用的空间;
2)RO Data:表示程序中定义的常量,const定义的变量,总共占用的空间;
3)RW Data:表示程序中定义的初始值非0的全局变量和函数内部定义的static变量;
4)ZI Data:表示程序中定义的初始化值为0的全局变量和函数内部定义的static变量;
5)inc.data:指的是inline data.
下面一栏:
1)Total RO Size = Code + RO Data;
2)Total RW Size = RW Data + ZI Data;
3)Total ROM Size = Code + RO Data + RW Data;
占用FLASH和RAM空间的计算:
1)占用FLASH空间 = Total ROM Size = Code + RO Data + RW Data;
2)占用RAM空间 = Total RW Size = RW Data + ZI Data;
特殊说明:
从上面可以看到,ZI Data即占用了FLASH空间又占用了RAM空间。 这是因为ZI Data数据,在固件烧录的时候是存放在FLASH中,当程序运行后,会把这部分数据拷贝到RAM中。
官方解释: