Keil MDK编译器下查看占用Flash和SRAM空间大小

在Keil MDK编译器编译后,信息栏都会显示编译情况,这其中就包含了FLASH跟SRAM的信息。如下图所示,

一方面它也说明程序在编译后会把相同性质的数据(比如变量,其中包括局部变量和全局变量。当然其中也包括代码)归放到同一域里面。

/*********************************************************************************************/

查看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中。

 

 

/*********************************************************************************************/

PS:

很多东西都是自己网上查阅资料,查到的,最主要的是希望能在总结过程中,理清思路。

/*********************************************************************************************/

  • 16
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值