KEIL工程的编译提示输出信息中有一个语句“Program Size:Code=xx RO-data=xx RW-data=xx ZI-data=xx”,它说明了程序各个域的大小,编译后,应用程序中所有具有同一性质的数据(包括代码)被归到一个域,程序在存储或运行的时候,不同的域会呈现不同的状态,这些域的意义如下:
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);
ZI-data的栈空间(Stack)及堆空间(Heap):在C语言中,函数内部定义的局部变量属于栈空间,进入函数的时候从向栈空间申请内存给局部变量,退出时释放局部变量,归还内存空间。而使用malloc动态分配的变量属于堆空间。在程序中的栈空间和堆空间都是属于ZI-data区域的,这些空间都会被初始值化为0值。编译器给出的ZI-data占用的空间值中包含了堆栈的大小(经实际测试,若程序中完全没有使用malloc动态申请堆空间,编译器会优化,不把堆空间计算在内)。
RW-data和ZI-data它们仅仅是初始值不一样而已,为什么编译器非要把它们区分开?这就涉及到程序的存储状态了,应用程序具有静止状态和运行状态。静止态的程序被存储在非易失存储器中,如STM32的内部FLASH,因而系统掉电后也能正常保存。但是当程序在运行状态的时候,程序常常需要修改一些暂存数据,由于运行速度的要求,这些数据往往存放在内存中(RAM),掉电后这些数据会丢失。因此,程序在静止与运行的时候它在存储器中的表现是不一样的。
图中的左侧是应用程序的存储状态,右侧是运行状态,而上方是RAM存储器区域,下方是ROM存储器区域。
程序在存储状态时,RO节(RO section)及RW节都被保存在ROM区。当程序开始运行时,内核直接从ROM中读取代码,并且在执行主体代码前,会先执行一段加载代码,它把RW节数据从ROM复制到RAM, 并且在RAM加入ZI节,ZI节的数据都被初始化为0。加载完后RAM区准备完毕,正式开始执行主体程序。
编译生成的RW-data的数据属于图中的RW节,ZI-data的数据属于图中的ZI节。是否需要掉电保存,这就是把RW-data与ZI-data区别开来的原因,因为在RAM创建数据的时候,默认值为0,但如果有的数据要求初值非0,那就需要使用ROM记录该初始值,运行时再复制到RAM。
STM32的RO区域不需要加载到SRAM,内核直接从FLASH读取指令运行。计算机系统的应用程序运行过程很类似,不过计算机系统的程序在存储状态时位于硬盘,执行的时候甚至会把上述的RO区域(代码、只读数据)加载到内存,加快运行速度,还有虚拟内存管理单元(MMU)辅助加载数据,使得可以运行比物理内存还大的应用程序。而STM32没有MMU,所以无法支持Linux和Windows系统。
当程序存储到STM32芯片的内部FLASH时(即ROM区),它占用的空间是Code、RO-data及RW-data的总和,所以如果这些内容比STM32芯片的FLASH空间大,程序就无法被正常保存了。当程序在执行的时候,需要占用内部SRAM空间(即RAM区),占用的空间包括RW-data和ZI-data。应用程序在各个状态时各区域的组成见表 。
ROM(FLASH) = Code + RO-data +RW-data;
RAM size = RW-data + ZI-data;
对于STM32F103xxyy系列:
第一个x代表引脚数:T-36pin,C-48pin,R-64pin,V-100pin,Z-144pin;
第二个x代表Flash容量:6-32K,8-64K,B-128K,C-256K,D-384K,E-512K;
第一个y代表封装:H-BGA封装,T-LQFP封装,U-QFN封装;
第二个一代表工作稳定范围:6代表-40到85摄氏度,7代表-40到105摄氏度。
关键字:KEIL 编译器 data ZI-data
引用地址:
KEIL编译器区分RW-data和ZI-data
推荐阅读最新更新时间:2024-03-16 16:19
KEIL软件使用方法,创建一个工程
单片机开发中除必要的硬件外,同样离不开软件,我们写的汇编语言源程序要变为 CPU 可以执行的机器码有两种方法,一种是手工汇编,另一种是机器汇编,目前已极少使用手工 汇编的方法了。机器汇编是通过汇编软件将源程序变为机器码,用于 MCS-51 单片机的汇编 软件有早期的 A51,随着单片机开发技术的不断发展,从普遍使用汇编语言到逐渐使用高级 语言开发,单片机的开发软件也在不断发展,Keil 软件是目前最流行开发 MCS-51 系列单片 机的软件,这从近年来各仿真机厂商纷纷宣布全面支持 Keil 即可看出。Keil 提供了包括 C 编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通 过一个集成开发环境(uV
[单片机]
微软参与Databricks 2.5亿美元融资
北京时间2月6日上午消息,据彭博社报道,Databricks是一家开发可以帮助企业满足“无聊的人工智能”需求软件的公司。公司周二宣布,已经获得新一轮2.5亿美元融资,估值在27.5亿美元。 这轮融资由风投公司Andreessen Horowitz领投,微软、Coatue Management和New Enterprise Associates等参投。此轮融资之后,这家成立于2013年的公司总融资规模达5亿美元。 Databricks开发的工具可以集中公司的数据库,并采用人工智能的形式搜索有意义的信息。该总部位于旧金山的创业公司称,去年的年度营收为1亿美元,并且公司的订阅销售量同比增加了两倍。公司拥有2000多客户,其
[手机便携]
ARM: Code,RO-data,RW-data,ZI-data 意义
ARM开发总结的小知识 字节 8位 半字 16位 字 32位 Code, RO-data RW-data,ZI-data Code为程序代码部分 RO-data 表示 程序定义的常量 const temp; RW-data 表示 已初始化的全局变量 ZI-data 表示 未初始化的全局变量 RO就是readonly,RW就是read/write,ZI就是zero Program Size: Code= 18248 RO-data=320 RW-data=260 ZI-data=3952 Code, RO-data,RW-data ..............flash RW-data, ZIdata..........
[单片机]
keil C51中的本征函数库及使用说明
本征函数(intrinsicroutines)是指编译时直接将固定代码插入当前行,而不用ACALL和LCALL 来实现(无需堆栈操作?),可大大提高函数的访问效率. 函数原型 extern void _nop_ (void); extern bit _testbit_ (bit); extern unsigned char _cror_ (unsigned char, unsigned char); extern unsigned int _iror_ (unsigned int, unsigned char); extern unsigned long _lror_ (unsigned long,
[单片机]
第2章-如何安装KEIL5—零死角玩转STM32-F429系列
本章内容所涉及的软件只供教学使用,不得用于商业用途。个人或公司因商业用途导致的法律责任,后果自负。 2.1 温馨提示 1、安装路径不能带中文,必须是英文路径 2、安装目录不能跟51的KEIL或者KEIL4冲突,三者目录必须分开 3、KEIL5的安装比起KEIL4多了一个步骤,必须添加MCU库,不然没法使用。 4、如果使用的时候出现莫名其妙的错误,先百度查找解决方法,莫乱阵脚。 2.2 获取KEIL5安装包 要想获得KEIL5的安装包,在百度里面搜索 KEIL5下载 即可找到很多网友提供的下载文件,或者到KEIL的官网下载:https://www.keil.com/download/product/,一大
[单片机]
keil把源代码生成lib的方法,
我们一般接触最多的程序文件就是.c和.h为后缀名的文件。 不知道大家有没有看到过.lib为后缀名的文件,这种就是加密的源代码文件。 我们用keil开发工具就可以把我们的.c文件加密成这种.lib文件。 这样能达到以下目的: 不想让别人看到自己写的源代码,同时又想让他使用你的程序功能。 一般很多芯片原厂就是这样干的,比如说TI的蓝牙和Zigbee协议栈,虽然说是开源的,但是实际上你去看他们底层的代码,很多都是用这种方式加密的。 还有就是一些模块原厂提供模块给方案商用,比如说以前我用汉枫wifi模块的时候,他们核心的代码就是通过这种方式的。 还有就是做电子狗和导航产品的,他们那个地图库是100%加密的。 总结:一般核心技术就会这样
[单片机]
C8051f系列开发之keil c单步调试
C8051f系列单片机是一种高速,集成度很高的单片机,功能还是蛮强大的。我在用此款单片机读取ST 公司的三轴加速度计的时候发现输出总是全1。于是,我用keil c的单步调试功能。一步一步调试,于是我发现执行到一条把某一管脚置1的语句之后,watch窗口显示的相应管教状态仍是0. 于是我觉得可能是硬件的问题,引脚一直接地被拉低。果然,我在查看电路板的线路时发现sdi和sdo两根线与另外两个引脚相连,而这个连接是我修改版图时无意连接上的。而且一个引脚被配置成高电平,另外一个被配置成低电平。所以sdi和sdo都一直保持低电平和高电平。所以不能对传感器进行正常的配置和读取数据。 另附lis3lv02dq读取程序,采用的是虚拟
[单片机]
串行DataFlash存储器及其与单片机的接口
1 概述
Flash存储器按其接口可分为串行和并行两大类。串行Flash存储器大多采用I2C接口或SPI接口进行读写;与并行Flash存储器相比,所需引脚少、体积小、易于扩展、与单片机或控制器连接简单、工作可靠,所以串行Flash存储器越来越多地用在各类电子产品和工业测控系统中。
DataFlash是美国Atmel公司新推出的大容量串行Flash存储器产品,采用NOR技术制造,可用于存储数据或程序代码,其产品型号为AT45DBxxxx。此系列存储器容量较大,从1Mb~256Mb;封装尺寸小,最小封装型式(CBGA)尺寸为6mm×8mm;采用SPI接口进行读写,硬件连线少;内部页面尺寸较小,8Mb容量的页面尺寸为264字节,
[单片机]