Chapter2 ARM Processor Fundamentals

第1章介绍了带有ARM处理器的嵌入式系统。在本章中,我们将重点介绍处理器本身。首先,我们将概述处理器核心,并描述数据在不同部分之间的传输方式。我们将从软件开发者的角度描述ARM处理器的程序员模型,展示处理器核心的功能以及不同部分的相互作用。我们还将查看构成ARM处理器的核心扩展。核心扩展加速和组织主存,并扩展指令集。然后,我们将描述ARM核心体系结构的修订,包括用于标识它们的ARM核心命名规则以及ARM指令集体系结构的时间顺序变化。最后一节介绍了架构实现,将它们分为具体的ARM处理器核心系列。

程序员可以将ARM核心视为由数据总线连接的功能单元,如图2.1所示,箭头表示数据流动,线条表示总线,方框表示操作单元或存储区域。该图不仅显示了数据流动,还显示了构成ARM核心的抽象组件。
数据通过数据总线进入处理器核心。这些数据可能是要执行的指令或数据项。图2.1显示了ARM的冯·诺伊曼实现,数据项和指令共享同一总线。相比之下,哈佛实现的ARM使用两个不同的总线。
指令解码器在执行之前对指令进行翻译。每条执行的指令都属于特定的指令集。
ARM处理器和所有RISC处理器一样,采用加载-存储体系结构。这意味着它具有两种指令类型,用于在处理器内部传输数据:加载指令将数据从内存复制到核心中的寄存器,而存储指令则将数据从寄存器复制到内存。没有直接操作内存中数据的数据处理指令。因此,数据处理完全在寄存器中进行。
数据项存放在寄存器文件中,这是一个由32位寄存器构成的存储区。由于ARM核心是一个32位处理器,大多数指令将寄存器视为保存有符号或无符号32位值的容器。符号扩展硬件在将有符号8位和16位数从内存读取并放入寄存器时,将其转换为32位值。
ARM指令通常有两个源寄存器Rn和Rm,一个结果寄存器或目的寄存器Rd。源操作数分别通过内部总线A和B从寄存器文件中读取。
算术逻辑单元(ALU)或乘累加单元(MAC)从A和B总线中获取寄存器值Rn和Rm,并计算出一个结果。数据处理指令直接将结果写入Rd寄存器文件。加载和存储指令使用ALU生成一个地址,并将其保存在地址寄存器中,并通过地址总线广播。
ARM的一个重要特性是寄存器Rm可以在进入ALU之前经过移位器进行预处理。移位器和ALU共同可以计算广泛的表达式和地址。
经过功能单元后,Rd中的结果通过结果总线写回到寄存器文件中。对于加载和存储指令,增量器在核心从下一个顺序内存位置读取或写入下一个寄存器值之前更新地址寄存器。处理器将继续执行指令,直到异常或中断改变正常的执行流程。
现在您已经对处理器核心有了概述,我们将更详细地查看处理器的一些关键组件:寄存器、当前程序状态寄存器(cpsr)和流水线。
2.1 Registers
通用寄存器可以保存数据或地址。它们以字母r作为寄存器编号的前缀进行标识。例如,寄存器4被标记为r4。图2.2显示了在用户模式下(通常在执行应用程序时使用的受保护模式)可用的活动寄存器。处理器可以在七个不同的模式下运行,我们将很快介绍这些模式。所有显示的寄存器大小均为32位。
最多有18个活动寄存器:16个数据寄存器和2个处理器状态寄存器。对于程序员来说,数据寄存器可视为r0到r15。
ARM处理器有三个寄存器分配给特定任务或特殊功能:r13、r14和r15。它们经常被赋予不同的标签以区分它们与其他寄存器。

