Keil&MDK环境下查看程序占用Flash和SRAM空间大小

在keil&MDK环境下rebuild程序时会在“bulid output”显示当前的编译情况,其中就包括程序占用Flash和SRAM的大小。
Keil&MDK环境下查看程序占用Flash和SRAM空间大小_第1张图片
查看FLASH跟SRAM的占用空间问题主要看下面的语句。
Program Size: Code=29864 RO-data=123592 RW-data=60 ZI-data=3900
其中 要着重注意的是Code、RO-data、RW-data、ZI-data所代表的意思
–>Code:即代码域,它指的是编译器生成的机器码,它被存储在ROM区。也表示程序所占用 FLASH 的大小( FLASH)。
–>RO-data:即 Read Only-data,只读数据区, 它被存储在ROM区。表示程序定义的常量,如 const 类型( FLASH)。
–>RW-data:即 Read Write-data,可读可写数据区,它被存储在ROM区, 表示已被初始化的全局变量(这里的初始值是指非0值)( SRAM)
–>ZI-data:即 Zero Initialie data, 0初始化数据,它被存储在RAM区,表示未被初始化的全局变量(SRAM)

注:在查阅野火的<<零死角玩转STM32>>电子书的 “程序的组成、存储于运行” 这个章节时,发现还有一个区会被忽略,也许在查看了上面几个存储区域后,会发现在 RW-data 和 ZI-data 这两个区域都存储在RAM中,存储的都是全局变量,那么局部变量存储在哪里呢?答案是:存储在ZI-data 的栈空间(Stack)及堆空间(Heap)。
ZI-data 的栈空间(Stack)及堆空间(Heap):在 C 语言中,函数内部定义的局部变量属于栈空间,进入函数的时候从向栈空间申请内存给局部变量,退出时释放局部变量,归还内存空间。而使用 malloc 动态分配的变量属于堆空间。在程序中的栈空间和堆空间都是属于 ZI-data 区域的,这些空间都会被初始值化为 0值。编译器给出的 ZI-data占用的空间值中包含了堆栈的大小(经实际测试,若程序中完全没有使用 malloc 动态申请堆空间,编译器会优化,不把堆空间计算在内)
/*********************************************************************************************/
那么FLASH和SRAM占用情况的计算方式如下所示:
flash = Code + RO-data + RW-data = 29864 + 123592 + 60 = 153516 bytes
sram = RW-data + ZI-data = 60+ 3900= 3960bytes
还有一个要特别注意的是程序的大小不是.hex文件的大小,而是编译结果的Code+RO-data。
在程序初始化的时候,RW-data会从FLASH中拷贝到RAM中。

你可能感兴趣的:(Keil&MDK环境下查看程序占用Flash和SRAM空间大小)