我们在使用Keil MDK编译ARM处理器的应用程序时,程序编译完成后会在下方的Build Output窗口中出现下图的信息提示,其中红色框框的内容对我们尤为重要;Code、RO-data、RW-data、ZI-data的含义理解以及程序最终占用处理器中的Flash空间大小和SRAM空间大小如何?今天就此问题跟大家进行详细的讨论,希望可以对大家有所帮助。

一、含义解释:

Code:即代码域,它通常是指编译器生成的机器指令,这些内容会被存储到ROM区。

RO-data:Read Only data,即只读数据域,它指程序中用到的只读数据,这些数据被存储在ROM区,因而程序不能被修改的内容。例如C语言中const关键字定义的变量就是典型的RO-data。

RW-data:Read Write data,即可读写数据域,它指初始化为“非0值”的可读写数据,程序刚运行时,这些数据具有非0的初始值,程序运行的时候它们又会常驻在RAM区,应用程序可以修改其内容。例如C语言中定义的全局变量,且定义时赋予“非0值”给该变量。

ZI-data:Zero Initialie data,即0初始化数据,它指初始化为“0值”的可读写数据域,它与RW-data的区别是程序刚运行时这些数据初始值全都为0,程序运行时和RW-data的性质一样,它们也常驻在RAM区,应用程序可以更改其内容。例如C语言中使用定义的全局变量,且定义时赋予“0值”给该变量(如若定义该变量时没有赋予初始值,编译器会把它当ZI-data来对待,初始化为0);

二、程序存储详解:

关于哪些数据存储在Flash区域,哪些数据存储在SRAM区域,这就涉及到程序的存储状态了,应用程序具有静止和运行两种状态。静止态的程序被存储在非易失存储器中,如内部FLASH区域,因而系统掉电后也能正常保存。但是当程序在运行状态的时候,程序常常需要修改一些暂存数据(例如初始化非0值的数据),这些数据往往存放在Flash中,但是由于需要被修改,所以这些数据在程序运行的时候需要被复制到RAM中。因此,程序在静止与运行的时候它在存储器中的表现是不一样的。

上图中的左侧是应用程序的存储状态,右侧是运行状态,上方棕色区域是RAM存储器区域,下方黄色区域是ROM存储器区域。 
程序在存储状态时,RO段(RO section)及RW段都被保存在ROM区(数据不能被修改)。当程序开始运行时,内核直接从ROM中读取代码,并且在执行应用程序代码前,会先执行一段加载代码,它把RW段数据从ROM复制到RAM(因为RW数据在执行过程中可能需要被修改), 并且在RAM中加入ZI段,ZI段的数据都会被初始化为0。加载完后RAM区准备完毕,正式开始执行主体程序。 
编译生成的RW-data的数据属于图中的RW端,ZI-data的数据属于图中的ZI段。是否需要掉电保存,这就是把RW-data与ZI-data区别存储的原因,因为在RAM创建数据的时候,默认值为0,但如果有的数据要求初值非0,那就需要使用ROM记录该初始值,运行时再复制到RAM中。

三、程序占用Flash和SRAM的空间计算:
GD32的RO区域不需要加载到SRAM,内核直接从FLASH读取指令运行。当程序存储到芯片的内部FLASH时(即ROM区),它占用的空间是Code、RO-data及RW-data的总和,所以如果这些内容比芯片的FLASH空间大,程序就无法被正常保存在芯片的FLASH了。当程序在执行的时候,需要占用内部SRAM空间(即RAM区),占用的空间包括RW-data和ZI-data空间之和。

总结:程序需要下载到芯片的FLASH空间,FLASH的最小空间应该大于Code + RO Data + RW Data的总和;

程序运行的时候,芯片内部RAM使用的空间应该大于RW Data + ZI Data之和;

另外:程序编译后打开工程的map文件,在map文件的最后一段也有类似的描述,具体见下图所示:(程序编译成功后在①处双击鼠标左键,即可打开工程的map文件,在map文件的末尾即可看到如②所示描述)

本文参考链接:https://stackoverflow.com/questions/5430284/rom-and-ram-in-arm

如果大家在项目开发的过程中有任何疑问欢迎评论区交流和留言。

------------------------------------------------------------------------------------------------------------------------------------------