在图2.2中,阴影寄存器标识了被分配给特殊用途的寄存器:
- 寄存器r13传统上用作堆栈指针(sp),并存储当前处理器模式下堆栈的首地址。
- 寄存器r14称为链接寄存器(lr),每当核心调用子程序时,会将返回地址放在该寄存器中。
- 寄存器r15是程序计数器(pc),包含处理器要获取的下一条指令的地址。
根据上下文,寄存器r13和r14也可以用作通用寄存器,在处理器模式更改期间可以选择使用这些寄存器,这可能特别有用。然而,在处理器运行任何形式的操作系统时,使用r13作为通用寄存器是危险的,因为操作系统通常假定r13始终指向有效的堆栈帧。
在ARM状态下,寄存器r0到r13是正交的,即适用于r0的任何指令同样适用于其他所有寄存器。但是,有一些指令以特殊方式处理r14和r15。
除了16个数据寄存器外,还有两个程序状态寄存器:cpsr(当前程序状态寄存器)和spsr(保存的程序状态寄存器)。
寄存器文件包含了程序员可用的所有寄存器。程序员可见的寄存器取决于处理器的当前模式。
2.2 Current Program Status Register
ARM核心使用cpsr来监控和控制内部操作。cpsr是一个专用的32位寄存器,位于寄存器文件中。图2.3显示了通用程序状态寄存器的基本布局。请注意,阴影部分保留供将来扩展使用。

cpsr被分成四个字段,每个字段宽度为8位:标志位(flags)、状态位(status)、扩展位(extension)和控制位(control)。在当前设计中,扩展字段和状态字段保留供将来使用。控制字段包含处理器模式、状态和中断屏蔽位。标志字段包含条件标志。
一些ARM处理器核心分配了额外的位。例如,J位可以在标志字段中找到,仅在启用Jazelle的处理器上可用,该处理器执行8位指令。我们将在第2.2.3节中更详细地讨论Jazelle。未来的设计很有可能分配额外的位来监控和控制新功能。
有关cpsr的完整描述,请参考附录B。
2.2.1 Processor Modes
处理器模式确定哪些寄存器处于活动状态以及对cpsr寄存器本身的访问权限。每个处理器模式都可以是特权模式或非特权模式:特权模式允许对cpsr进行完全的读写访问,而非特权模式只允许对cpsr中的控制字段进行读取访问,但仍允许对条件标志进行读写访问。
总共有七种处理器模式:六种特权模式(中止模式、快速中断请求模式、中断请求模式、监管者模式、系统模式和未定义模式)和一种非特权模式(用户模式)。
当出现访问内存失败的情况时,处理器进入中止模式。快速中断请求模式和中断请求模式对应于ARM处理器上可用的两个中断级别。监管者模式是处理器在复位后所处的模式,通常是操作系统内核运行的模式。系统模式是用户模式的一个特殊版本,允许对cpsr进行完全的读写访问。当处理器遇到未定义或不受实现支持的指令时,会使用未定义模式。用户模式用于程序和应用程序。
2.2.2 Banked Registers
图2.4显示了寄存器文件中的所有37个寄存器。其中,有20个寄存器在不同时间对程序隐藏。这些寄存器被称为分段寄存器,并且在图示中用阴影标识出来。它们仅在处理器处于特定模式时可用;例如,中止模式具有分段寄存器r13_abt、r14_abt和spsr_abt。特定模式的分段寄存器由附加在模式助记符或_mode后面的下划线字符表示。

除了用户模式外,每种处理器模式都可以通过直接向cpsr的模式位写入来更改模式。除系统模式外的所有处理器模式都有一组关联的分段寄存器,它们是主要的16个寄存器的子集。分段寄存器与用户模式寄存器一一对应。如果更改处理器模式,来自新模式的分段寄存器将替换现有的寄存器。
例如,当处理器处于中断请求模式时,您执行的指令仍然访问名为r13和r14的寄存器。然而,这些寄存器是分段寄存器r13_irq和r14_irq。用户模式寄存器r13_usr和r14_usr不受引用这些寄存器的指令的影响。程序仍然可以正常访问其他寄存器r0到r12。
可以通过编写直接到cpsr的程序(处理器核心必须处于特权模式)或由硬件在核心响应异常或中断时更改处理器模式。以下异常和中断会导致模式更改:复位、中断请求、快速中断请求、软中断、数据中止、预取中止和未定义指令。异常和中断会暂停顺序指令的正常执行,并跳转到特定位置。
图2.5说明了当中断强制进行模式更改时发生的情况。该图显示了核心从用户模式更改为中断请求模式,这在外部设备向处理器核心引发中断时发生。此更改会导致用户寄存器r13和r14被分段。用户寄存器分别被r13_irq和r14_irq寄存器替换。请注意,r14_irq包含返回地址,r13_irq包含中断请求模式的堆栈指针。

