Keil arm 编译 RO RW ZI DATA

发布者:runaway2000最新更新时间:2016-01-12 来源: eefocus关键字:Keil  arm  编译  DATA 手机看文章 扫描二维码
随时随地手机看文章
ARM程序(指在ARM系统中正在执行的程序,而非保存在ROM中的bin文件)的组成 
一个ARM程序包含3部分:RO段,RW段和ZI段 
RO是程序中的指令和常量 
RW是程序中的已初始化变量 
ZI是程序中的未初始化的变量 
由以上3点说明可以理解为: 
RO就是readonly, 
RW就是read/write, 
ZI就是zero 
ARM映像文件的组成 
所谓ARM映像文件就是指烧录到ROM中的bin文件,也成为image文件。以下用Image文件来称呼它。 
Image文件包含了RO和RW数据。 
之所以Image文件不包含ZI数据,是因为ZI数据都是0,没必要包含,只要程序运行之前将ZI数据所在的区域一律清零即可。包含进去反而浪费存储空间。 
Q:为什么Image中必须包含RO和RW? 
A:因为RO中的指令和常量以及RW中初始化过的变量是不能像ZI那样“无中生有”的。 
ARM程序的执行过程 
从以上两点可以知道,烧录到ROM中的image文件与实际运行时的ARM程序之间并不是完全一样的。因此就有必要了解ARM程序是如何从ROM中的image到达实际运行状态的。
实际上,RO中的指令至少应该有这样的功能: 
1. 将RW从ROM中搬到RAM中,因为RW是变量,变量不能存在ROM中。 
2. 将ZI所在的RAM区域全部清零,因为ZI区域并不在Image中,所以需要程序根据编译器给出的ZI地址及大小来将相应得RAM区域清零。ZI中也是变量,同理:变量不能存在ROM中
在程序运行的最初阶段,RO中的指令完成了这两项工作后C程序才能正常访问变量。否则只能运行不含变量的代码。 
说了上面的可能还是有些迷糊,RO,RW和ZI到底是什么,下面我将给出几个例子,最直观的来说明RO,RW,ZI在C中是什么意思。  
1; RO 
看下面两段程序,他们之间差了一条语句,这条语句就是声明一个字符常量。因此按照我们之前说的,他们之间应该只会在RO数据中相差一个字节(字符常量为1字节)。 
Prog1: 
#include  
void main(void) 



Prog2: 
#include  
const char a = 5; 
void main(void) 



Prog1编译出来后的信息如下: 
================================================================================ 
Code RO Data RW Data ZI Data Debug 
948 60 0 96 0 Grand Totals 
================================================================================ 
Total RO Size(Code + RO Data) 1008 ( 0.98kB) 
Total RW Size(RW Data + ZI Data) 96 ( 0.09kB) 
Total ROM Size(Code + RO Data + RW Data) 1008 ( 0.98kB) 
================================================================================ 
Prog2编译出来后的信息如下: 
================================================================================ 
Code RO Data RW Data ZI Data Debug 
948 61 0 96 0 Grand Totals 
================================================================================ 
Total RO Size(Code + RO Data) 1009 ( 0.99kB) 
Total RW Size(RW Data + ZI Data) 96 ( 0.09kB) 
Total ROM Size(Code + RO Data + RW Data) 1009 ( 0.99kB) 
================================================================================ 
以上两个程序编译出来后的信息可以看出: 
Prog1和Prog2的RO包含了Code和RO Data两类数据。他们的唯一区别就是Prog2的RO Data比Prog1多了1个字节。这正和之前的推测一致。 
如果增加的是一条指令而不是一个常量,则结果应该是Code数据大小有差别。 
2; RW 
同样再看两个程序,他们之间只相差一个“已初始化的变量”,按照之前所讲的,已初始化的变量应该是算在RW中的,所以两个程序之间应该是RW大小有区别。 
Prog3: 
#include  
void main(void) 



Prog4: 
#include  
char a = 5; 
void main(void) 



Prog3编译出来后的信息如下: 
================================================================================ 
Code RO Data RW Data ZI Data Debug 
948 60 0 96 0 Grand Totals 
================================================================================ 
Total RO Size(Code + RO Data) 1008 ( 0.98kB) 
Total RW Size(RW Data + ZI Data) 96 ( 0.09kB) 
Total ROM Size(Code + RO Data + RW Data) 1008 ( 0.98kB) 
================================================================================ 
Prog4编译出来后的信息如下: 
================================================================================ 
Code RO Data RW Data ZI Data Debug 
948 60 1 96 0 Grand Totals 
================================================================================ 
Total RO Size(Code + RO Data) 1008 ( 0.98kB) 
Total RW Size(RW Data + ZI Data) 97 ( 0.09kB) 
Total ROM Size(Code + RO Data + RW Data) 1009 ( 0.99kB) 
================================================================================ 
可以看出Prog3和Prog4之间确实只有RW Data之间相差了1个字节,这个字节正是被初始化过的一个字符型变量“a”所引起的。 
3; ZI 
再看两个程序,他们之间的差别是一个未初始化的变量“a”,从之前的了解中,应该可以推测,这两个程序之间应该只有ZI大小有差别。 
Prog3: 
#include  
void main(void) 