因为小编自己能力水平有限,文中难免有错误或表达不到的信息,还望广大阅读者留言批评指正,谢谢。

全网最详细解释Keil-MDK中Code、RO-data、RW-data、ZI-data的含义相关推荐

  1. KEIL MDK中的RO、RW和ZI

    KEIL MDK中的RO.RW和ZI DATA理解及KEIL中ROM和RAM使用大小计算 (2013-12-25 09:33:06) 转载▼ 标签: it 分类: 嵌入式相关 本文来源与网络 http ...

  2. ARM编译中的RO、RW和ZI DATA区段

    ARM编译中的RO.RW和ZI DATA区段 ARM编译中的RO.RW和ZI DATA区段 ARM程序(指在ARM系统中正在执行的程序,而非保存在ROM中的bin文件)的组成 一个ARM程序包含3部分 ...

  3. KEIL 中的RO、RW和ZI DATA所代表的意思

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

  4. ARM中的RO、RW和ZI DATA

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

  5. stm32 ARM中的RO、RW和ZI DATA

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

  6. Keil编译产生的RO,RW和ZI是什么

    转载自: http://sdjntl.spaces.eepw.com.cn/articles/article/item/80656 要了解RO,RW和ZI需要首先了解以下知识: 1.ARM程序的组成: ...

  7. AMR中的RO,RW和ZI

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

  8. keil MDK中如何生成*.bin格式的文件

    在Realview MDK的集成开发环境中,默认情况下可以生成*.axf格式的调试文件和*.hex格式的可执行文件.虽然这两个格式的文件非常有利于ULINK2仿真器的下载和调试,但是ADS的用户更习惯 ...

  9. keil(MDK)中出现error: #513:

    keil(MDK)中出现error: #513: a value of type "int" cannot be assigned to an entity of type &qu ...

  10. 在Keil MDK中创建STM32F4系列的工程模板(标准外设库)

    在Keil MDK中创建STM32F4系列的工程模板(标准外设库) 一.前往ST官网下载标准外设库 二.根据个人风格创建文件夹目录 三.创建MDK工程,创建分组 四.添加系统启动必要源文件 五.添加头 ...

最新文章

  1. 你应该知道的15个Silverlight诀窍
  2. 数据库复习总结(12)数据检索
  3. 从sqlserver中数据写入mysql_[SQL Server]SQL Server数据库中如何返回INSERT INTO语句插入/写入数据后的记录值(比如ID等)?...
  4. 那些年,杜蕾斯紧跟热点的骚包文案有哪些?
  5. imageNamed和imageWithContextOfFile的区别?哪个性能高
  6. SessionAttributes介绍
  7. Hive _函数(系统内置函数、自定义函数、自定义UDF函数)
  8. 网络操作系统课后练习第三章
  9. git删除分支_程序员必须要掌握的 Git 使用技巧
  10. 雄狮少年,究竟怎样,我们用实际的数据来一探究竟
  11. ASP.NET MVC入门教程(二)文章列表页、内容页的实现
  12. http://www.baidu.com/cb.php?,帮助文档首页/百度翻译
  13. CC26xx(CortexM3) UARTs
  14. 留几手是怎么火起来的?
  15. Windows XP 共享 Workgroup无法访问.您可能没有权限使用网络资源
  16. stack-es-标准篇-ElasticsearchClient-combined_fields
  17. 我所知道查找算法之斐波拉契(黄金分割法)查找
  18. linux文件操作chown,chmod,chgrp命令的使用
  19. 独立站的免费流量玩法
  20. Python 字典(Dictionary. items()方法

热门文章

  1. 数据+人工智能+模型——北京市新一代交通仿真模型框架
  2. Twitter引流如何开发客户
  3. twitter跳过手机验证_安卓怎么注册推特账号(twitter跳过手机验证)
  4. eclipse背景设置什么颜色缓解眼睛疲劳
  5. Solana沦为“宕机链”:TPS修正主义的又一次失败
  6. 30行Python代码 刷王者荣耀金币
  7. git gitlan 切糕入门
  8. 洛依微服务版本简单研究
  9. 内网创建https网站的SSL证书、代码签名证书
  10. 【论文翻译】Mastering the game of Go without human knowledge (无师自通---在不借助人类知识的情况下学会围棋)