图2.5还显示了中断请求模式中出现的新寄存器:保存的程序状态寄存器(spsr),用于存储前一个模式的cpsr。您可以在图示中看到cpsr被复制到spsr_irq。要返回到用户模式,使用特殊的返回指令,指示核心从spsr_irq还原原始的cpsr,并将用户寄存器r13和r14分段。请注意,spsr只能在特权模式下进行修改和读取,在用户模式下不可用。
还要注意的另一个重要特点是,当程序直接向cpsr写入以强制进行模式更改时,cpsr不会被复制到spsr中。只有在发生异常或中断时才会保存cpsr。
图2.3显示当前活动处理器模式占用cpsr的最低有效位的五个位。当给核心供电时,它启动于特权模式(supervisor mode),这是一种特权模式。从特权模式开始很有用,因为初始化代码可以使用完全访问cpsr来设置每个其他模式的栈。

表2.1列出了各种模式及其关联的二进制模式。表的最后一列给出了表示cpsr中每个处理器模式的位模式。
2.2.3 State and Instruction Sets
核心的状态确定正在执行哪个指令集。有三种指令集:ARM、Thumb和Jazelle。只有处理器处于ARM状态时,ARM指令集才处于活动状态。同样地,只有处理器处于Thumb状态时,Thumb指令集才处于活动状态。一旦处于Thumb状态,处理器就会纯粹地执行Thumb 16位指令。不能混合使用顺序的ARM、Thumb和Jazelle指令。
cpsr中的Jazelle J和Thumb T位反映了处理器的状态。当J和T位均为0时,处理器处于ARM状态并执行ARM指令。这是处理器上电时的情况。当T位为1时,处理器处于Thumb状态。要更改状态,核心执行一个专门的分支指令。表2.2对比了ARM和Thumb指令集的特性。

ARM设计者引入了第三个指令集,称为Jazelle。Jazelle执行8位指令,是一种软硬混合设计,旨在加速执行Java字节码。
要执行Java字节码,您需要Jazelle技术以及经过特别修改的Java虚拟机版本。需要注意的是,Jazelle的硬件部分仅支持Java字节码的子集;其余部分在软件中模拟执行。Jazelle指令集是一种封闭的指令集,不对外公开。表2.3列出了Jazelle指令集的特点。

2.2.4 Interrupt Masks
中断屏蔽用于阻止特定的中断请求打断处理器的执行。ARM处理器核心提供了两个中断请求级别:中断请求(IRQ)和快速中断请求(FIQ)。
cpsr寄存器有两个中断屏蔽位,即第7位和第6位(或称为I位和F位),分别用于控制IRQ和FIQ的屏蔽。当I位设置为二进制1时,屏蔽IRQ;类似地,当F位设置为二进制1时,屏蔽FIQ。
2.2.5 Condition Flags
条件标志位通过比较和指定S指令后缀的ALU操作进行更新。例如,如果SUBS减法指令结果导致寄存器的值为零,则cpsr中的Z标志位将被设置。这个特定的减法指令会明确地更新cpsr。
对于包含DSP扩展的处理器核心,Q位指示增强型DSP指令是否发生了溢出或饱和。该标志位是“粘性”的,意味着只有硬件会设置该标志位。要清除该标志位,需要直接向cpsr写入数据。
在启用Jazelle的处理器中,J位反映了核心的状态;如果设置了该位,表示核心处于Jazelle状态。通常情况下,J位不可用,仅在某些处理器核心上可用。要利用Jazelle,还需要从ARM Limited和Sun Microsystems获取额外的软件授权。

