[分享]Keil编译后的Code,RO,RW,ZI分别表示什么以及和芯片Flash、SRAM的对应关系

2019-07-20 15:45发布

在使用keil开发STM32应用程序时,点击Build后在Build Output窗口中经常会有如下信息:



以前一直好奇这几个参数和实际使用的STM32芯片中Flash和SRAM的对应关系,于是上网搜了一圈,做如下总结:
  • 这些参数的单位是Byte
  • 图中几个参数分别代表
    • Code:代码的大小
    • RO:常量所占空间
    • RW:程序中已经初始化的变量所占空间
    • ZI:未初始化的static变量和全局变量以及堆栈所占的空间
  • 上述参数和芯片Flash以及SRAM的对应关系是
    • Flash占用大小=Code+RO+RW
    • SRAM占用大小=RW+ZI
不知道有没有人会像我一样好奇为什么RW参数同时参与了Flash和SRAM占用量的计算。这是因为Flash部分的属性是Read-Only的,而SRAM虽然是Read-Write但里面数据不能掉电保存,所以只能把已经初始化的值保存到ROM里,上电后再拷贝到SRAM中进行读写操作,即两部分都需要留出RW变量所占用的空间。这里给出的解释比较详细,在此我参照着用STM32F407ZGT6图解一下。
STM32F407ZGT6的Flash大小为1MB,SRAM大小为(128KB+64KB)。这里SRAM之所以分开表示是因为在芯片内部前面的128KB和后面的64KB地址不是连续的,后面的64KB在ST官方叫做CCM (core coupled memory) ,据说是由内核直接访问的,不能由外设访问(见原帖2楼)。下面给出的示意图中只标出了前面的128KB的SRAM空间。红 {MOD}部分表示STM32F407ZGT6提供的Flash和SRAM大小。



结合上图说下STM32F407ZGT6的启动过程(采用Cortex-M4、Cortex-M3内核的芯片基本都是这个过程):上电后首先从 0x00000000(映射到0x08000000,这里只考虑从内部Flash启动)处获得中断向量表,然后在运行用户代码之前会在标号2处有一段引导代码负责把存在Flash中的初始化变量的值Copy到SRAM中对应的变量位置(标号3),之后把ZI区全部清零(标号4),之后才正式开始运行用户代码(标号5)。

对于详细的启动过程,这个帖子写得比较详细,可以试试~

参考资料:
http://stackoverflow.com/questions/5430284/rom-and-ram-in-arm
http://blog.csdn.net/he_ning/article/details/35226125
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/4027.html
http://www.amobbs.com/thread-5517029-1-1.html
http://anlx27.iteye.com/blog/1575848
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
36条回答
Electronic
1楼-- · 2019-07-22 19:11
有外部SRAM?
莫问1990
2楼-- · 2019-07-22 23:26
 精彩回答 2  元偷偷看……
wuxiaoluo
3楼-- · 2019-07-23 05:16
莫问1990 发表于 2016-8-6 09:47
图片上是编译后的结果,我的SRAM只有192K,但是编译结果里RW+ZI明显大于192K了,程序能正常运行,这是为什 ...

大量占用RAM其实都是数组,而不是变量。
数组是在运行过程中才会用到,而且不一定用满,例如串口或者一些记录几百个列表的buffer。
当运行过程中我们没有那么多内容要用到那么多buffer(例如最大是100个情况的存储,实际只用到60个,那么40个的内存是没有用到的),而c编译是不检测内存边界的,这也是c指针经常引发问题的原因,只有在运行时读写了不存在或不能访问的ram时,才会引发异常。
所以,RAM超出了限定值,但可以运行,不代表能够稳定长期运行。
还有就是一般都是自定义的数组太多,这个应该写程序时就预算到了呀,应该用更大的ram的芯片。
还有一点就是可能是编译器设定的堆栈过大了,这些堆栈是给动态分配内存指针用的,如果程序没有申请动态内存和释放的操作,那么这块是不会用到也是浪费了的。做好内存规划能够在资源不是极大富裕时降低芯片成本。
siguoyalike
4楼-- · 2019-07-23 07:11
感谢分享,受教了,
OMG
5楼-- · 2019-07-23 09:00
 精彩回答 2  元偷偷看……
奔跑的蟑螂
6楼-- · 2019-07-23 10:08
堆栈概念不怎么懂,看起来好吃力!!!

一周热门 更多>