ARM嵌入式微处理器体系结构及汇编语言程序设计(txt+pdf+epub+mobi电子书下载)


发布时间:2020-07-14 16:16:51

点击下载

作者:关永

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

ARM嵌入式微处理器体系结构及汇编语言程序设计

ARM嵌入式微处理器体系结构及汇编语言程序设计试读:

前言

从20世纪70年代单片机的出现到今天各式各样的嵌入式微处理器的应用,嵌入式系统已经有了近30年的发展历史。

嵌入式系统的英文叫做Embedded System,是一种包括硬件和软件的完整计算机系统,但又和通用计算机系统不同。IEEE(国际电子电气工程师协会)对于嵌入式系统的定义是“An Embedded System is the devices used to control,monitor,or assist the operation of equipment,machinery or plants”,即嵌入式系统是“用于控制、监视或者辅助操作机器和设备的装置”。而国内较认同的嵌入式系统概念是:嵌入式系统是以应用为中心,以计算机技术为基础,并且软硬件可裁剪,适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。由此可见,两者定义仅仅是角度和详尽程度不同,并没有本质上的差别;另外,嵌入式的概念实际上是一种应用方式上的定义,虽然也可能涉及一些特定的结构,但其本身并不属于结构上的定义。

嵌入式系统一般由硬件和软件两部分组成。硬件包括嵌入式微处理器、存储器及外围硬件设备等;软件部分包括嵌入式操作系统(OS,要求实时和多任务操作)和应用程序;应用程序控制着系统的运作和行为,而操作系统则控制着应用程序的编程及与硬件的交互作用。

嵌入式系统的核心是嵌入式微处理器。嵌入式微处理器一般具备4个特点:(1)对实时和多任务有很强的支持能力,能完成多任务并且有较短的中断响应时间,从而使内部的代码和实时操作系统的执行时间减少到最低限度。(2)具有功能很强的存储区保护功能,这是由于嵌入式系统的软件结构已经模块化,而为了避免在软件模块之间出现错误的交叉作用,需要设计强大的存储区保护功能,同时也有利于软件诊断。(3)可扩展的处理器结构,以便能迅速地扩展出满足应用的高性能嵌入式微处理器。(4)嵌入式微处理器的功耗必须很低,尤其是用于便携式的无线及移动的计算和通信设备中靠电池供电的嵌入式系统更是如此,功耗只能为mW甚至?W级。

目前,ARM几乎成为嵌入式技术的代名词。作为一种16/32位的高性能、低成本、低功耗的嵌入式RISC处理器,ARM处理器已经成为当今应用广泛的嵌入式微处理器,并且已经深入到科技、生活的各个领域。(1)工业控制领域:作为32位的RISC架构,基于ARM核的微控制器芯片不但占据了高端微控制器市场的大部分市场份额,同时也逐渐向低端微控制器应用领域扩展、ARM微控制器的低功耗、高性价比,向传统的8/16位微控制器提出了挑战。(2)无线通信领域:目前已有超过85%的无线通信设备采用了ARM技术,ARM以其高性能和低成本,在该领域的地位日益巩固。(3)网络应用:随着宽带技术的推广,采用ARM技术的ADSL芯片正逐步获得竞争优势。此外,ARM在语音及视频处理上进行了优化,并获得广泛支持,同时也对DSP的应用领域提出了挑战。(4)消费类电子产品:ARM技术在目前流行的数字音频播放器、数字机顶盒和游戏机中得到广泛应用。(5)成像和安全产品:现在流行的数码相机和打印机中绝大部分采用ARM技术,手机中的32位SIM智能卡也采用了ARM技术。

总之,基于ARM的开发技术已经成为嵌入式系统的主流技术之一。

本书的作者有着丰富的教学和科研实践经验,在负责的多项国家级及北京市项目中多次以基于ARM的平台为研究与实验环境。作者能够从使用者的角度对待读者,并感受读者的需求。本书针对读者的特点,从理论和实践两个环节入手,由浅入深地、以嵌入式系统设计为主线介绍了嵌入式系统的开发方法。希望读者在建立了兴趣的基础上,能开阔思路,自行设计解决方案,并培养自主创新的能力。

本书在系统地介绍了嵌入式系统的基本知识和基于ARM处理器开发嵌入式系统的开发流程、开发环境的基础上,着重介绍了基于ARM处理器的编程模型、基本指令系统、汇编语言程序设计的基本方法、C与ARM汇编语言的混合编程技术。为了增强本书的实用性,帮助读者提高实际动手能力,本书还结合北京博创兴业科技有限公司开发的UP-CUP P270实验平台,给出了基于Intel Xscale架构的PXA270嵌入式微处理器的大量实验实例,并给出详细的设计说明,以提供给读者参考练习。本书共分7章,结构安排如下:

第1章 ARM处理器概述

第2章 ARM开发流程及交叉开发环境

第3章 ARM的编程模型及指令寻址方式

第4章 ARM常用指令集及示例

第5章 ARM汇编语言程序设计

第6章 C与ARM汇编语言的混合编程

第7章 基于ARM的嵌入式系统设计实例

另外,书中所有设计实例的相关代码均可从电子工业出版社华信教育资源网(www.hxedu.com.cn)免费下载,以方便读者使用。

本书由关永主编,张杰、张聪霞、魏洪兴参与了编写工作。

在本书的撰写过程中,得到了北京博创兴业科技有限公司的大力支持。该公司向本书作者提供了经典的PXA270嵌入式系统开发平台、开发软件及其他的技术帮助。北京化工大学的薛建伟、张娜两位研究生进行了大量的材料收集、文字录入等工作,同时薛建伟对书中的设计实例进行了验证,在此表示衷心的感谢!

此外,本书在编写过程中参阅了大量的相关文献,因篇幅所限,未能一一列出,在此谨向这些文献的作者表示衷心的感谢!由于时间仓促,加之作者学识水平有限,书中疏漏之处难免,敬请专家、读者批评指正。