大多数ARM指令可以根据条件标志位的值进行有条件执行。表2.4列出了条件标志位及其被设置的原因的简要描述。这些标志位位于cpsr的最高有效位。这些位用于条件执行。

图2.6显示了具有DSP扩展和Jazelle的cpsr的典型值。本书使用一种更易读的记法来表示cpsr的数据。当一个位为二进制1时,我们使用大写字母;当一个位为二进制0时,我们使用小写字母。对于条件标志位,大写字母表示该标志已被设置。对于中断,大写字母表示中断被禁用。
在图2.6中显示的cpsr示例中,只有C标志位被设置。其余的nzvq标志位都被清除。处理器处于ARM状态,因为既没有设置Jazelle j位,也没有设置Thumb t位。IRQ中断被启用,FIQ中断被禁用。最后,从图中可以看出,处理器处于特权(SVC)模式,因为mode[4:0]等于二进制10011。
2.2.6 Conditional Execution
条件执行控制处理器是否执行指令。大多数指令都有一个条件属性,该属性根据条件标志位的设置来确定处理器是否执行该指令。在执行之前,处理器将条件属性与cpsr中的条件标志进行比较。如果它们匹配,则执行该指令;否则忽略该指令。

条件属性后缀附加在指令助记符上,并编码到指令中。表2.5列出了条件执行代码助记符。当没有条件助记符时,默认行为是将其设置为始终(AL)执行。
2.3 Pipeline

流水线是RISC处理器用于执行指令的机制。使用流水线可以在解码和执行其他指令的同时获取下一条指令,从而加速执行速度。可以将流水线视为汽车生产线的方式之一,每个阶段都执行特定的任务以制造汽车。图2.7显示了一个三级流水线:
■ Fetch从存储器中加载指令。
■ Decode识别要执行的指令。
■ Execute处理指令并将结果写回寄存器。
图2.8用一个简单的示例说明了流水线的工作原理。它展示了处理器按顺序获取、解码和执行的三条指令。在流水线填充后,每条指令需要一个周期来完成。

这三条指令按顺序放入流水线中。在第一个周期,核心从存储器中获取ADD指令。在第二个周期,核心获取SUB指令并解码ADD指令。在第三个周期中,SUB和ADD指令同时在流水线中移动。ADD指令被执行,SUB指令被解码,CMP指令被获取。这个过程称为填充流水线。流水线使得核心能够每个周期执行一条指令。
随着流水线长度的增加,每个阶段的工作量减少,这使得处理器可以达到更高的工作频率。这进而提高了性能。系统的延迟也会增加,因为在核心能够执行指令之前需要更多的周期来填充流水线。增加的流水线长度还意味着某些阶段之间可能存在数据依赖关系。您可以使用指令调度编写代码来减少这种依赖关系(有关指令调度的更多信息,请参阅第6章)。

每个ARM系列的流水线设计都不同。例如,ARM9核心将流水线长度增加到了五个阶段,如图2.9所示。ARM9添加了一个内存和写回阶段,使得ARM9能够以平均每兆赫处理1.1个Dhrystone MIPS,相比于ARM7而言,指令吞吐量增加了约13%。使用ARM9可以达到的最大核心频率也更高。
ARM10通过添加第六个阶段进一步增加了流水线长度,如图2.10所示。ARM10平均每兆赫能够处理1.3个Dhrystone MIPS,比ARM7处理器核心的吞吐量多约34%,但代价是更高的延迟。尽管ARM9和ARM10的流水线不同,但它们仍然使用与ARM7相同的流水线执行特性。针对ARM7编写的代码可以在ARM9或ARM10上执行。
2.3.1 Pipeline Executing Characteristics
在ARM流水线中,直到指令完全通过执行阶段,它才被处理。例如,ARM7流水线(具有三个阶段)只有在获取第四条指令时才执行一条指令。

