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

我们在使用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

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

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

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

  • 21
    点赞
  • 90
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Keil-MDK是一种嵌入式软件开发工具,可以兼容STM32F4系列芯片的支持库。 STM32F4系列芯片是意法半导体推出的一款高性能微控制器系列,内含ARM Cortex-M4内核。这些芯片广泛应用于各种领域的嵌入式系统开发。Keil-MDK的支持库为开发者提供了简化开发流程、减少编程工作量的便利。 Keil-MDK的支持库可以帮助开发者通过抽象的接口,快速访问STM32F4系列芯片的功能和外设。通过这些支持库,开发者可以方便地使用芯片上的GPIO口、定时器、USART、ADC等外设,而无需深入了解底层硬件细节。支持库还提供了一些高级功能,如断控制、DMA等,可加快开发进度。 Keil-MDK的支持库具有高度可移植性,支持不同型号的STM32F4芯片。通过简单的配置,开发者可以轻松选择合适的芯片型号,并利用相同的代码在不同的芯片上进行开发。这种可移植性大大简化了嵌入式系统的开发过程,提高了开发效率。 总之,Keil-MDK的STM32F4系列芯片支持库为开发者提供了通用的接口和功能,简化了嵌入式系统的开发流程,提高了开发效率。开发者可以轻松地利用这些库进行芯片的驱动开发和应用程序的编写。 ### 回答2: Keil MDK是一款开发软件,适用于基于ARM Cortex-M内核的微控制器。在Keil MDK,有一个支持库可以帮助开发者更加方便地使用STM32F4系列芯片。 STM32F4系列芯片是由STMicroelectronics开发的一款微控制器,该系列芯片采用了ARM Cortex-M4内核,具有强大的处理能力和丰富的外设资源。而Keil MDK的支持库,专门针对STM32F4系列芯片进行了优化和适配。 通过使用Keil MDK的STM32F4系列支持库,开发者可以方便地访问芯片的各种外设,如GPIO、USART、SPI、I2C等,并进行相关配置和控制。此外,支持库还提供了丰富的API函数,大大简化了开发过程,使开发者可以更加高效地编写代码。 Keil MDK的STM32F4系列支持库还提供了相应的驱动程序,可以帮助开发者快速启动项目并进行调试。同时,支持库还包含了一些实用工具和示例代码,可以帮助开发者更好地理解和应用芯片的功能。 总之,Keil MDK的STM32F4系列支持库为开发者提供了丰富的工具和资源,使他们能够更加轻松地开发基于STM32F4系列芯片的应用程序。无论是初学者还是有经验的开发者,都可以通过使用这个支持库,快速、高效地实现自己的项目。 ### 回答3: Keil MDKKeil公司开发的嵌入式软件开发工具,主要用于ARM处理器的软件开发。STM32F4系列是意法半导体公司推出的一款高性能的32位微控制器系列,它们在Keil MDK具备完整的支持库。 在Keil MDK,STM32F4系列芯片支持库提供了丰富的软件资源,以帮助开发人员进行STM32F4系列芯片的开发工作。这些支持库包括了各种驱动程序、函数库和例程,以支持各种外设的操作和功能实现。 首先,STM32F4系列芯片支持库提供了标准外设驱动程序,包括GPIO、USART、SPI、I2C、ADC等,这些驱动程序简化了对外设的配置和控制,使开发者可以更加方便地使用这些外设,并且提高了开发效率。 其次,STM32F4系列芯片支持库还包括了各种函数库,例如操作系统(RTOS)支持库、射频(RF)支持库、USB支持库等。这些函数库提供了丰富的功能接口,使开发者可以直接调用这些接口来实现相应的功能,从而避免了重复编写代码的工作。 另外,STM32F4系列芯片支持库还提供了大量的应用实例和示例代码,这些代码可以帮助开发者更好地理解和使用STM32F4系列芯片的各种功能。通过参考这些示例代码,开发者可以快速上手,减少开发周期。 总之,Keil MDK的STM32F4系列芯片支持库为开发者提供了丰富的软件资源,使得开发者能够更加便捷地进行STM32F4系列芯片的软件开发工作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值