编 者

2010年9月第1章 ARM处理器概述

1.1 初识ARM

1.1.1 什么是ARM

ARM即Advanced RISC Machines的缩写,有着几种不同的含义;它既是一个公司的名字,也是一类微处理器的通称,同时也是一种技术的名称。

①ARM是一个公司的名称。1985年4月26日,第一个ARM原型在英国剑桥的Acorn计算机有限公司诞生,由美国加州San Jose VLSI技术公司制造。

20世纪80年代后期,ARM很快开发出Acorn的台式机产品,形成英国的计算机教育基础设施。

1990年,Advanced RISC Machines Limited公司成立了(后来简称为ARM Limited,即ARM公司)。20世纪90年代,ARM 32位嵌入式RISC(精简指令集计算机,Reduced lnstruction Set Computer)处理器扩展到世界范围,占据了低功耗、低成本和高性能的嵌入式系统应用领域的领先地位。其实ARM公司既不生产芯片也不销售芯片,它只出售芯片技术授权。ARM公司的商业模式是:ARM作为知识产权供应商,本身并不直接从事芯片生产,而是靠转让技术许可、授权ARM技术知识产权(IP)核给世界各大半导体生产商。

②ARM是一类微处理器的通称。世界各大半导体生产商从ARM公司购买其设计的ARM微处理器核,根据各自不同的应用领域,加入适当的外围电路,从而形成自己的ARM微处理器芯片,即通常所说的ARM处理器。目前,全世界有几十家大的半导体公司都使用ARM公司的授权,因此既使得ARM技术获得了更多的第三方工具、制造业、软件的支持,也使整个系统成本降低,其产品更容易进入市场被消费者接受,同时更具有竞争力。

③ARM是一种技术。ARM是一个CPU内核,ARM的体系结构是一种RISC MPU/MCU的体系结构,即CPU产品所使用的一种体系结构。ARM公司还开发了一套拥有知识产权的RISC体系结构的指令集。每个ARM处理器都有一个特定的指令集架构,而一个特定的指令集架构又可以由多种处理器实现。确切地说,ARM体系结构是ARM公司拥有知识产权的CPU体系结构。1.1.2 ARM技术的特点及应用领域

ARM处理器以低功耗、低成本、实用性强为特点,并以优异的产品性能著称于世,其主要特点包括:

● 体积小、低功耗、低成本、高性能。

● 支持Thumb(16位)/ARM(32位)双指令集,能很好地兼容8位/16位器件。

● 大量使用寄存器,指令执行速度快。

● 大多数数据操作都在寄存器中完成。

● 寻址方式灵活简单,执行效率高。

● 采用精简指令集计算机(RISC),指令长度固定。

此外,ARM处理器还采用了一些特殊的技术,在保证高性能的同时尽量减小芯片体积,降低芯片功耗,这些技术包括以下几种:

● 在同一条数据处理指令中包含算术逻辑单元处理和移位处理。

● 使用地址自动增量(增加或减少)来优化程序中的循环处理。

● Load/Store(加载/存储)指令可以批量传输数据,从而提高数据传输的速率。

● 所有指令都可以根据前面指令的执行结果决定是否执行,以提高指令的执行效率。

总之,正是因为这些优点,基于ARM技术的微处理器应用约占据了32位RISC处理器75%以上的市场份额,ARM技术正在逐步渗入到我们生活的各个方面。

①无线设备:超过85%的无线设备(手机等)都采用了ARM技术,在向3G升级的过程中,ARM的地位也进一步稳固。在PDA一类的无线设备中,ARM针对视频流进行了优化,并获得广泛的支持。

②蓝牙技术:有20多家公司的元器件产品采用了ARM技术,如爱立信(Ericsson)、英特尔(Intel)、科胜讯(Conexant)、朗讯(Lucent)、阿尔卡特(Alcatel)、飞利浦(Philips)和德州仪器(TI)等。

③联网:随着宽带接入市场的成长,采用ARM技术的ADSL芯片组已经获得了竞争优势。

④消费电子:ARM技术在数字音频播放器、数字机顶盒和游戏机等方面应用广泛。

⑤汽车:包括驾驶、安全和车载娱乐等各种功能在内的设备有可能采用五六个ARM处理器统一实现。

⑥海量存储设备:采用ARM技术的存储产品包括硬盘系列、微型闪存卡和可读/写光盘等已经投入生产,并且将会有更加先进的产品。

⑦成像:包含ARM技术的相机和打印机。

⑧安全产品:在GSM和3G手机中的32位SIM智能卡。

可以看出,ARM芯片已经获得了广泛的重视和应用。ARM芯片有多达十几种的芯核结构,因此对其进行详细的分类是很必要的。

1.2 ARM处理器简介

1.2.1 ARM体系结构的版本

迄今为止,ARM体系结构主要定义了6个版本,版本号分别为1~6。表1.1比较了ARM体系结构的6个版本的特点。表1.1 ARM体系结构的6个版本的特点

ARM体系从版本1到版本6,其指令集功能不断扩大;同时,各版本中还有一些变种(variant),这些变种定义了该版本指令集中不同的特定功能。

①T变种(Thumb指令集):表示Thumb,该内核可从16位指令集扩充到32位ARM指令集。

②D变种:表示Debug,该内核中放置了用于调试的结构,通常为一个边界扫描链JTAG,可使CPU进入调试模式,从而方便地进行断点设置、单步调试。

③M变种(长乘法指令):表示Multiplier,是8位乘法器。

④I变种:表示Embedded ICE Logic,用于实现断点观测及变量观测的逻辑电路部分,其中的TAP控制器可接入到边界扫描链。

⑤E变种(增强型指令):DSP指令支持。

⑥J变种(Java加速器Jazelle):Java指令支持。

⑦SIMD变种(ARM媒体功能扩展):单指令流多数据流(SIMD)能力使得软件更有效地完成高性能的媒体应用,如声音和图像编码器。