图2.11展示了在ARM7流水线上的一条指令序列。MSR指令用于启用IRQ中断,只有当MSR指令完成流水线的执行阶段时才会发生。它清除cpsr中的I位以启用IRQ中断。一旦ADD指令进入流水线的执行阶段,IRQ中断就被启用。

图2.12说明了流水线和程序计数器pc的使用。在执行阶段,pc始终指向指令地址加上8字节。换句话说,pc始终指向正在执行的指令的地址加上两条指令。这在pc用于计算相对偏移时非常重要,并且是所有流水线的架构特性。需要注意的是,当处理器处于Thumb状态时,pc是指令地址加4。
流水线还有其他三个值得一提的特点。首先,执行分支指令或通过直接修改pc进行分支会导致ARM核心清空其流水线。
其次,ARM10使用分支预测,通过预测可能的分支并在指令执行之前加载新的分支地址,减少了流水线清空的影响。
第三,即使发生中断,执行阶段中的指令也会完成。流水线中的其他指令将被放弃,处理器将从向量表的适当入口开始填充流水线。

2.4 Exceptions, Interrupts, and the Vector Table
当发生异常或中断时,处理器会将pc设置为特定的内存地址。这个地址位于一个特殊的地址范围内,称为向量表。向量表中的条目是指令,用于跳转到专门设计用来处理特定异常或中断的程序。内存映射地址0x00000000保留给了向量表,它是一组32位的字。在某些处理器上,向量表可以选择地位于内存的较高地址处(从偏移0xffff0000开始)。像Linux和Microsoft的嵌入式产品这样的操作系统可以利用这个特性。

当发生异常或中断时,处理器会暂停正常执行,并开始从异常向量表中加载指令(见表2.6)。每个向量表条目包含一种指向特定例程起始处的分支指令形式:
- 复位向量是处理器上电时执行的第一条指令的位置。该指令将跳转到初始化代码。
- 未定义指令向量用于处理器无法解码的指令。
- 软件中断向量在执行SWI指令时被调用。SWI指令通常用作调用操作系统例程的机制。
- 预取中止向量发生在处理器尝试从没有正确访问权限的地址获取指令时。实际的中止发生在解码阶段。
- 数据中止向量类似于预取中止,但是当指令尝试在没有正确访问权限的情况下访问数据内存时引发。
- 中断请求向量由外部硬件用于中断处理器的正常执行流程。只有在cpsr中允许IRQ中断被屏蔽时,它才会被触发。
- 快速中断请求向量类似于中断请求,但为需要更快响应时间的硬件保留。只有在cpsr中允许FIQ中断被屏蔽时,它才会被触发。
2.5 Core Extensions
本节所涉及的硬件扩展是放置在ARM核心旁边的标准组件。它们提高了性能、管理资源并提供额外的功能,旨在为处理特定应用程序提供灵活性。每个ARM系列都有可用的不同扩展。
ARM在核心周围包装了三个硬件扩展:缓存和紧密耦合存储器、内存管理以及协处理器接口。
2.5.1 Cache and Tightly Coupled Memory
缓存是位于主存储器和核心之间的一块快速存储器块。它允许更高效地从某些类型的存储器中获取数据。有了缓存,处理器核心可以大部分时间运行而无需等待来自慢速外部存储器的数据。大多数基于ARM的嵌入式系统使用内部单级缓存。当然,并不是所有小型嵌入式系统都需要缓存所带来的性能提升。

ARM有两种形式的缓存。第一种是连接到冯·诺依曼风格的核心上。它将数据和指令结合到一个统一的缓存中,如图2.13所示。为简单起见,我们将连接内存系统与AMBA总线逻辑和控制的粘合逻辑称为“glue logic”。
相比之下,第二种形式连接到哈佛风格的核心上,具有独立的数据和指令缓存。
缓存提供了整体性能的增加,但以可预测的执行为代价。然而,对于实时系统来说,代码执行的可确定性至关重要,加载和存储指令或数据所需的时间必须是可预测的。这通过一种称为紧密耦合存储器(TCM)的存储器形式实现。TCM是靠近核心的快速SRAM,并保证获取指令或数据所需的时钟周期,这对于需要确定行为的实时算法至关重要。TCM在地址映射中作为内存出现,并且可以作为快速存储器进行访问。图2.14显示了一个带有TCM的处理器示例。