Prog4: 
#include  
char a; 
void main(void) 



Prog3编译出来后的信息如下: 
================================================================================ 
Code RO Data RW Data ZI Data Debug 
948 60 0 96 0 Grand Totals 
================================================================================ 
Total RO Size(Code + RO Data) 1008 ( 0.98kB) 
Total RW Size(RW Data + ZI Data) 96 ( 0.09kB) 
Total ROM Size(Code + RO Data + RW Data) 1008 ( 0.98kB) 
================================================================================ 
Prog4编译出来后的信息如下: 
================================================================================ 
Code RO Data RW Data ZI Data Debug 
948 60 0 97 0 Grand Totals 
================================================================================ 
Total RO Size(Code + RO Data) 1008 ( 0.98kB) 
Total RW Size(RW Data + ZI Data) 97 ( 0.09kB) 
Total ROM Size(Code + RO Data + RW Data) 1008 ( 0.98kB) 
================================================================================ 
编译的结果完全符合推测,只有ZI数据相差了1个字节。这个字节正是未初始化的一个字符型变量“a”所引起的。 
注意:如果一个变量被初始化为0,则该变量的处理方法与未初始化华变量一样放在ZI区域。 
即:ARM C程序中,所有的未初始化变量都会被自动初始化为0。 
总结: 
1; C中的指令以及常量被编译后是RO类型数据。 
2; C中的未被初始化或初始化为0的变量编译后是ZI类型数据。 
3; C中的已被初始化成非0值的变量编译后市RW类型数据。 
附: 
程序的编译命令(假定C程序名为tst.c): 
armcc -c -o tst.o tst.c 
armlink -noremove -elf -nodebug -info totals -info sizes -map -list aa.map -o tst.elf tst.o
编译后的信息就在aa.map文件中。 
ROM主要指:NAND Flash,Nor Flash 
RAM主要指:PSRAM,SDRAM,SRAM,DDRAM 
关键字:Keil  arm  编译  DATA 引用地址:Keil arm 编译 RO RW ZI DATA

上一篇:STM32入门笔记(3)——GPIO
下一篇:S3C2410X的NAND flash启动

推荐阅读最新更新时间:2024-03-16 14:43