尽管ARM体系结构版本较多,但每一个版本都继承了前一个版本的基本设计,且指令集向下兼容。因此,在设计时只要它们支持相同的ARM体系版本,基于它们的应用软件将是兼容的。1.2.2 ARM处理器核扩充标识

ARM系列产品通常以“ARM【x】【y】【z】【T】【D】【M】【I】【E】【J】【F】【-S】”的形式进行标识,表1.2显示了ARM体系结构的命名规则及后缀的具体含义。表1.2 ARM处理器的命名规则及后缀的具体含义

需要注意以下几点。

①ARM 7TDMI之后的所有ARM内核,即使“ARM”标志后没有包含“TDMI”字符,也都默认包含了TDMI特性。

②嵌入式ICE宏单元是建立在处理器内部用来设置断点和观察点的调试硬件。

③可综合,意味着处理器内核是以源代码的形式提供的。这种源代码形式可被编译成一种易于EDA工具使用的形式。

1.3 ARM处理器产品系列

ARM处理器当前有6个产品系列:ARM7、ARM9、ARM9E、ARM10E、ARM11和SecurCore。进一步的产品来自于合作伙伴,如Intel Xscale。ARM7、ARM9、ARM9E、ARM10E是4个通用处理器系列,每个系列提供一套相对独特的性能来满足不同应用领域的需求,SecurCore系列是专门为安全要求较高的应用而设计的。1.3.1 ARM7系列

ARM7系列是低功耗的32位RISC处理器,最适合用于对价位和功耗要求较高的消费类产品。ARM7系列有如下特点:

● 具有嵌入式ICE-RT逻辑,调试开发方便。

● 极低的功耗,适合对功耗要求较高的应用,如便携式产品。

● 能够提供0.9 MIPS/MHz的三级流水线结构。

● 兼容16位的Thumb指令集,代码密度高。

● 对操作系统的支持广泛,支持Windows CE、Linux、Palm OS等。

● 指令系统与ARM9系列、ARM9E系列和ARM10E系列兼容,便于用户的产品升级换代。

● 主频最高可达130 MHz,高速的运算处理能力能胜任绝大多数的复杂应用。

ARM7系列微处理器包括如下几种类型的核:ARM7TDMI、ARM7TDMI-S、ARM720T、ARM7EJ-S。其中,ARM7TMDI是目前使用最广泛的32位嵌入式RISC处理器,属于低端ARM处理器核。

ARM7系列的主要应用领域包括:工业控制、Internet设备、网络和调制解调器设备、移动电话等多种多媒体。1.3.2 ARM9系列

ARM9系列在高性能和低功耗特性方面有着最佳的表现,具有如下特点:

● 5级流水线,指令执行效率更高。

● 提供1.1 MIPS/MHz的哈佛结构。

● 支持32位ARM指令集和16位Thumb指令集。

● 支持32位的高速AMBA总线接口。

● 全性能的MMU,支持Windows CE、Linux、Palm OS等多种主流嵌入式操作系统。

● MPU支持实时操作系统。

● 支持数据Cache和指令Cache,拥有更高的处理能力。

ARM9系列包含ARM920T、ARM922T和ARM940T三种类型,以适用于不同的应用场合。

ARM9系列主要应用于无线设备、仪器仪表、安全系统、机顶盒、高端打印机、数字照相机和数字摄像机等。1.3.3 ARM9E系列

ARM9E系列支持DSP指令集,适合于高速数字信号处理的场合,具有如下特点:

● 支持32位的高速AMBA总线接口。

● 支持VFP9浮点处理协处理器。

● 5级流水线,指令执行效率更高。

● 主频最高可达300 MHz。

ARM9E系列微处理器包含ARM926EJ-S、ARM946E-S和ARM966E-S三种类型,以适用于不同的应用场合。

ARM9E系列主要应用于下一代无线设备、数字消费品、成像设备、工业控制、存储设备和网络设备等领域。1.3.4 ARM10E系列

ARM10E系列具有高性能、低功耗的特点,由于采用了新的体系结构,与同等的ARM9器件相比较,在同样的时钟频率下,性能提高了近50%。同时,ARM10E系列采用了两种先进的节能方式,使其功耗极低。ARM10E系列具有如下特点:

● 支持DSP指令集,适合于需要高速数字信号处理的场合。

● 6级流水线,指令执行效率更高。

● 支持32位的高速AMBA总线接口。

● 支持VFP10浮点处理协处理器。

● 内嵌并行读/写操作部件。

● 主频最高可达400 MHz。

ARM10E系列包含ARM1020E、ARM1022E和ARM1026EJ-S三种类型,以适用于不同的应用场合。

ARM10E系列微处理器主要应用于下一代无线设备、数字消费品、成像设备、工业控制、通信和信息系统等领域。1.3.5 ARM11系列

ARM1136J-S是针对高性能和高能效应而设计的。ARM1136EJ-S是第一个执行ARMv6架构指令的处理器。它集成了一条具有独立的加载/存储和算术流水线的8级流水线。1.3.6 SecurCore系列

SecurCore系列专为安全需要而设计,提供了完善的32位RISC技术的安全解决方案。因此,SecurCore系列除了具有ARM体系结构的低功耗、高性能的特点外,还具有其独特的优势,即提供了对安全解决方案的支持。主要表现在如下几个方面:

● 带有灵活的保护单元,确保操作系统和应用数据的安全。

● 采用软内核技术,防止外部对其进行扫描探测。

● 可集成用户自己的安全特性和其他协处理器。

SecurCore系列包含SecurCore SC100、SecurCore SC110、SecurCore SC200和SecurCore SC210四种类型。

SecurCore系列主要应用于一些对安全性要求较高的产品及应用系统中,如电子商务、电子政务、电子银行业务、网络和认证系统等领域。1.3.7 Xscale系列

Xscale是ARM体系结构的一种内核,基于ARM v5TE体系结构,由Intel公司开发,在架构扩展的基础上同时也保留了对于以往产品的向下兼容,因此获得了广泛的应用。相比于ARM处理器,XScale功耗更低,系统伸缩性更好,同时核心频率也得到提高,达到了400 MHz,甚至更高。这种处理器还支持高效通信指令,可以和同样架构处理器之间达到高速传输。其中一个主要的扩展就是无线MMX,这是一种64位的SIMD指令集,在新款的 Xscale处理器中集成了SIMD协处理器。这些指令集可以有效地加快视频、3D图像、音频及其他SIMD传统元素的处理。

基于Xscale内核的处理器主要包括:Intel PXA25X、Intel PXA26X、Intel PXA27X。

Intel Xscale微处理器在数字移动电话、个人数字助理和网络等领域获得了十分广泛的应用。1.3.8 其他系列处理器

为了适应市场的需要,ARM还推出了两个新的处理器:Cortex-M3和MPCore。Cortex-M3主要针对微控制器市场,而MPCore主要针对高端消费类产品。

Cortex-M3改进了代码密度,减少了中断延迟并有更低的功耗,同时实现了最新的Thumb-2指令集。MPCore提供了Cache一致性,每个支持1~4个ARM11核,这种设计很好地平衡了现代消费类产品对性能和功耗的需求。

1.4 ARM体系结构的发展

ARM体系结构目前被公认为是业界领先的32位嵌入式RISC处理器结构,ARM体系结构为满足ARM合作者及设计领域的一般需求正稳步发展。

ARM处理器的体系结构定义了指令集架构(ISA,Instruction Set Architecture)和基于这一体系结构下处理器的程序员模型。尽管每个处理器性能不同,所面向的应用不同,但其实现都要遵循这一体系结构。每个ARM处理器都有一个特定的ISA,图1.1表明了ARM处理器的ISA发展过程。图1.1 ARM处理器的ISA发展过程

如图所示,每一次ARM体系结构的重大修改,都会添加极为关键的技术。在体系结构进行重大修改期间,会添加新的性能作为体系结构的变体。ISA的每一次发展,主要体现在命名上,就是在版本名称中增加新的变量(如前所述的变种)。总之,ISA的发展分为下面几个过程:

①v3架构中引入了32位寻址,而且在版本号中增加了变量T和变量M。M变种从ARM v3中引入。

②v4架构中增加了半字Load/Store指令。T变种从v4架构引入。

③v5架构中增加了ARM/Thumb交互工作机制,而且在版本号中增加了变量E和变量J。

④v6架构中增加了媒体指令。所有上面提到的“TEJ”变量特性也都集成在ARMv6体系结构中。

下一代体系结构的发展是由不断涌现的新产品和变化的市场来推动的,功能、性能、速度、功耗、面积和成本必须与每一种应用的需求相平衡。保证领先的性能/功耗(MIPS/Watt)在过去是ARM成功的基石,在将来的应用中同样也是一个重要的衡量标准。随着计算机和通信技术持续覆盖许多消费领域,功能也变得越来越复杂,消费者期望有高级的用户界面、多媒体及增强的产品性能,ARMv6将对这些新性质和技术进行有效的支持。ARMv6体系结构的发展与提升,主要集中在如下五个方面。

1.存储器管理

存储器管理方式极大地影响了系统设计和性能。存储器结构的提升将大大提高处理器的整体性能——尤其是对于面向平台的应用。ARMv6体系结构可以提高取指(数据)效能。处理器将在等待指令和缓存未命中数据重装载上花费更少的时间。存储器管理的提升将会使系统性能提升30%。并且存储器管理的提升也会提高总线的使用效率,而更少的总线活动意味着功耗的降低。

2.多处理器

应用驱动系统实现向多处理器方向发展。无线平台,尤其是3G,是典型的需要整合多个ARM处理器或ARM与DSP的应用。多处理器通过共享内存来有效地共享数据。新的ARMv6在数据共享和同步方面的能力将使它更容易实现多处理器,以及提高它们的性能。

3.多媒体支持

单指令流多数据流(SIMD)能力使得软件更有效地完成高性能的媒体应用,比如声音和图像编码器。ARMv6指令集中加入了超过60个的SIMD指令,从而将使性能提高2倍到4倍。SIMD可以用于实现高端的诸如图像编码、语音识别、3D图像,尤其是与下一代无线应用相关的技术。

4.数据处理

数据的大小端问题是指数据以何种方式在存储器中被存储和引用。

随着更多的SoC集成,单芯片不仅包含小端的OS环境和界面(像USB、PCI),也包含大端的数据(TCP/IP包,MPEG流)。ARMv6体系结构支持混合结果,数据处理问题在ARMv6体系结构中更为有效。

ARMv6可以实现64位或64位以上的总线宽度,这使得其总线等于甚至超过64位处理器,但功耗和面积却比64位CPU要低。

5.异常与中断

对于实时系统来说,中断的效率是严格要求的。像硬盘控制器、引擎管理应用,这些应用中如果中断没有及时得到响应,那么后果将是严重的。在ARMv6体系结构中,新的指令被加入了指令集来加强中断与异常的实现,从而有效提升特权模式下的异常处理及系统的整体表现。

ARM11是ARMv6体系结构的第一个实现,ARM11微结构的设计目的是为了高性能,而实现这一目标的关键是流水线。ARM11微结构的流水线与以前的ARM核不同,它包含8级流水线,使贯通率比以前的核提高40%。其中,单指令发射、动态和静态两种分支预测技术的使用、存储器的非阻塞操作、支持乱序执行的并行流水线及合理的局部64位数据总线和可选的浮点处理单元,都为其高性能的实现提供了有效的技术保障。

本章小结

由于ARM芯片的种类、功能千差万别,因此它们的应用场合也各不相同,出于应用选型的需要,本章介绍了ARM的完整概念,详细比较了ARM体系结构各版本的改进之处;并在阐述ARM处理器核的扩充标识的基础上,系统总结了已经成熟并获得广泛应用的ARM各个系列处理器的技术特点及应用领域。本章的最后则是对已经发布的ARM体系结构v6版本和已经正式投入使用的ARM11系列处理器进行了必要的介绍。思考题