通过结合这两种技术,ARM处理器可以同时获得提高性能和可预测的实时响应。图2.15显示了一个具有缓存和TCM组合的核心示例。

2.5.2 Memory Management
嵌入式系统通常使用多个存储器设备。通常需要一种方法来帮助组织这些设备,并保护系统免受试图对硬件进行不适当访问的应用程序的影响。这是通过内存管理硬件的协助实现的。
ARM核心具有三种不同类型的内存管理硬件:没有提供保护的扩展、提供有限保护的内存保护单元(MPU)和提供全面保护的内存管理单元(MMU):
- 无保护内存是固定的,提供非常有限的灵活性。通常用于不需要防止恶意应用程序的小型简单嵌入式系统。
- MPU采用一种简单的系统,使用有限数量的内存区域。这些区域由一组特殊的协处理器寄存器控制,每个区域都定义了特定的访问权限。这种内存管理类型用于需要内存保护但没有复杂内存映射的系统。MPU在第13章中有详细说明。
- MMU是ARM上最全面的内存管理硬件。MMU使用一组转换表对内存进行精细控制。这些表存储在主存储器中,并提供虚拟地址到物理地址的映射以及访问权限。MMU适用于支持多任务的更复杂的平台操作系统。MMU在第14章中有详细说明。
这些内存管理硬件为系统提供了不同级别的保护和灵活性,以确保安全性和可靠性。
2.5.3 Coprocessors
协处理器可以附加到ARM处理器上。协处理器通过扩展指令集或提供配置寄存器来扩展核心的处理功能。可以通过协处理器接口将多个协处理器添加到ARM核心中。
可以通过一组专用的ARM指令访问协处理器,这些指令提供了一种加载-存储类型的接口。例如,考虑协处理器15:ARM处理器使用协处理器15寄存器来控制缓存、TCM和内存管理。
协处理器还可以通过提供一组特殊的新指令来扩展指令集。例如,可以将一组专门的指令添加到标准的ARM指令集中以处理矢量浮点(VFP)操作。
这些新指令在ARM流水线的解码阶段进行处理。如果解码阶段看到一个协处理器指令,则将其提供给相应的协处理器。但是,如果协处理器不存在或无法识别该指令,则ARM会引发一个未定义指令异常,从而允许在软件中模拟协处理器的行为。
2.6 Architecture Revisions
每个ARM处理器实现都执行特定的指令集架构(ISA),尽管一个ISA修订版本可能有多个处理器实现。
为了满足嵌入式市场的需求,ISA已经不断发展。ARM对这种演进进行了精心管理,以使在早期架构修订版上编写的代码也可以在后续架构的修订版上执行。
在我们继续解释架构的演进之前,我们必须介绍ARM处理器的命名规则。这个命名规则标识个别处理器并提供有关其功能集的基本信息。
2.6.1 Nomenclature
ARM使用图2.16所示的命名规则来描述处理器实现。在单词“ARM”之后的字母和数字表示处理器可能具有的特性。随着增加更多特性,将来可能会改变数字和字母的组合。需要注意的是,命名规则不包括架构修订信息。

关于ARM命名规则,还有一些其他要点:
- 所有在ARM7TDMI之后的ARM核心都包括了TDMI特性,即使在“ARM”标签之后没有这些字母。
- 处理器系列是共享相同硬件特性的处理器实现的组合。例如,ARM7TDMI、ARM740T和ARM720T都共享相同的系列特性,属于ARM7系列。
- JTAG由IEEE 1149.1标准测试访问端口和边界扫描架构描述。它是一种串行协议,用于在处理器核心和测试设备之间发送和接收调试信息。
- EmbeddedICE宏单元是内置在处理器中的调试硬件,允许设置断点和监视点。
- Synthesizable表示处理器核心以源代码形式提供,可以编译成易于EDA工具使用的形式。
2.6.2 Architecture Evolution
自从1985年首次推出ARM处理器以来,架构一直在不断发展。表2.7展示了从原始架构版本1到当前版本6的重要架构增强。ISA最显著的变化之一是在ARMv4T(ARM7TDMI处理器)中引入了Thumb指令集。

