在使用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空间。红色部分表示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://anlx27.iteye.com/blog/1575848

Keil中的Code,RO,RW,ZI分别表示什么?相关推荐

  1. code ro rw zi 编译的一个ARM的程序,编译结果中的一句话

    code ro rw zi 编译的一个ARM的程序,编译结果中的一句话 Program Size: Code=8044 RO-data=52 RW-data=56 ZI-data=5184 其中: C ...

  2. CODE RO RW ZI

    一直以来对于ARM体系 中所描述的RO,RW和ZI数据存在似是而非的理解,这段时间对其仔细了解了一番,发现了一些规律,理解了一些以前书本上有的但是不理解的东西,我想应该 有不少人也有和我同样的困惑,因 ...

  3. CODE RO RW ZI的区别

    一直以来对于ARM体系 中所描述的RO,RW和ZI数据存在似是而非的理解,这段时间对其仔细了解了一番,发现了一些规律,理解了一些以前书本上有的但是不理解的东西,我想应该 有不少人也有和我同样的困惑,因 ...

  4. RO/RW/ZI区别及在mcu中的存储分配

    1 前言 本文所解决的问题是:KEIL编译出来的文件信息中包含RO RW ZI 大小,该信息到底是flash 还是ram大小? 2 ARM程序的组成 此处所说的"ARM程序"是指在 ...

  5. 日常技术积累-ARM中RO/RW/ZI

    ARM中RO/RW/ZI 背景 定义 LINUX内存为例 ARM程序烧录 总结 背景 一直以来,对ARM体系中的RO/RW/ZI不是很清楚,只是知道有这些东西存在.有时看资料.项目中也会看到这些字眼. ...

  6. linux硬盘ro改为rw,RO,RW,ZI 和scatter file详解(转载)

    要了解RO,RW和ZI需要首先了解以下知识: (1) ARM程序的组成 此处所说的"ARM程序"是指在 ARM系统中正在执行的程序,而非保存在ROM中的bin映像(image)文件 ...

  7. RO,RW,ZI,FLASH,RAM前世今生

    好久没写博客,-.-. 因为接触两个新的平台,芯翼和OPL,又发现对内存和flash分布的一些疑问,或许是自己根基不够稳吧,如果要搞清楚这些的意义,需要以下几个步骤: 2.RO,RW,ZI 是什么 3 ...

  8. RO,RW,ZI 和scatter file详解(转载)

    要了解RO,RW和ZI需要首先了解以下知识:       (1) ARM程序的组成             此处所说的"ARM程序"是指在 ARM系统中正在执行的程序,而非保存在R ...

  9. Keil 中的Code, RO-data , RW-data, ZI-data

    Code为程序代码部分 RO-data 表示 程序定义的常量const temp; RW-data 表示 已初始化的全局变量 ZI-data 表示 未初始化的全局变量 Code, RO-data,RW ...

最新文章

  1. 数字信号处理中的自相关和互相关计算和物理意义(一)
  2. 用python画xy散点图-python使用Plotly绘图工具绘制散点图、线形图
  3. Linux个人用户安装JDK(与root用户不同版本)
  4. 斯坦福大学CS224d基础1:线性代数回顾 Linear Algebra - review
  5. 【转载保存】Jsoup解析html常用方法
  6. 【递推】Ayoub and Lost Array
  7. IDEA—使用插件反编译jar包
  8. Java和U3D比较,Unity热更方案 ILRuntime 和 toLua的比较
  9. Maven多工程项目
  10. 快速学习Linux-网络管理
  11. Grails4 使用Audit-Logging Stampable 出现报错:HHH000142: Bytecode enhancement failed
  12. 2021年高压电工模拟考试题及高压电工模拟考试题库
  13. linux如何结束at命令,Linux命令总结--at命令(atq.atrm)
  14. 球坐标系(Spherical coordinate system )简单总结
  15. 实现原理讲解!最全SpringBoot学习教程,你值得拥有!
  16. 如何实现微信二维码支付功能???
  17. LPC1768 SSP0驱动示例——SD卡驱动
  18. css3水波纹渐变扩散
  19. PhpStudy 后门分析
  20. 大学里机器人比赛的那些事

热门文章

  1. 16F877A和24C02通信汇编语言,pic单片机IIC通信读24C02程序例 16F877A 主频4M
  2. python os path_python os.path模块
  3. oracle em agent,ORACLE 11G EM 配置命令及问题处理
  4. oracle 会话 lock,相克军_Oracle体系_随堂笔记014-锁 latch,lock
  5. 安装itunes需要管理员身份_ITUNES无法安装,提示没有权限如何解决?
  6. http协议报文体_HTTP报文基本概念学习
  7. android crop 大图,com.android.camera.action.CROP 实现图片剪裁
  8. linux软件证券,linux
  9. java中的线程和进程,Java | 线程和进程,创建线程
  10. WordPress二次开发经验简短总结