① 什么是ARM架构?

② 如何理解ARM产品的命名规则?

第2章 ARM开发流程及交叉开发环境

在使用ARM处理器开发嵌入式系统时,掌握有效的开发方法和合适的开发工具可以加快开发进度,节省开发成本。本章首先通过一个基于ADS 1.2嵌入式集成开发环境的简单实例,介绍基于ARM的一般应用程序设计流程,使读者对ARM的开发流程有一个初步的认识和完整的印象。

2.1 ARM的一般开发流程

与典型的嵌入式系统类似,基于ARM的开发包括代码的编写、编译、调试和下载。图2.1所示是一般的ARM设计开发流程,共包含四个基本步骤,结合具体实例的集成开发环境的设计流程将在随后的内容中详细介绍。图2.1 ARM设计开发流程

2.2 交叉开发环境简介

作为嵌入式系统应用的ARM处理器,其应用软件的开发属于跨平台开发,因此需要一个交叉开发环境。交叉开发是指在一台通用计算机上进行软件的编辑、编译,然后下载到嵌入式设备中进行运行调试的开发方式。用来开发的通用计算机可以选用比较常见的PC、工作站等,运行通用的Windows或UNIX操作系统即可。开发计算机一般称为宿主机,嵌入式设备则称为目标机。在宿主机上编译好的程序,将下载到目标机上运行,而交叉开发环境则提供对目标机上运行的程序进行调试的调试工具。

交叉开发环境一般由运行于宿主机上的交叉开发软件和宿主机到目标机的调试通道组成。

运行于宿主机上的交叉开发软件最少必须包含编译调试模块,其编译器为交叉编译器。宿主机一般为基于x86体系的台式计算机,而编译出的代码必须在ARM体系结构的目标机上运行,这就是所谓的交叉编译。在宿主机上编译好目标代码后,通过宿主机到目标机的调试通道将代码下载到目标机,然后由运行于宿主机的调试软件控制代码在目标机上运行调试。为了方便调试开发,交叉开发软件一般为一个整合了编辑、编译汇编链接、调试、工程管理及函数库等功能模块的集成开发环境(IDE,Integrated Development Environment)。2.2.1 ARM集成开发环境ADS

目前主流的ARM集成开发环境软件有ARM公司的ADS、IAR Systems公司的IAR、KEIL公司的KEIL for ARM(MDK)及中国深圳英蓓特公司的Embest IDE。

ADS全称为ARM Developer Suite,是ARM公司推出的新一代ARM集成开发工具。现在ADS的最新版本是1.2,它取代了早期的ADS 1.1和ADS 1.0。在ADS工具诞生之前,一直使用的是ARM SDT工具,目前ARM SDT工具已经慢慢被淘汰。ADS除了可以安装在Windows NT4、Windows 2000、Windows 98和Windows 95操作系统下,还支持Windows XP和Windows Me操作系统。

ADS 1.2提供了完整的Windows界面开发环境,支持汇编、C/C++及Java;C编译器的效率极高,生成的代码密度和执行速度优异,可快速地创建ARM结构应用;而且还提供软件模拟仿真功能,使得没有Emulators的用户也能够熟悉ARM的指令系统。

ADS软件主要由命令行开发工具、图形用户界面开发工具(GUI,Graphics User Interface,包含Code Warrior和AXD)、实用辅助程序和支持软件组成。有了这些部件,用户就可以开始为ARM系列的RISC处理器编写和调试自己的应用程序。下面将分别介绍这4个组成部分的功能。

1.命令行开发工具

命令行开发工具的应用较为广泛,使用它的最大好处就是可以将许多编译命令写在一个脚本文件中,然后只执行该脚本文件就可以让工具自动完成所有编译的工作。命令行中常用的命令如下:(1)armcc

armcc是ARM C编译器,这个编译器通过了Plum HallCValidation Suite为ANSI C进行的一致性测试。armcc用于将用ANSI C编写的程序编译成32位ARM指令代码。(2)armcpp

armcpp是ARM C++编译器,它将ISO C++或E C++编译成32位ARM指令代码。(3)tcc

tcc是Thumb C编译器,该编译器通过了Plum HallCValidation Suite为ANSI进行的一致性测试。tcc将ANSI C源代码编译成16位的Thumb指令代码。(4)tcpp

tcpp是Thumb C++编译器,它将ISO C++和E C++源代码编译成16位Thumb指令代码。(5)armasm

armasm是ARM和Thumb的汇编器,它对用ARM汇编语言和Thumb汇编语言编写的源代码进行汇编。(6)armlink

armlink是ARM连接器,该命令既可以将编译得到的一个或多个目标文件和相关的一个或多个库文件进行连接,生成一个可执行文件;也可以将多个目标文件部分连接成一个目标文件,以供进一步的连接。ARM连接器生成的是ELF格式的可执行映像文件。(7)armsd

armsd是ARM 和Thumb的符号调试器,它能够进行源码级的程序调试。用户可以在用C或汇编语言编写的代码中进行单步调试、设置断点、查看变量值和内存单元的内容。

有关以上各命令的具体使用方法请参考ADS软件的在线帮助文件。

下面给出一个简单的应用实例来查看常用的ARM命令行是如何使用的。以本书附加资源(可在电子工业出版社华信教育资源网上下载,参见网址www.hxedu.com.cn)中的SWI(Software Interrupter)参考项目为例,它的编译命令如下:

其中,armasm命令用来编译ARM汇编代码,armcc用来编译C代码,armlink用来最终连接目标文件为ELF格式的可执行映像文件。

2.图形用户界面开发工具

ADS图形用户界面开发环境包含Code Warrior和AXD两种工具,其中CodeWarrior是集成开发工具,而AXD是调试工具。

①CodeWarrior for ARM工具是专为基于ARM RISC的处理器而设计的,它可以加速并简化嵌入式开发过程中的每一个环节,使开发人员无需离开CodeWarrior集成开发环境(IDE)就能研制出ARM产品。其主要原因有两方面:一是全面的项目管理功能;二是子函数的代码导航功能,使得用户能迅速找到程序中的子函数。但CodeWarrior IDE在UNIX下不能使用。

②AXD(ARM eXtended Debugger),即ARM扩展调试器。调试器本身是一个软件,用户通过这个软件使用调试代理,可以对包含调试信息的、正在运行的可执行代码进行变量的查看、断点的控制等调试操作。调试代理既不是被调试的程序,也不是调试器。在ARM体系中,它有这样几种方式:Multi-ICE(Multi-processor In-Circuit Emulator)、ARMulator和Angel。其中Multi-ICE是一个独立的产品,是ARM公司自己的JTAG在线仿真器,不是由ADS提供的。AXD可以在Windows和UNIX下进行程序的调试,它为用C、C++和汇编语言编写的源代码提供了一个全面的Windows和UNIX环境。

3.实用辅助程序

ADS除了提供上述工具之外,它还提供以下的实用工具来配合前面介绍的命令行开发工具的使用。

①Flash downloader是用于把二进制映像文件下载到ARM开发板上的Flash存储器的工具。

②fromELF是ARM映像文件转换工具。该命令将ELF格式的文件作为输入文件,然后将该格式文件转换为各种输出格式的文件,包括plain binary(BIN格式映像文件)、Motorola 32-bit S-record format(Motorola 32位S格式映像文件)、Intel Hex 32-bit format(Intel 32位格式映像文件)和Verilog-like hex format(Verilog十六进制文件)。fromELF命令也能够为输入映像文件产生文本信息,例如代码和数据长度。

③armar是ARM库函数生成器,它将一系列ELF格式的目标文件以库函数的形式集合在一起,用户可以把一个库传递给一个连接器以代替几个ELF文件。

4.支持的软件

ADS为用户提供了ARMulator软件,使用户可以在软件仿真的环境下或在基于ARM的硬件环境下调试用户的应用程序。ARMulator是一个ARM指令集仿真器,集成在ARM的调试器AXD中,它提供对ARM处理器的指令集的仿真,为ARM和Thumb提供精确的模拟,使用户可以在硬件尚未做好的情况下开发程序代码。2.2.2 ADS 1.2软件的安装

在光驱里插入安装光盘或者双击桌面上的setup.exe文件之后,会出现图2.2所示的欢迎界面。图2.2 ADS 1.2安装欢迎界面

单击“Next”按钮,在选择了程序的安装位置之后,会出现图2.3所示的选择文件关联界面。

单击“Next”按钮,会出现图2.4所示的程序激活向导界面。图2.3 选择文件关联界面图2.4 程序激活向导界面

单击“下一步”按钮,在出现的激活码和许可证文件输入界面按提示进行操作,如图2.5所示。图2.5 激活码和许可证文件输入界面

单击“下一步”按钮,软件安装完毕。出现ADS 1.2的启动界面,如图2.6所示。下面将通过一个简单的实例来初步熟悉Code Warrior IDE的基本使用方法和ARM应用程序的基本开发流程。图2.6 ADS 1.2的启动界面

2.3 一个使用ADS 1.2开发的简单设计实例

本节将通过输出字符串“Hello World!”的小程序为例来阐述一个ARM应用程序的基本开发流程。本例中使用的ADS软件是1.2版本,使用的实验板为44B0学习评估板(处理器为ARM7TDMI)。

依据ARM开发的一般流程,该实例的具体设计过程如下所示。

①建立工程、添加和新建文件。

②进行调试前的配置。

③编译除错和连接,按照编译结果提示进行除错,直至编译通过。

④用AXD进行软件调试。

⑤JTAG调试。

⑥Flash烧写。

⑦复位、运行。2.3.1 使用CodeWarrior建立工程

①首先选择“开始”→“程序”→“ARM Developer Suite V1.2”→“Codewarrior for ARM Developer Suite”菜单,打开Codewarrior对话框,进入新建工程界面,如图2.7所示。图2.7 新建工程界面

ADS为用户提供了7个模板,分别是

● ARM Executable Image:用于由ARM指令的代码生成一个ELF格式的可执行映像文件。

● ARM Object Library:用于由ARM 指令的代码生成一个armar格式的目标文件库。

● Empty Project:用于创建一个不包含任何库或者源文件的工程。

● Makefile Importer Wizard:用于将VC的nmake或者GNU make文件转入到Code Warrior IDE 工程文件。

● Thumb ARM Interworking Image:用于由ARM指令和Thumb指令的混合代码生成一个可执行的ELF 格式的映像文件。

● Thumb Executable Image:用于由Thumb指令创建一个可执行的ELF格式的映像文件。

● Thumb Object Library:用于由Thumb指令的代码生成一个armar格式的目标文件库。

通常情况下均选择“ARM Executable Image”,然后在“Project name:”(文件名:)文本框输入工程名称,在“Location:”(保存在:)文本框指定路径,本例的工程名称为“Hello”,单击“确定”按钮后建立“Hello”工程,如图2.8所示。图2.8 设置工程路径和工程名称

②工程建立以后将生成一个空的工程管理窗口,如图2.9所示。

③向工程内添加和建立目标文件,由于44B0学习评估板具有较多的资源,其启动文件较为复杂,所以一般都是直接打包使用,因此在添加启动文件之前需先将“44B0EVB”文件夹复制到“Hello”工程目录下。然后通过工程管理窗口进行启动文件的添加(在这一步,读者可根据自己使用的开发板来添加相应的启动文件),如图2.10所示。图2.9 工程管理窗口图2.10 建立Group

如图2.11所示,单击鼠标右键,在弹出的快捷菜单中选择“Create Group”命令,建立一个“44B0X”文件夹,然后再单击鼠标右键选择“Add Files…”命令,添加启动文件。图2.11 添加启动文件

在添加文件的过程中会发现建立了三个Target,分别是“DebugRel”、“Release”、“Debug”,这三个Target分别表示三种调试方式。DebugRel会在生成目标的时候为每一个源文件生成调试信息,Debug会为每一个源文件生成最完整的调试信息,Release不生成任何调试信息。从图2.12可以看出,每次添加文件的时候都会询问添加哪个“Target”,一般默认三个都添加,用户通常会选择“DebugRel”,然后单击“OK”按钮。图2.12 将文件添加到Target2.3.2 向工程中添加源文件

单击图2.7中的File选项卡,选中Text File,并设置好文件名和路径,然后单击“确定”按钮。CodeWarrior就会新建一个源文件,并且可以开始编辑该空文件。输入下面的代码段,然后保存文件。

在main.c文件建立之后重新单击鼠标右键,选择文件添加到工程中。此时,整个工程建立完毕。工程创建完之后暂时还不能进行编译和连接,还需要进行一些配置。2.3.3 调试前的配置

选择“Edit”→“DebugRel Settings”菜单或者按下“ALT+F7”组合键,进入“DebugRel Settings”对话框,如图2.13所示。图2.13“DebugRel Settings”对话框“DebugRel Settings”对话框中面包含了很多配置信息,在此只说明几个和本实例相关的配置信息。

①单击“Target Settings”选项完成目标板设置,“Post-linker”子选项用于对输出文件进行操作,由于本实例是需要最终写入到硬件中并运行的,所以必须进行设置(如果只需要进行软件仿真则可以不添加操作)。这里选择“ARM fromELF”子选项,表示编译生成映像文件(Image)后再调用FromELF命令进行格式转换,以转换成.bin或.hex等可以直接烧写到目标芯片执行的文件格式。

②单击“Language Settings”选项完成语言设置,本实例使用了“ARM Assembler”和“ARM C Compiler”,可以确保在这两个选项的“Target”子选项中为“ARM7TDMI”(44B0为ARM7TDMI,读者在这一步可以根据选用的ARM开发板进行相应的设置),如图2.14所示。

③最后进行“Linker”选项的设置。该选项中的一些设置和硬件紧密相关,首先进入“ARM Linker”子选项,在该子选项内需要设置入口地址(entry)、RO地址、RW地址。

首先设置RO/RW地址,RO表示Read Only,RW表示Read Write,RO栏默认是0x8000,需要根据实际硬件进行更改,一般为Flash地址,RO也可以设置在SDRAM中;启动代码中包含COPY的部分,会将代码移动到SDRAM中运行;entry point必须同RO一致,以提供连接器定位信息。图2.14 设置“Language Settings”选项

44B0板的Flash 地址即为0x00000000;RW栏默认为空,一般为SDRAM地址,44B0板的地址即为0x0C000000(RO也可以设置在SDRAM中,但entry point必须同RO一致),如图2.15所示。图2.15 设置“ARM Linker”的“Output”选项卡

如图2.16所示,在“ARM Linker”的“Options”选项卡中还需要设置一个“Image entry point”项,表示映像文件的入口地址。图2.16 设置“ARM Linker”的“Options”选项卡

设置完“Image entry point”项后,继续在“Layout”选项卡中确定将代码的哪一段置于映像文件的起始位置。在图2.17中,vector.o selfboot的意思就是将vector.o置于映像文件的起始位置(这些项必须进行设置)。图2.17 设置“ARM Linker”的“Layout”选项卡

在“Linker”选项下还有一个子选项需要进行设置,即“ARM fromELF”。在第一步“Target Setting”的“Post-linker”设置中完成“FromELF”选择后,在这里需要进一步进行设置,如图2.18和图2.19所示。图2.18 设置“Linker”→“ARM fromELF”→“Output format”项图2.19 设置“Linker”→“ARM fromELF”→“Output file name”项

到此,基本的配置已经完成,接下来就可以进行编译和连接。2.3.4 编译和连接

选择“Project”→“Make”菜单或者按下F7快捷键,如果一切设置正确,则出现如图2.20所示的信息。图2.20 选择“Project”→“Make”菜单后出现的提示信息

选择“Project”→“Make”菜单或按下F7快捷键,最终生成可执行文件hello.bin/hello.hex和调试文件hello.axf(映像文件)。其中可执行文件的路径由用户在“Linker”→“ARM fromELF”项中的设置所决定;而调试文件hello.axf默认生成在“...\Hello\Hello_Data\DebugRel”路径下。hello.bin/hello.hex可以通过工具软件直接烧入目标芯片运行,hello.axf可以通过ADS里面集成的AXD调试工具进行软件调试和仿真,另外也可以通过第三方JTAG调试工具进行调试。2.3.5 使用AXD进行代码调试

AXD(ARM eXtended Debugger)是ADS软件中独立于CodeWarrior IDE的图形界面调试软件,是基于Windows和UNIX使用的ARM调试器。它提供了一个完整的Windows和UNIX环境来调试C、C++和汇编语言级的代码。

打开AXD软件后,默认打开的目标是ARMulator,它是调试中最常用的一种工具,可完成软件仿真。下面的内容主要是结合ARMulator介绍在AXD中进行代码调试的方法和过程,使读者对AXD的调试有初步的了解。然后继续简单讲解如何通过JTAG开发工具进行硬件仿真。

如果要使用AXD,首先必须生成包含调试信息的程序。在前面的Hello工程中,已经生成的hello.axf文件就是包含调试信息的可执行ELF格式的映像文件。

1.在AXD中打开调试文件

进入AXD有两种方法:一是在完成“Make”命令后通过“Project”→“Debug”菜单或者按下F7快捷键进入AXD;此外也可以通过“开始”→“程序”→“ARM Developer Suite”→“AXD”菜单打开AXD。然后,在“File”菜单中选择“Load image…”命令,打开“Load Image”对话框,找到要装载的.axf映像文件。单击“打开”按钮,即可将映像文件装载到目标内存中。

如果在“Execute”菜单中选择“Go”命令,将全速运行代码。如果要进行单步调试,则在“Execute”菜单中选择“Step”(单步执行)命令,或按下F10快捷键即进入单步执行,窗口中蓝色箭头会发生相应的移动。当用户希望程序执行到某处时查看一些所关心的变量值,则可以通过断点设置来实现。

2.设置断点

将光标移动到断点,在“Execute”菜单中,选择“Toggle Breakpoint”命令或按下F9快捷键,就会在光标所在位置出现一个实心圆点,表明该处为断点。然后就可以查看寄存器值、变量值、某个内存单元的数值等。2.3.6 使用JTAG工具进行硬件调试

ARMulator仿真一般是在不具备硬件条件的情况下进行软件仿真,多用于学习状态,并不能完全反映实际硬件运行状态。接下来简单介绍使用JTAG工具进行硬件调试的流程。

①首先需要安装调试软件(如BANYAN II),并在调试前先运行它,具体安装和使用请参见用户手册。

②启动软件并将目标板连接到计算机,并根据用户手册和使用的开发板进行相应的设置。

③后续的流程就和使用ARMulator相差无几了。2.3.7 代码的下载和烧写

使用代码下载软件来完成可执行文件的烧写,完成后如图2.21示。图2.21 完成报告

本章小结

与典型的嵌入式应用开发相同,基于ARM的开发流程也包括代码的编写、编译和连接、调试和代码的固化、下载。本章重点介绍了应用极为广泛的ARM公司的ADS 1.2集成开发环境,并以一个简单的设计实例阐述了完整的基于ARM的应用程序开发流程,以期使读者对基于ARM的开发有一个初步、完整的认识。思考题

1.ADS 1.2开发环境的特点是什么?其基本组成是什么?

2.如何理解交叉开发?

3.怎样建立ARM Linux交叉编译环境?

第3章 ARM的编程模型及指令寻址方式

编程模型是指程序员基于特定的处理器编写程序时所能“看到”的,并且可以在程序中使用的系统资源及其相互间的关系。本章简单介绍ARM处理器编程模型的一些基本概念,包括ARM处理器支持的数据类型,工作状态切换、数据的存储格式、寄存器组织、处理器异常等。通过对编程模型的学习,掌握ARM处理器的基本工作原理和一些与程序设计相关的基本技术细节,为以后的程序设计打下基础。

在开始本章之前,首先对ARM的基本数据类型进行简单的说明,ARM的基本数据类型主要包括字(Word)、半字(Half-Word)和字节(Byte)三种,其中:

● 字(Word):在ARM体系结构中,字的长度为32位。

● 半字(Half-Word):在ARM体系结构中,半字的长度为16位。

● 字节(Byte):在ARM体系结构中,字节的长度为8位。

备注:

①ARM体系结构v4以上版本支持所有3种数据结构,ARMv4以前版本仅支持字节和字。

②当将这些数据类型中的任一种声明为unsigned类型时,N位数N据值表示范围为0~2-1的非负整数,使用通常的二进制格式。

③当将这些数据类型的任一种声明为 signed 类型时,N 位数据N-1N-1值表示范围为-2~2-1的整数,使用二进制的补码格式。

④所有数据操作(如ADD)以字进行处理。

⑤加载和存储操作可以按照字节、半字和字的大小向(和从)存储器传送数据。加载时自动进行字节或半字的零扩展或符号扩展。

⑥ARM指令恰好是一个字(与4字节边界对齐)。Thumb指令恰好是一个半字(与2字节边界对齐)。

3.1 ARM处理器编程模型

3.1.1 处理器的工作状态

从编程的角度来看,ARM处理器一般有两种工作状态,并可在两种状态之间切换:

● 第一种为ARM状态,此时处理器执行32位的字对齐的ARM指令。

● 第二种为Thumb状态,此时处理器执行16位的半字对齐的Thumb指令。在Thumb状态下,程序计数器(PC)使用位[1]选择另一个半字。

当ARM处理器执行32位的ARM指令集时,工作在ARM状态;当ARM处理器执行16位的Thumb指令集时,工作在Thumb状态。在程序的执行过程中,处理器可以随时通过指令在两种工作状态之间切换,而且处理器工作状态的转变并不影响处理器的工作模式和相应寄存器中的内容。但ARM处理器在开始执行代码时,应该处于ARM状态。

ARM处理器进入两种工作状态的方式为:

● 进入Thumb状态。当操作数寄存器的状态位(位[0])为1时,可通过执行BX指令使处理器从ARM状态切换到Thumb状态。如果处理器在Thumb状态进入异常,则当异常处理(IRQ、FIQ、Undef、Abort和SWI)返回时,自动转换到Thumb状态。

● 进入ARM状态。当操作数寄存器的状态位(位[0])为0时,可通过执行BX指令使处理器从Thumb状态切换到ARM状态。另外,在处理器进行异常处理(IRQ、FIQ、Reset、Undef、Abort和SWI)时,把PC放入异常模式连接寄存器中,并从异常向量地址开始执行程序,也可进入ARM状态。3.1.2 处理器模式

ARM体系结构支持如表3.1所示的7种处理器模式。表3.1 处理器模式

ARM处理器的运行模式可以通过软件改变。此外,外部中断或异常处理也可以引起处理器模式发生改变。

大多数应用程序运行在用户模式下。当处理器工作在用户模式时,正在执行的程序不能访问某些被操作系统保护的系统资源,也不能直接改变工作模式,除非异常发生。这种体系结构可以使操作系统控制整个系统资源的使用。

除用户模式外,其他6种模式统称为“特权模式”(privileged mode)。在这些模式下,程序可以自由地访问系统资源和改变处理器模式。其中的5种又称为“异常模式”(exception mode),即

● FIQ(Fast Interruptre Quest)

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载