表2.8总结了程序状态寄存器的各个部分以及特定指令架构上某些功能的可用性。“All”指的是ARMv4架构及以上的版本。


2.7 ARM Processor Families
ARM设计了多个处理器,根据它们使用的核心进行分组,并形成了不同的系列。这些系列基于ARM7、ARM9、ARM10和ARM11核心。后缀数字7、9、10和11表示不同的核心设计。数字的增加代表性能和复杂性的提升。ARM8已经开发出来,但很快就被取代了。

表2.9粗略比较了ARM7、ARM9、ARM10和ARM11核心之间的属性。所引用的数字可以有很大差异,直接取决于制造工艺的类型和几何形状,这直接影响频率(MHz)和功耗(瓦特)。
在每个ARM系列中,都有多种存储管理、缓存和TCM处理器扩展的变体。ARM继续扩展可用系列的数量以及每个系列内的不同变体。
您可以找到其他执行ARM ISA的处理器,例如StrongARM和XScale。这些处理器是特定半导体公司的独特产品,比如英特尔。

表2.10总结了各种处理器的不同特点。下一小节将更详细地描述ARM系列,从ARM7系列开始。
2.7.1 ARM7 Family
ARM7核心采用冯·诺依曼(Von Neumann)风格的体系结构,其中数据和指令使用同一总线。该核心具有三级流水线,并执行ARMv4T体系结构指令集。
ARM7TDMI是ARM于1995年推出的新一代处理器中的第一个处理器。它目前是非常受欢迎的核心,广泛用于许多32位嵌入式处理器中。它提供了很好的性能与功耗比。ARM7TDMI处理器核心已经被全球许多顶级半导体公司授权,并且是首个包含Thumb指令集、快速乘法指令和EmbeddedICE调试技术的核心。
ARM7系列中一个显著的变体是ARM7TDMI-S。ARM7TDMI-S具有与标准ARM7TDMI相同的操作特性,但也可以进行可合成。ARM720T是ARM7系列中最灵活的成员,因为它包含了一个MMU(内存管理单元)。MMU的存在意味着ARM720T能够处理Linux和Microsoft嵌入式平台操作系统。该处理器还包括一个统一的8K缓存。通过设置协处理器15寄存器,向量表可以重定位到较高的地址。
另一个变体是ARM7EJ-S处理器,也是可合成的。ARM7EJ-S与众不同,它包含一个五级流水线,并执行ARMv5TEJ指令。这个版本的ARM7是唯一一个同时提供Java加速和增强指令,但没有任何内存保护的版本。
2.7.2 ARM9 Family
ARM9系列于1997年宣布推出。由于具有五级流水线,ARM9处理器可以以更高的时钟频率运行,比ARM7系列更快。额外的流水线阶段提高了处理器的整体性能。内存系统经过重新设计,采用了哈佛结构,将数据D和指令I总线分离。
ARM9系列的第一个处理器是ARM920T,其中包含单独的D + I缓存和MMU。这个处理器可以被需要虚拟内存支持的操作系统使用。ARM922T是ARM920T的一个变体,但D + I缓存大小为原来的一半。
ARM940T包括较小的D + I缓存和MPU。ARM940T专为不需要平台操作系统的应用程序设计。ARM920T和ARM940T都执行v4T指令架构。
ARM9系列的下一个处理器基于ARM9E-S核心。这个核心是带有E扩展的ARM9核心的可合成版本。有两个变体:ARM946E-S和ARM966E-S。它们都执行v5TE指令架构。它们还支持可选的嵌入式跟踪宏单元(ETM),允许开发人员实时跟踪处理器上的指令和数据执行。这在调试具有时间关键片段的应用程序时非常重要。
ARM946E-S包括TCM、缓存和MPU。TCM和缓存的大小可以配置。该处理器专为需要确定性实时响应的嵌入式控制应用程序设计。相比之下,ARM966E没有MPU和缓存扩展,但具有可配置的TCM。
ARM9产品线中最新的核心是ARM926EJ-S可合成处理器核心,于2000年宣布推出。它专为小型便携式Java设备设计,如3G手机和个人数字助理(PDA)。ARM926EJ-S是第一个包含Jazelle技术的ARM处理器核心,该技术可以加速Java字节码执行。它具有MMU、可配置的TCM和带有零等待状态或非零等待状态存储器的D + I缓存。
2.7.3 ARM10 Family
ARM10于1999年宣布推出,旨在提供更高的性能。它将ARM9的流水线扩展到六个阶段。它还支持可选的向量浮点(VFP)单元,为ARM10流水线增加了第七个阶段。VFP显著提高了浮点性能,并符合IEEE 754.1985浮点标准。
ARM1020E是第一个使用ARM10E核心的处理器。类似于ARM9E,它包括增强的E指令。它具有独立的32K D + I缓存,可选的向量浮点单元和MMU。ARM1020E还具有双64位总线接口,以提高性能。
ARM1026EJ-S与ARM926EJ-S非常相似,但同时具备MPU和MMU。这个处理器具有ARM10的性能和ARM926EJ-S的灵活性。
2.7.4 ARM11 Family
ARM1136J-S于2003年宣布推出,旨在为高性能和功耗效率应用程序设计。ARM1136J-S是第一个执行ARMv6指令架构的处理器实现。它采用了八级流水线,包括独立的加载-存储和算术流水线。ARMv6指令中包含用于媒体处理的单指令多数据(SIMD)扩展,专门设计以提高视频处理性能。
ARM1136JF-S是在ARM1136J-S基础上增加了向量浮点单元,用于进行快速浮点运算。
2.7.5 Specialized Processors
StrongARM最初由Digital Semiconductor共同开发,现在由英特尔独家许可。它在个人数字助理(PDA)和对低功耗性能要求较高的应用程序中非常受欢迎。它采用哈佛结构,具有独立的D + I缓存。StrongARM是第一个具有五级流水线的高性能ARM处理器,但不支持Thumb指令集。
英特尔的XScale是StrongARM的后续产品,提供了显著的性能增加。在撰写本文时,XScale被引用为能够达到1 GHz的运行速度。XScale执行架构v5TE指令。它采用哈佛结构,与StrongARM相似,也包括一个MMU。
SC100则处于性能谱的另一端。它专为低功耗安全应用而设计。SC100是第一个SecurCore,基于带有MPU的ARM7TDMI核心。该核心体积小、电压和电流要求低,非常适用于智能卡应用。
2.8 Summary
在这一章中,我们专注于实际的ARM处理器的硬件基础知识。ARM处理器可以抽象为八个组成部分:ALU(算术逻辑单元)、移位器、乘累加器、寄存器文件、指令解码器、地址寄存器、增量器和符号扩展器。
ARM有三个指令集:ARM、Thumb和Jazelle。寄存器文件包含37个寄存器,但在任何时刻只有17或18个寄存器可访问;其余的根据处理器模式进行分组。当前处理器模式存储在cpsr(当前程序状态寄存器)中。它保存处理器核心的当前状态,包括中断屏蔽、条件标志和状态。状态决定正在执行哪个指令集。
ARM处理器由核心和与总线接口的周边组件组成。核心扩展包括以下内容:
- 缓存用于提高整体系统性能。
- TCM(Tightly-Coupled Memory)用于提高确定性实时响应。
- 内存管理用于组织内存和保护系统资源。
- 协处理器用于扩展指令集和功能。协处理器15控制缓存、TCM和内存管理。
ARM处理器是特定指令集架构(ISA)的实现。从第一个ARM处理器设计以来,ISA不断改进。处理器被分为具有相似特征的实现系列(ARM7、ARM9、ARM10和ARM11)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值