ARM应用系统开发详解 第4章 ARM程序设计基础
ARM编译器一般都支持汇编语言的程序设计和C/C++语言的程序设计,以及两者的混合编程。本章介绍ARM程序设计的一些基本概念,如ARM汇编语言的伪指令、汇编语言的语句格式和汇编语言的程序结构等,同时介绍C/C++和汇编语言的混合编程等问题。 本章的主要内容: - ARM编译器所支持的伪指令 - 汇编语言的语句格式 - 汇编语言的程序结构 - 相关的程序示例 4.1 ARM汇编器所支持的伪指令 在ARM汇编语言程序里,有一些特殊指令助记符,这些助记符与指令系统的助记符不同,没有相对应的操作码,通常称这些特殊指令助记符为伪指令,他们所完成的操作称为伪操作。伪指令在源程序中的作用是为完成汇编程序作各种准备工作的,这些伪指令仅
[单片机]
阿里云:飞天操作系统正全面兼容X86、ARM、RISC-V
在2021阿里云峰会上,阿里云智能总裁张建锋宣布,飞天操作系统正在全面兼容X86、ARM、RISC-V等多种芯片架构,实现“一云多芯”。 张建锋表示,传统IT时代围绕芯片建立IT生态,但云计算从根本上改变了这一模式,云操作系统可以将服务器芯片、专用芯片等硬件封装成标准算力,无论底层芯片是X86、ARM、RISC-V还是硬件加速,给客户提供的都是标准的、高质量的云计算服务。 飞天是中国唯一自研的云计算操作系统。一云多芯的实现,是阿里云“做深基础”战略的重要进展。 这意味着阿里云不再依赖单一芯片架构,未来拥有更多可能性。 飞天是由阿里云自主研发、服务全球的超大规模通用计算操作系统。它可以将遍布全球的百万级服务器连成一台
[嵌入式]
阿里云:飞天操作系统正全面兼容X86、<font color='red'>ARM</font>、RISC-V
32位ARM核微处理器芯片PUC2030A及其应用
摘要:介绍了32位ARM核微处理器芯片PUC3030A的结构和特点,分析了其具有竞争力的优异性能,列举了一些可能的应用领域。在某些应用领域,采用PUC3030A方案,系统成本远低于采用8051加扩展芯片的方案。 关键词:ARM7TDMI SOC RISC CPU PUC3030A MP3 英国ARM公司设计的32位RISC Reduced Instruction Set ComputerCPU芯核(简称ARM芯核),具有功耗低、成本低等显著优点 目前已占有75%以上的32位嵌入式产品市场。而ARM系列芯片即为各个半导体厂家开发的基于ARM芯核的芯片。目前设计、生产ARM芯片的国际大公司已经超过100多家,国内中兴集成电路
[应用]
甚于ARM和FPGA的全彩独立视频LED系统
目前,显示屏按数据的传输方式主要有两类:一类是采用与计算机显示同一内容的实时视频屏;另一类为通过 USB、以太网等通信手段把显示内容发给显示屏的独立视频源显示屏,若采用无线通信方式,还可以随时更新显示内容,灵活性高。此外,用一套嵌入式系统取代计算机来提供视频源,既可以降低成本,又具有很高的可行性和灵活性,易于工程施工。因此,独立视频源LED显示系统的需求越来越大。 本系统采用ARM+FPGA的架构,充分利用了ARM的超强处理能力和丰富的接口,实现真正的网络远程操作,因此不仅可以作为一般的LED显示屏控制器,更可以将各显示节点组成大型的户外广告传媒网络。而FPGA是一种非常灵活的可编程逻辑器件,可以像软件一样编程来配置
[家用电子]
甚于<font color='red'>ARM</font>和FPGA的全彩独立视频LED系统
ARM“进军”低功耗系统设计
  每一名系统设计人员都理解功耗和性能的相对关系:您的应用需要的计算性能越高,设计的功耗也就越高。但是,新一类应用对这一规则发出了挑战。智能电话设计人员希望同时实现PC级峰值应用速率以及更长的电池使用寿命。嵌入式系统规划采用智能传感器以满足严格的数据分析要求,安全的连接互联网,但是要求最大限度的降低功耗。在传统的思路中,这些明显是无法实现的。但是,ARM工程师在6月份设计自动化大会(DAC)上的发言表明,CPU知识产权(IP)带头企业的发展方向却是将这些不可能变为可能。   当然,ARM从开始出现便一直专用于低功耗计算。在其DAC主题发言中,ARM创始人之一Mike Muller从小剑桥计算机业余爱好供应商Acorn Compu
[单片机]
<font color='red'>ARM</font>“进军”低功耗系统设计
iPhone 4创新全揭秘:ARM+陀螺仪
  北京时间6月8日凌晨1点,在2010苹果全球开发者大会(WWDC2010)上,乔布斯为我们带来了苹果第四代手机产品——iPhone4。和历代iPhone发布时一样,全世界的目光,都投向了这款全新亮相的iPhone 4。 乔布斯开始上台演讲 iPhone 4将再次改变一切   相比于前代iPhone 3GS,iPhone 4拥有了超过100项的更新,无论是在外形还是性能上,它都与前代iPhone相比都拥有着巨大的改变。而在发布会上,乔布斯主要为我们带来了8个方面的提升,这也是iPhone 4最主要的改进。 苹果官网iPhone 4效果图   尽管iPhone 4距离正式上市还有一段时间,但是通过在WWDC1
[手机便携]
iPhone 4创新全揭秘:<font color='red'>ARM</font>+陀螺仪
基于ARM7支持触摸屏和实时操作系统的开发与应用
  概述   随着信息技术的发展,支持图形界面的触摸操作和实时操作系统相结合的应用系统已经越来越广泛地应用到航空航天、军事、消费类电子、通讯设备等领域。mC/OS-II操作系统是一种占先式、实时操作系统(RTOS),由于其内核可拆减、可剥离性,使得它在实时控制领域中有着广泛的应用。它不仅减小了因为系统硬件设计缺陷带来的不可靠因素,而且增强了系统的控制实时性,从软件方面进一步增强了ARM控制系统的性能。另外,新版本的mC/OS-II已经通过了FAA认证,很适合应用于对实时性要求很高的嵌入式工业控制领域,如目前应用较广泛的军用战斗机、攻击机和火控系统等。   支持图形界面操作(mC/GUI)是一种较为流行的人机交互系统,它能够提供
[单片机]
基于<font color='red'>ARM</font>7支持触摸屏和实时操作系统的开发与应用
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved