相信学过计算机技术这门课程的读者都知道,通用CPU采用的是冯.诺依曼结构,而很多嵌入式处理器多采用哈佛结构,那么这两种结构究竟有什么区别,各自有什么优势,在进入嵌入式处理器的学习之前有必要先搞清楚这个问题。因此在开始嵌入式处理器的学习之前先让我们来了解一下这两种结构。
哈佛结构(Harvard)是哈佛大学物理学家A·Howard于1930年提出的,其结构原理如图1.1所示。哈佛结构的主要特点是将程序和数据存储在不同的存储器中,每个独立的存储器独立编址,独立访问,这一点是与冯·诺依曼结构的主要区别。该结构在片内设置了与两个存储器相对应的程序总线和数据总线,取指令和执行能重叠运行,故数据的吞吐率提高了一倍。
哈佛结构的微处理器通常具有较高的执行效率。其程序指令和数据指令分开组织和存储的,执行时可以预先读取下一条指令。
目前使用哈佛结构的中央处理器和微控制器有很多,摩托罗拉公司的MC68系列、Zilog公司的Z8系列、最为常用的8051系列、ATMEL公司的AVR系列和ARM公司的ARM9、ARM10、ARM11以及本书的主角Cortex-M3系列。
图 1‑1 哈佛结构示意图
哈佛结构是指程序和数据空间独立的体系结构, 目的是为了减轻程序运行时的访存瓶颈。
例如当一条指令同时取两个操作数, 在流水线处理时, 同时还有一个取指操作, 如果程序和数据通过一条总线访问, 取指和取数必会产生冲突, 而这对大运算量的循环的执行效率是很不利的。
哈佛结构能基本上解决取指和取数的冲突问题,然而,对于一些需要高速运算和数据处理的场合为了进一步提升运行速度和灵活性,人们在基本哈佛结构的基础之上做了一些改进提出了改进的哈佛结构,其主要特点如下。
(1)允许数据存放在程序存储器中,并被算数运算指令直接使用,增强了芯片的灵活性。
(2)指令存储在高速缓冲器中,当执行此指令时不需要再从存储器中读取指令,节约了一个指令周期,大大提高了运行速度。
冯·诺依曼结构(Von Neumann)也称普林斯顿结构(Princetonarchitecture),是一种将程序指令存储器和数据存储器合并在一起的存储器结构。程序指令存储地址和数据存储地址指向同一个存储器的不同物理位置,因此程序指令和数据的宽度相同,如英特尔公司的8086中央处理器的程序指令和数据都是16位宽。
冯·诺曼结构处理器具有以下几个特点:必须有一个存储器;必须有一个控制器;必须有一个运算器,用于完成算术运算和逻辑运算;必须有输入和输出设备,用于进行人机通信。冯·诺依曼的主要贡献就是提出并实现了“存储程序”的概念。由于指令和数据都是二进制码,指令和操作数的地址又密切相关,因此,当初选择这种结构是自然的。但是,这种指令和数据共享同一总线的结构,使得信息流的传输成为限制计算机性能的瓶颈,影响了数据处理速度的提高。
指令的强弱是CPU的重要指标,指令集是提高微处理器效率的最有效工具之一。从现阶段的主流体系结构讲,指令集可分为复杂指令集(CISC)和精简指令集(RISC)两部分。相应的,微处理随着微指令的复杂度也可分为CISC及RISC这两类。
CISC是一种为了便于编程和提高记忆体访问效率的晶片设计体系。在20世纪90年代中期之前,大多数的微处理器都采用CISC体系——包括Intel的80x86和Motorola的68K系列等。即通常所说的X86架构就是属于CISC体系的。RISC是为了提高处理器运行的速度而设计的晶片体系。它的关键技术在于流水线操作(Pipelining):在一个时钟周期里完成多条指令。而超流水线以及超标量技术已普遍在晶片设计中使用。RISC体系多用于非x86阵营高性能微处理器CPU。像ARM(Advanced RISC Machines),既可以认为是一个公司的名字,也可以认为是对一类微处理器的通称,还可以认为是一种技术的名字。而ARM体系结构目前被公认为是业界领先的32位嵌入式RISC 微处理器结构。所有ARM处理器共享这一体系结构。因此我们可以从其所属体系比较入手,来进行X86指令集与ARM指令集的比较。
CISC复杂指令系统计算机通过增强计算机指令系统功能,通过程序去执行大量功能各异的指令,从而优化计算机系统的性能。
由于具有大量的指令,因此CISC体系的优缺点也很明显。优点:
a) 具有丰富的指令系统,很大程度上简化了程序设计的难度。
b) CISC中不要求指令长度统一,可以节省存储空间。
c) CISC指令可以直接对存储器操作,使得通用寄存器数目较少。
同时CISC指令系统也带来很多问题:
a) 由于指令系统庞大,寻址方式、指令格式较多,指令长度不一,增加了硬件复杂程序,设计成本较高。
b) 指令操作复杂、执行周期长、速度低,难以优化编译生成高效的机器语言。
c) 许多指令使用频度低,增加了系统负担,降低了性价比。
和CISC相比,RISC的指令就要少得多,通常在几十条左右,其基本设计思想是尽量简化计算机的指令功能,从而降低硬件执行指令的复杂度,因为软件比硬件容易提供更大的灵活性和更高的智能。因此CISC的主要特点如下:
a) 精简指令集:只保留了数量很少、功能简单、能在一个机器周期内完成的指令,如果要执行复杂的程序功能则通过子程序而不是使用复杂指令来实现。
b) 指令长度相同:每条指令的长度都是相同的,可以在一个单独操作里完成。
c) 单机器周期指令:大多数的指令都可以在一个机器周期里完成,并且允许处理器在同一时间内执行一系列的指令。
使用RISC指令具有以下优势:
a) 精简指令系统的设计适合超大规模集成电路的实现。由于指令条数相对较少,寻址方式简单,指令格式规整,与CISC结构相比,控制器的译码和执行硬件相对简单,因此芯片中用于实现控制器的晶体面积明显减小。
b) 在使用相同的晶片技术和相同运行时钟下,RISC系统具有更快的运行速度。精简的指令系统可以加快指令的译码,控制器的简化可以缩短指令的执行延时等,这些都可以提高程序的执行速度。
c) 可以提供直接支持高级语言的能力,简化编译程序的设计。指令总数的减少,缩小了编译过程中对功能类似的机器指令的选择范围,减轻了对各种寻址方式进行选择、分析和变换的负担,易于更换或取消指令、调整指令顺序,提高程序运行速度。
d) RISC处理器比相对应的CISC处理器设计更简单,所需要的时间将变得更短,并可以比CISC处理器应用更多先进的技术,开发更快的下一代处理器。
相应的,RISC也存在一些缺点,主要有:
a) 由于指令少,因此加重了汇编程序员的负担,增加了机器语言程序的长度,从而占用了较大的存储空间。
b) 相对来说,RISC对编译器的要求更高,因为指令简单,RISC结构的性能就依赖于编译器的效率。编译器的优劣直接影响处理器的性能发挥。
综合上面所述,若要再进一步比较CISC与RISC之差异,可以由以下几点来进行分析:
1、指令的形成:CISC因指令复杂,故采微指令码控制单元的设计,而RISC的指令90%是由硬体直接完成,只有10%的指令是由软体以组合的方式完成,因此指令执行时间上RISC较短,但RISC所须ROM空间相对的比较大,至于RAM使用大小应该与程序的应用比较有关系。
2、定址模式:CISC的需要较多的定址模式,而RISC只有少数的定址模式,因此CPU在计算记忆体有效位址时,CISC占用的周期较多。
3、指令周期:CISC指令的格式长短不一,执行时的周期次数也不统一,而RISC结构刚好相反,故适合采用管线处理架构的设计,进而可以达到平均一周期完成一指令的方向努力。显然的,在设计上RISC较CISC简单,同时因为CISC的执行步骤过多,闲置的单元电路等待时间增长,不利于平行处理的设计,所以就效能而言RISC较CISC还是站了上风,但RISC因指令精简化后造成应用程式码变大,需要较大的程式记忆体空间,且存在指令种类较多等等的缺点。
4、大量使用寄存器
X86指令集是Intel为其第一块16位CPU(i8086)专门开发的,后来的电脑中为提高浮点数据处理能力而增加的X87芯片系列数学协处理器另外使用X87指令,以后就将X86指令集和X87指令集统称为X86指令集。虽然随着CPU技术的不断发展,Intel陆续研制出更新型的i80386、i80486,但为了保证电脑能继续运行以往开发的各类应用程序以保护和继承丰富的软件资源,所以Intel公司所生产的所有CPU仍然继续使用X86指令集,所以它的CPU仍属于X86系列。由于Intel X86系列及其兼容CPU都使用X86指令集,所以就形成了今天庞大的X86系列及兼容CPU阵容。除了具备上述CISC的诸多特性外,X86指令集有以下几个突出的缺点:
a) 通用寄存器组—对CPU内核结构的影响 X86指令集只有8个通用寄存器。所以,CISC的CPU执行是大多数时间是在访问存储器中的数据,而不是寄存器中的。这就拖慢了整个系统的速度。 RISC系统往往具有非常多的通用寄存器,并采用了重叠寄存器窗口和寄存器堆等技术使寄存器资源得到充分的利用。
b) 解码—对CPU的外核的影响解码器(Decode Unit),这是x86CPU才有的东西。其作用是把长度不定的x86指令转换为长度固定的类似于RISC的指令,并交给RISC内核。解码分为硬件解码和微解码,对于简单的x86指令只要硬件解码即可,速度较快,而遇到复杂的x86指令则需要进行微解码,并把它分成若干条简单指令,速度较慢且很复杂。Athlon也好,PIII也好,老式的CISC的X86指令集严重制约了他们的性能表现。
c) 寻址范围小—约束了用户需要 即使AMD研发出X86-64架构时,虽然也解决了传统X86固有的一些缺点,比如寻址范围的扩大,但这种改善并不能直接带来性能上的提升。
相比而言,以RISC为架构体系的ARM指令集的指令格式统一,种类比较少,寻址方式也比复杂指令集少。当然处理速度就提高很多。ARM处理器都是所谓的精简指令集处理机(RISC)。其所有指令都是利用一些简单的指令组成的,简单的指令意味着相应硬件线路可以尽量做到最佳化,而提高执行速率,相对的使得一个指令所需的时间减到最短。而因为指令集的精简,所以许多工作都必须组合简单的指令,而针对较复杂组合的工作便需要由『编译程式』(compiler) 来执行,而 CISC 体系的X86指令集因为硬体所提供的指令集较多,所以许多工作都能够以一个或是数个指令来代替,compiler 的工作因而减少许多。 除了具备上述RISC的诸多特性之外,可以总结ARM指令集架构的其它一些特点如下:
ARM的特点
a) 体积小,低功耗,低成本,高性能
b) 支持 Thumb(16位)/ARM(32位)双指令集,能很好的兼容 8 位 /16 位器件;
c) 大量使用寄存器,指令执行速度更快;
d) 大多数数据操作都在寄存器中完成;
e) 寻址方式灵活简单,执行效率高;
f) 指令长度固定;
g) 流水线处理方式
通过对体系结构以及指令集的介绍,相信读者能够对它们的优劣有一个简要的认识。大量的复杂指令、可变的指令长度、多种的寻址方式这些CISC的特点,也是CISC的缺点,因为这些都大大增加了解码的难度,而在现在的高速硬件发展下,复杂指令所带来的速度提升早已不及在解码上浪费点的时间。因此除了个人PC市场还在用X86指令集外,服务器以及更大的系统都早已不用CISC了。
目前X86架构的处理器仍然占据着通用处理器领域的主要市场,存在的理由就是为了兼容大量的X86平台上的软件,同时,它的体系结构组成的实现不太困难。 而RISC体系的ARM指令最大特点是指令长度固定,指令格式种类少,寻址方式种类少,大多数是简单指令且都能在一个时钟周期内完成,易于设计超标量与流水线,寄存器数量多,大量操作在寄存器之间进行,优点是不言而喻的,因此,ARM处理器才成为是当前最流行的处理器系列,是几种主流的嵌入式处理体系结构之一。
RISC架构的处理器目前正如日中天,微软的下一代操作系统——Windows 8也将支持ARM处理器,Wintel(微软和英特尔)联盟也将要瓦解,Intel似乎也将最终抛弃X86而转向RISC结构。而实际上,随着RISC处理器在嵌入式领域中大放异彩,传统的X86系列CISC处理器在Intel公司的积极改进下也克服了功耗过高的问题,成为一些高性能嵌入式设备的最佳选择,目前Intel公司大力发展的Atom处理器就是其中的代表。发展到今天,CISC与RISC之间的界限已经不再是那么泾渭分明,RISC自身的设计正在变得越来越复杂(当然并不是完全依着CISC的思路变复杂),因为所有实际使用的CPU都需要不断提高性能,所以在体系结构中加入新特点就在所难免。另一方面,原来被认为是CISC体系结构的处理器也吸收了许多RISC的优点,比如Pentium处理器在内部的实现中也是采用的RISC的架构,复杂的指令在内部由微码分解为多条精简指令来运行,但是对于处理器外部来说,为了保持兼容性还是以CISC风格的指令集展示出来。
一般来说,通常将嵌入式处理器分为四类,即嵌入式微控制器(MicroController Unit,MCU)、嵌入式微处理器(MicroProcessor Unit,MPU)、嵌入式DSP处理器(Digital Signal Processor,DSP)和嵌入式片上系统(System on Chip,SOC)。
嵌入式微控制器(MicroController Unit,MCU)就是我们俗称的单片机。顾名思义,其最大的特点就是单片化,芯片内部一般继承了总线、总线逻辑、Flash、RAM、定时/计数器等必要的处理器外设,一般情况下只需要在外围加上时钟、电源等极少的电路就可以构成一个嵌入式系统。由于需要的外围元件较少,采用单片机构成的系统通常具有体积小、功耗低、可靠性高、成本低的优势。同时各厂家可以根据单片机的使用对象,灵活的配置相应的外设,设计不同性能的单片机,因此经过30年的发展,单片机的种类非常丰富,在嵌入式设备中有着极其广泛的应用。目前为止,单片机还是嵌入式系统中应用最为广泛的处理器,在整个嵌入式处理器市场中占有的比例最大,拥有的种类和数量也最多。图1‑2即为最常用的单片机AT89C51的内部结构图。
图 1‑2 AT89C51单片机内部结构
由于单片机的应用非常广泛,因此为了适用不同的需求,很多单片机对某些特殊需求进行了优化,具有某一方面的突出优势,如TI公司针对低功耗应用的MSP430系列,针对Zigbee应用的CC2430等,同时一般一个系列的单片机具有多种衍生品,每种衍生品的处理器内核都是一样的,不同的是存储器和外设的配置以及封装。这样可以是单片机最大限度地和应用需求相匹配,从而减少功耗和控制成本。
嵌入式微处理器(MicroProcessor Unit,MPU)是由通用计算机中的CPU演变而来的 ,一般位数都在32位以上,具有较高的性能。与通用计算机处理器不同的是在实际嵌入式系统的应用中,它只保留与嵌入式应用紧密相关的功能部件,除去其他冗余功能部分,这样就以最低的功耗和资源实现了嵌入式应用的特殊要求。因此虽然嵌入式微处理器是以通用处理器为基础的,但是一般在工作温度、功耗控制、抗电磁干扰以及可靠性等方面都做了各种增强。
嵌入式微处理器的典型代表就是ARM处理器,ARM是英文Advanced RISC Machines的缩写。它既是公司的名称,也是一种计算机架构的名称。ARM是目前嵌入式产品中应用最为广泛的处理器,本书的第三章将进行更为详细的介绍。
虽然ARM是嵌入式微处理器领域的主角,但是其他两个重要的角色也不能忽略,它们分别是MIPS系列微处理器和PowerPC系列微处理器。
MIPS处理器是20世纪80年代除去由斯坦福大学Hennessy教授领导的小组研制出来的。1984年成立MIPS计算机公司,是一家设计、制造高性能、高档次的嵌入式32位和64位处理器的厂商,在RISC处理器方面占有重要地位。目前MIPS公司的产品基本退出了桌面处理器市场,而将其重心完全转移到嵌入式市场领域。在高速大数据量的嵌入式产品领域,MIPS公司的产品具有较大的影响力。我国自主研发的通用CPU龙芯使用的也是MIPS架构。
PowerPC微处理器在开发初期由IBM、Motorola和Apple公司共同投资,后来Apple退出,现在PowerPC处理器主要由IBM和Motorola生产。PowerPC处理器的种类较多,既有通用处理器,又有嵌入式控制器和内核,其应用范围也非常广泛,遍布从高端的工作站、服务器到桌面计算机系统,从消费类电子产品到大型通信设备等各方面。
嵌入式DSP处理器(Digital Signal Processor,DSP)是专门用于信号处理的处理器,DSP对系统结构和指令算法方面进行了特殊设计,使其适合于执行DSP算法,具有很高的编译效率和执行速度。在数字滤波、FFT等方面DSP算法正大量进入嵌入式领域。
DSP的相关理论算法从20世纪70年代就已经开始出现,早期的DSP理论算法只能够通过微处理器来实现,因此DSP的应用领域仅仅局限于一些尖端的高科技领域。随着大规模集成电路技术的发展,1978年世界上诞生了单片的DSP芯片,其运算速度比普通的微处理器快几十倍,在语音合成和编解码器中得到了广泛的应用。
根据数字信号的处理需求,DSP芯片一般具有如下特点:
a) 可以并行执行多个操作。
b) 支持流水线操作。
c) 快速的中断处理。
d) 在一个指令周期内可以完成一次乘法和一次加法。
e) 程序和数据空间分开,可以同时访问指令和数据。
f) 片内具有快速RAM。
g) 具有低开销或者无开销循环及跳转指令的硬件支持。
h) 具有在单周期内操作的多个硬件地址产生器。
嵌入式片上系统(System on Chip,SOC)是目前嵌入式应用领域最热门的方向之一,SOC最大的特点就是成功了实现了软硬件的无缝结合,可以直接在片内嵌入操作系统的代码模块。SOC具有极高的综合性,能够使用硬件描述语言或者高级语言来实现一个复杂的系统。
对于采用SOC处理器的系统,由于其绝大部分构件都是在系统内部,整个系统就特别简洁,不仅减小了系统体积和功耗,而且提高了系统的可靠性。