ARM微处理器的特点
1.ARM(Advanced/Acorn RISC Machines)
ARM既可以认为是一个公司的名字,也可以认为是对一类微处理器的通称,还可以认为是一种技术的名字。
CISC: Complex Instruction Set Computer(复杂指令集计算机)
RISC: Reduced Instruction Set Computer(精简指令集计算机)
典型代表: RISC ⇨ ARM (手机)和 CISC ⇨ X86(电脑)
思考:什么是指令集?为什么要区分复杂和精简。
答:指令集就是CPU中用来计算和控制计算机系统的一套指令的集合,而每一种新型的CPU在设计时就规定了一系列与其他硬件电路相配合的指令系统。注:指令集是软硬件之间沟通的桥梁。
复杂指令集(CISC, Complex Instruction Set Computer)
特点:
指令数量多、功能复杂,一条指令可完成多步操作(如直接完成内存访问+算术运算)。
指令长度可变,编码格式不统一。
硬件直接支持高级操作(如字符串处理、复杂数学函数)。
代表架构:x86(Intel/AMD处理器)
设计初衷:
降低软件开销:早期计算机内存昂贵且容量小,复杂指令能减少程序代码量,节省内存。
简化编译器设计:硬件直接实现高级操作,减轻编译器的优化负担。
适应慢速存储:减少指令数量可降低从慢速内存中读取指令的频率。
问题:
硬件设计复杂,晶体管资源消耗大。
复杂指令执行效率低(可能需要多个时钟周期)。
难以应用流水线、并行计算等现代优化技术。
精简指令集(RISC, Reduced Instruction Set Computer)
特点:
指令数量少且功能简单(如仅支持基本算术和访存操作)。
指令长度固定,格式统一,解码简单。
采用流水线技术和寄存器-寄存器操作,提升并行性。
代表架构:ARM(手机/嵌入式)、RISC-V(开源)、MIPS。
设计初衷:
提升执行效率:简单指令可在单时钟周期内完成,适合流水线化。
优化硬件资源:减少复杂电路,节省晶体管用于缓存、多核等设计。
适应摩尔定律:随着晶体管成本下降,代码密度不再是首要问题。
优势:
更高的时钟频率和能效比(适合移动设备)。
易于扩展(如RISC-V的模块化设计)。
编译器优化空间大(通过组合简单指令实现复杂功能)。
• 底层复杂、上层简单⇨通用机(开发难度低,适用性强)
• 上层复杂、底层简单⇨嵌入式(开发难度大,专用)
2.ARM与RISC-V
ARM是闭源的不是开源的指令集构架(ISA:Instruction Set Architectures)
RISC-V 是一个完全开源且免版税的指令集架构,可以用于任何目的,允许任何人设计、制造以及销售RISC-V芯片和软件。
ARM公司通过将架构授权给负担得起的公司(相对CISC的垄断,它授权比较容易),后者不允许修改基本内核本身。
解决卡脖子问题:华为等公司将构架从ARM迁移到RISC-V
ARM和RISC-V构架设计
ARM和RISC-V性能与效率
X86、ARM、RISC-V三大CPU架构
• X86:性能强大,成熟的生态系统,广泛用于个人计算、服务器领域,但功耗较高,不适合低功耗设备。
• ARM:低功耗,适合移动设备和嵌入式应用,授权模式较为封闭,生态系统成熟,尤其在智能手机、物联网领域占主导地位。
• RISC-V:完全开源,灵活性高,适合多种定制化应用,正在逐步发展中,具有强大的潜力,但相对于ARM和X86生态系统尚不成熟。
3.RISC-V指令集介绍
4.ARM微处理器特点
低功耗、低成本、高性能
>采用RISC指令集
>使用大量的寄存器
>ARM/THUMB指令支持
>三/五级流水线
具体来说:
1.采用RISC架构的ARM处理器一般具有如下特点:
> 固定长度的指令格式,指令归整、简单、基本寻址方式有2~3种;
> 使用单周期指令,便于流水线操作执行;
> 大量使用寄存器,数据处理指令只对寄存器进行操作,只有加载/存储指令可以访问存储器,以提高指令的执行效率。
2. ARM 处理器共有37个寄存器,被分为若干个组,这些寄存器包括:
> 31个通用寄存器,包括程序计数器(PC 指针),均为32位的寄存器;
> 6个状态寄存器,用以标识CPU的工作状态及程序的运行状态,均为32位
3.ARM微处理器支持两种指令集
4. 除此以外,ARM体系结构还采用了一些特别的技术,在保证高性能的前提下尽量缩小芯片的面积,并降低功耗。
5.所有的指令都可根据前面的执行结果决定是否被执行,从而提高指令的执行效率。
6. 可用加载/存储指令批量传输数据,以提高数据的传输效率。
7. 可在一条数据处理指令中同时完成逻辑处理和移位处理。
8. 在循环处理中使用地址的自动增减来提高运行效率。
ARM微处理器系列介绍
1. ARM7系列
ARM7采用冯·诺依曼(Von-Neumann)结构,数据存储器和程序存储器使用同一存储空间,用相同的指令访问 (下一条指令和下一个数据,一次只能访问一个)。
此结构也被大多数计算机所采用。
ARM7为三级流水线结构(取指,译码,执行),
平均功耗为0.6mW/MHz,时钟速度为66MHz,每条指令平均执行1.9个时钟周期。
• ARM7系列微处理器包括如下几种类型的核:ARM7TDMI、ARM7TDMI-S、 ARM720T、ARM7EJ。
• ARM7TMDI是目前使用最广泛的32位嵌入式RISC处理器,属低端ARM处理器核。TDMI的基本含义为(对其它系列也适用):
T: 支持16为压缩指令集Thumb,称为T变种
D: 支持片上Debug,称为D变种
M:内嵌硬件乘法器 Multiplier,称为M变种
I: 嵌入式ICE,支持片上断点和调试,称为I变种
2. ARM9系列
• ARM7采用的冯·诺依曼Von Neumann结构,取指令和取操作数都是通过一条总线分时进行,这样,在高速运算时,不但不能同时取指令和取操作数,而且还会造成传输通道上的瓶颈现象。
• ARM9采用哈佛(Harvard)结构,程序存储器与数据存储器分开,提供了较大的存储器带宽。同时,大多数DSP都采用此结构。
• ARM9为五级流水(取指,译码,执行,缓冲/数据,回写),平均功耗为0.7mW/MHz。时钟速度为120MHz-200MHz,每条指令平均执行1.5个时钟周期。
• ARM9系列微处理器包含ARM920T、ARM922T和ARM940T三种类型,主要应用在手持产品、视频电话、PDA、数字消费产品、机顶盒、家用网关等方面。
3. ARM9E系列
ARM9E系列微处理器包括如下4种类型的核:ARM926EJ-S、ARM946E-S和ARM966E-S、ARM968E-S
ARM9E系列是一种包含有微控制器、DSP、Java功能的综合处理器,强化了数字信号处理能力,适用于需要DSP和微控制器结合使用的情况,并且把Thumb技术和DSP都扩展到了ARM指令中,并且具有EmbededICE-RT逻辑,更好地适应了实时系统开发的需要。同时ARM9E使用了Jazelle增强技术,该技术支持一种新的Java操作状态,在硬件中执行Java字节码。
4. ARM10系列
ARM10系列微处理器包括:ARM1020E和ARM1022E等型号
ARM10系列采用了新的体系结构,其核心为使用了向量浮点单元,有强大的浮点运算能力,并且增加了Cache容量和总线宽度,并且具有低功耗的特点。 ARM10系列微处理器主要应用于下一代无线设备、视频消费品等。
5. ARMStrong/Xscale系列
StrongARM是采用ARM体系结构高度集成的32位RISC微处理器。它融合了Intel公司的设计技术,以及ARM体系结构的电源效率,其体系结构在软件上兼容ARMv4,同时又具有Intel技术优点。
StrongARM是Intel公司为手持消费类电子和移动计算与通信设备生产的嵌入式处理器。采用StrongARM架构的处理器:SA-1、SA-110、SA-1100、SA1110和IXP1200。
Xscale是基于ARMv5体系结构的解决方案,是一款性能全、性价比高、功耗低的处理器,支持16位的Thumb和DSP指令集,主要应用于数字移动电话、个人数字助理和网络产品等。 Xscale架构的处理器有:PXA250、PXA255和PXA270等。
6. ARM11系列
ARM11系列微处理器内核最新内核:ARM1156T2-S内核、ARM1156T2F-S内核、ARM1176JZ-S内核和ARM11JZF-S内核。
7. SecurCore系列
SecurCore系列微处理器除了具有ARM体系结构各种主要特点外,还在系统安全方面具有如下的特点:
(1) 带有灵活的保护单元,确保操作系统和应用数据的安全;
(2) 采用软内核技术,防止外部对其进行扫描探测;
(3) 可集成用户自己的安全特性和其他协处理器。
8.ARM Cortex 系列
ARM Cortex发布于2005年(ARM11后启用命名),ARM Cortex系列的三款产品全都集成了Thumb®-2 指令集,可满足各种不同的日益增长的市场需求。ARM Cortex系列的三款处理器:
1)ARM Cortex-A (Application)系列:针对复杂操作系统以及用户应用设计的应用处理器(苹果);
2)ARM Cortex-R(Real-Time)系列:实时系统专用嵌入式处理器(硬盘主控);
3)ARM Cortex-M(Microcontroller)系列:针对微控制器和低成本应用专门优化的深嵌入式处理器。
9 .基于32位ARM核微处理器
基于32位ARM核微处理器的主要公司有:
1)ST(意法半导体)公司32位ARM核微处理器。主要有:STR7、STR9和STM32系列。
2) Freescale公司32位微控制器与处理器,主要是MCF52xx系列。
3) OKI公司 32位ARM7DMI核微处理器,主要是ML67xx系列。
4) ATMEL 公司微控制器,主要是AT91FR、AT91M、AT91RM、AT91SAM等系列。
5) PHILIPS飞利浦/ NXP恩智浦 ARM单片机,主要是LPC21xx, LPC22xx等系列。
6) Intel 公司的Strong ARM 系列和XScale 系列。
7)SamSung 公司的ARM系列,主要有S3C44B0X、S3C2410X、S3C2440X 、S3C5410X等系列。
8) TI公司的ARM 处理器主要是OMAP、C5470/C5471等系列。
9) Cirrus Logic公司的ARM 处理器系列,主要是EP9xxx等系列。
STM32系列命名规则:
举例:STM32F746ZG
• STM32:表示该系列属于STM32系列微控制器
• F7 :表示基于Cortex-M7内核的STM32F7系列微控制器
• 746 :具体型号(F7系列中不同数字表示不同的产品型号,通常越大表示功能越强)
• Z :封装类型(Z通常表示LQFP封装,封装类型可通过查阅数据手册进一步确认)
• G :温度范围和存储配置(G通常代表“1MB Flash和192KB RAM”)
• STM32F7 :是用的ARM Cortex M7 内核,主频最高216MHz,性能可以达到1082 CoreMark /462 DMIPS;
• STM32F4 :用的ARM Cortex M4内核,主频最高180M,可实现225 DMIPS/608 CoreMark的性能;
• STM32H7:单核Arm® Cortex®-M7 STM32H7微控制器具有从216 MHz / 462 DMIPS至480 MHz / 1027 DMIPS的处理速度
ARM体系结构
1. ARM体系结构的特点,发展历程
总体思想:不牺牲性能的同时,尽量简化处理器。同时从体系结构的层面上灵活支持处理器扩展。这种简化和开放的思路使得ARM处理器采用了很简单的结构来实现。
目前,ARM32位体系结构被公认为业界领先的32位嵌入式RISC微处理器核,所有ARM处理器都共享这一体系结构。
1) RISC型处理器结构
ARM采用RISC结构,在简化处理器结构,减少复杂功能指令的同时,提高了处理器的速度。考虑到处理器与存储器打交道的指令执行时间远远大于在寄存器内操作的指令执行时间,RISC型处理器采用了Load/Store(加载/存储)结构,即只有Load/Store指令可与存储器打交道,其余指令都不允许进行存储器操作
为了进一步提高指令和数据的存取速度,RISC型处理器增加了指令高速缓冲I-Cache和数据高速缓冲D-Cache及多处理器结构,使指令的操作尽可能在寄存器之间进行。
2)Thumb指令集
虽然ARM处理器本身是32位设计,但考虑到RISC型处理器的指令功能相对较弱,新型的ARM体系结构中定义了16位的Thumb指令集。
Thumb指令集比通常的8/16位CISC/RISC处理器有更好的代码密度,而芯片面积只增加6%,却可以使程序存储器更小。
3)多处理器状态模式
ARM体系结构定义了7种处理器模式:用户、快中断、中断、管理、终止、未定义和系统模式,大大提高了ARM处理器的效率。
4)两种处理器工作状态
ARM状态 (执行32位ARM指令)
Thumb状态。(执行16位Thumb指令)
七种工作状态:
1.用户模式(USR):正常程序执行模式,它没有权限去操作其它硬件资源,只能执行处理自己的数据
2.系统模式(SYS):运行操作系统的特权任务,与用户模式类似,但具有可以直接切换到其他模式等特权
3.快中断模式(FIQ):支持高速数据传输及通道处理,它是用来处理对时间要求比较紧急的中断请求,主要用于高速数据传输及通道处理中
4.中断模式(IRQ):用于通用中断处理,用于处理一般的中断请求,通常在硬件产生中断信号之后自动进入该模式
5.管理模式(SVC):操作系统保护模式,在该模式下主要用来做系统的初始化(由系统调用执行软中断SWI命令触发)
6.中止模式(ABT):用于支持虚拟内存和/或存储器保护,当用户程序访问非法地址,没有权限读取的内存地址时,会进入该模式
7.未定义模式(UND):支持硬件协处理器的软件仿真,未定义指令异常响应时进入此模式
Cotex系列增加monitor模式
5)嵌入式在线仿真调试
ARM体系结构的处理器芯片都嵌入了在线仿真ICE-RT逻辑,便于通过JTAG来仿真调试芯片,省去了价格昂贵的在线仿真器。
6)灵活方便的接口
ARM体系结构具有协处理器接口,允许接16个协处理器。既可以使基本的ARM处理器内核尽可能小,方便地扩充ARM指令集,也可以通过未定义指令来支持协处理器的软件仿真。
7)低电压功耗的设计
考虑到ARM处理器主要用于手持式嵌入式系统中,在设计中就十分注意功耗的设计。
构架趋势:
ARM最近的版本是 ARMv9,发布于2021年。ARMv9 引入了几个新特性,主要集中在安全性、性能和机器学习能力上
1. 架构增强:ARMv9在之前的ARMv8基础上进行了增强,加入了对AI/机器学习的支持。
2. 安全性增强:包括在硬件级别加强了对数据保护和隔离的支持。
3. 支持混合精度计算:以更高效地处理AI推理任务,特别是低精度计算(例如INT8,FP16等)。
4. 内存访问和加速器优化:改善了内存管理,提供了更好的吞吐量和延迟性能。
最新的ARM芯片通常会基于ARMv9架构,如Cortex-X系列和Cortex-A系列,涵盖了从高端到低端的各种应用。
2. ARM9体系结构
比较最常用的是ARM920T内核(ARMv4T指令集),ARM920T结构主要部分有7部分构成:
ARM9TDMI内核CPU、MMU、Cache、协处理器接口、运行跟踪信息接口(ETM)、JTAG调试接口、总线接口
0.25微米的ARM9TDMI核在执行32位ARM代码时的特性综述
ARM流水线结构
1.流水线技术概述
流水线方式:
是把一个重复的过程分解为若干个子过程,每个子过程可以与其他子过程同时进行。
由于这种工作方式与工厂中的生产流水线十分相似,因此,把它称为流水线工作方式。
处理器按照一系列步骤来执行每一条指令。
典型的步骤为:
– 1)从存储器读取指令(fetch)
– 2)译码以鉴别它是哪一类指令(dec)
– 3)从寄存器组取得所需的操作数(reg)
– 4)将操作数进行组合以得到结果或存储器地址(exe)
– 5)如果需要,则访问存储器存取数据(mem)
– 6)将结果回写到寄存器组(res)
2.ARM7的三级流水线
1取指:从程序存储器中取指令,放入指令流水线。(占用存储器访问操作)
2译码:指令译码。(占用译码逻辑)
3执行:执行指令/读写REG。(占用ALU及数据路径)
实际情况下,ARM7的构架中,执行和取值都需要访问存储空间,但是一次只能有一个访问(注意下图阴影,为存储访问),这就导致了流水线间断。这是冯.诺依曼架构的局限,指令和数据总线复用,因此ARM9改为哈弗构架。
3.ARM9TDMI的五级流水线
使用5级流水线的ARM处理器包含下面5个流水线级:
• 取指:取指令。
• 译码 :读取寄存器操作数,寄存器堆中有3个操作数读端口,大多数ARM指令能在一个周期内读取其操作数。(有的指令中有寄存器,才需要reg读)
• 执行 :把一个操作数移位,并产生ALU结果,如果是Load/Store指令,在ALU中计算存储器地址。
• 缓冲\数据 (访存):如果需要,则访问数据存储器,否则ALU的结果只是简单地缓冲一个时钟周期,以便使得所有指令都有相同的流水线流程。
• 回写 :将指令产生的结果写回到寄存器堆,包括任何从存储器读取的数据。
4.ARM7和ARM9流水线比较
5级流水线的ARM9内核是哈佛架构,拥有独立的指令和数据总线;指令和数据的读取可以在同一周期进行;
3级流水的ARM7内核是指令和数据总线复用的冯.诺依曼架构,指令和数据的读取不能在同一周期进行;
5级流水线设计把寄存器读取、逻辑运算、结果回写分散在不同的流水当中, 每一级流水的操作简洁,提升了处理器的主频。
随着流水线深度(级数)的增加,每一段的工作量被削减了,这使得处理器可以工作在更高的频率,同时改进了处理器的性能;
负面作用是增加了系统的延时,即内核在执行一条指令前,需要更多的周期来填充流水线;
流水线级数的增加也意味着在某些段之间会产生数据相关。
5.ARM10TDMI的六级流水线
ARM总线结构
ARM微控制器使用的是AMBA总线体系结构
AMBA(Advanced Microcontroller Bus Architecture)是ARM公司公布的总线标准,先进的AMBA规范定义了三种总线:
1.AHB总线(Advanced High-performance Bus):用于连接高性能系统模块。它支持突发数据传输方式及单个数据传输方式,所有时序 参考同一个时钟沿。
2.ASB总线(Advanced System Bus):用于连接高性能系统模块,它支持突发数据传输模式。
3.APB总线(Advance Peripheral Bus):是一个简单接口支持低性能的外围接口。
ARM微处理器的工作状态与模式
1. ARM处理器的两种工作状态
❑从编程的角度看,ARM微处理器的工作状态一般有两种,并可在两种状态之间切换:
➢ARM状态,此时处理器执行32位的字对齐的ARM指令;
➢Thumb状态,此时处理器执行16位的、半字对齐的Thumb指令
❑ THUMB指令是ARM指令的子集
❑ 可以相互调用,只要遵循一定的调用规则
❑ Thumb指令与ARM指令的时间效率和空间效率关系为:
➢ 存储空间约为ARM代码的60%~70%
➢ 指令数比ARM代码多约30%~40%
➢ 存储器为32位时ARM代码比Thumb代码快约40%
➢ 存储器为16位时Thumb比ARM代码快约40~50%
➢ 使用Thumb代码,存储器的功耗会降低约30%
2.状态切换方法
❑ ARM指令集和Thumb指令集均有切换处理器状态的指令,并可在两种工作状态之间切换,
❑ 在开始执行代码时,应该处于ARM状态。
两种状态可以切换
程序执行过程中,通过执行带状态切换的分支指令BX,随时在两种工作状态间进行切换。并且,处理器工作状态转变,不影响处理器的工作模式和相应寄存器中的内容。
进入Thumb状态:
❑ 当操作数寄存器的状态位(位0)为1时,可以采用执行BX指令的方法,使微处理器从ARM状态切换到Thumb状态。此为主动切换。
❑ 当处理器处于arm状态时发生异常(如IRQ、FIQ、Undef、Abort、SWI等),则异常处理返回时,自动切换到Thumb状态。此为自动切换。
切换到ARM状态:
有两种情况ARM处理器自动切换到arm状态。
(1)执行BX指令,当操作数寄存器的位[0]为0时,则微处理器从Thumb状态切换到ARM状态。
(2)当处理器在Thumb状态时发生异常(如IRQ、FIQ、Undef等),则处理器从Thumb状态自动切换到ARM状态进行异常处理
在处理器进行异常处理时,把PC指针放入异常模式链接寄存器中,并从异常向量地址开始执行程序,也可以使处理器切换到ARM状态。
3.ARM处理器的工作模式
1)处理器模式
❑ 用户模式(usr):ARM处理器正常的程序执行状态,大部分任务执行在这种模式。
❑ 快速中断模式(fiq):当一个高优先级(fast)中断产生时将会进入这种模式,用于高速数据传输或通道处理
❑ 外部中断模式(irq):当一个低优先级(normal)中断产生时将会进入这种模式。用于通用的中断处理
❑ 管理模式(svc):当复位或软中断指令执行时将会进入这种模式, 供操作系统使用的一种保护模式。
❑ 中止模式(abt):当存取异常时将会进入这种模式,用于虚拟存储及存储保护。
❑ 未定义模式(und):当执行未定义指令时会进入这种模式 ,软件仿真硬件协处理器。
❑ 系统模式(sys):供需要访问系统资源的操作系统任务使用,运行具有特权的操作系统任务
2)模式特点
(1)用户模式特点:
– 应用程序不能够访问受操作系统保护的系统资源。
– 应用程序不能进行处理器模式的切换。
(2)系统模式特点:
不属于异常模式,不是通过异常进入的。系统模式属于特权模式,可以访问所有的系统资源,也可以直接进行模式的切换。它主要供操作系统使用。
(3)特权模式及其特点:
特权模式:除用户模式之外的工作模式又称为特权模式
– 应用程序可以访问所有的系统资源
– 可以任意地进行处理器模式的切换
(4)异常模式及其特点:
异常模式: 除用户模式、系统模式之外的五种模式称为异常模式。
特点:以各自的中断或异常方式进入,并且处理各自的中断或异常。
(5)对管理模式 (svc)进入方式和处理内容有:
①系统上电复位后进入管理模式,运行系统初始化程序,如中断允许/禁止,主时钟设置,SDRAM配置,各个功能模块初始化等。
②当执行软件中断指令SWI(SoftWare Interrupt)时,进入管理模式。
3)模式切换
❑ 处理器模式可以通过软件进行切换,也可以通过外部中断或者异常处理过程进行切换。
❑ 当应用程序发生异常中断时,处理器进入相应的异常模式。在每一种异常模式下都有一组寄存器,供相应的异常处理程序使用,这样就可以保证在进入异常模式时,用户模式下的寄存器不被破坏
处理器模式的切换方式:
❑ 系统模式并不是通过异常进入的,它和用户模式具有完全一样的寄存器。但是系统模式属于特权模式,可以访问所有的系统资源,也可以直接进行处理器模式切换
❑ 系统模式它主要供操作系统任务使用。通常操作系统的任务需要访问所有的系统资源,同时该任务仍然使用用户模式的寄存器组,而不是使用异常模式下相应的寄存器组,这样可以保证当异常中断发生时任务状态不被破坏。
ARM体系结构的存储器格式
1. ARM处理器支持以下6种数据类型:
– 8位有符号和无符号字节(Byte)。
– 16位有符号和无符号半字(Halfword)
• 它们必须以两字节的边界对齐(半字对齐)。
– 32位有符号和无符号字(word)
• 它们必须以4字节的边界对齐(字对齐)。
– 字对齐:字单元地址的低两位A1A0=0b00。即地址末位为0x0, 0x4, 0x8, 0xc。
– 半字对齐:半字单元地址的最低位A0=0b0 (地址末位为0x0,0x2,0x4,0x6,0x8,0xa,0xc,0xe)。
注意:字(字长)是计算机数据处理和运算的单位,32位ARM的字是32位
◆ 对于指令,ARM指令系统分为32位ARM指令集和16位的Thumb指令集,在存储时分别以32位和16位的两种不同长度存储。
◆ 对于数据,ARM支持对32位字数据,16位半字数据,8位字节数据操作。因此数据存储器可以存储32位,16位,8位三种不同长度数据。
在ARM内部,所有操作都面向32位的操作数,只有数据传送指令支持较短的字节和半字的数据类型。当从存储器读入一个字节或半字时,根据其数据类型将其扩展到32位。
2. ARM存储器组织
ARM存储器以8位为一个单元存储数据(一个字节),每个存储单元分配一个存储地址。
ARM将存储器看作是从零地址开始的字节的线性组合。作为32位的微处理器,ARM体系结构所支持的最大寻址空间为4GB。2^32=2^2*2^10*2^10*2^10=4GB
从零字节到三字节放置第一个存储的字数据,从第四个字节到第七个字节放置第二个存储的字数据,依次排列。
32位的字数据要使用4个地址单元,16位半字数据要使用2个地址单元。
这样,就存在一个所存储的字或半字数据的排列顺序问题。ARM体系结构可以用两种方法存储字数据,称为大端格式和小端格式 。
采用大端方式进行数据存放符合人类的正常思维(先读高位),
而采用小端方式进行数据存放利于计算机处理 (先读低位)。
大端格式(big-endian):字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。0123为例
小端格式(low-endian):与大端存储格式相反。低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节。缺省设置为小端格式。
优缺点
• 大端模式中地址的变化顺序(低到高)与数据的阅读顺序(高位到低位,如12345678我们会从高位开始读,即从左到右)想吻合。所以当沿着地址空间找到某个数据内存的时候,我们首先就可以根据他的内容的第一个字节来判断正负。
• 小端模式的优点:强制类型转化,如int(4字节)转化成short(2字节),直接可以取出前面的低位两字节。另一优点是CPU计算是从数据的低位到高位计算,效率高。所以当CPU从地址的低位到高位移动的时候,正好数据也是从地位到高位变化,计算高效。
网络传输大端多,计算嵌入小端多
3 .ARM存储器层次
微处理器希望存储器容量大、速度快。但容量大者速度慢;速度快者容量小。解决方法是构建一个由多级存储器组成的复合存储器系统。
两级存储器方案一般包括:
一个容量小但速度快的从存储器
一个容量大但速度慢的主存储器
宏观上看这个存储器系统像一个即大又快的存储器。这个容量小但速度快的元件是Cache,它自动地保存处理器经常用到的指令和数据的拷贝。
多级存储器系统:
ARM寄存器组织
ARM微处理器共有37个32位寄存器,其中31个为通用寄存器,6个为状态寄存器。但是这些寄存器不能被同时访问,具体哪些寄存器是可编程访问的,取决微处理器的工作状态及具体的运行模式。但在任何时候,通用寄存器R14~R0、程序计数器PC、一个或两个状态寄存器都是可访问的。
1.ARM状态下的寄存器组织
❑ 通用寄存器:通用寄存器包括R0~R15,可以分为三类:
➢未分组寄存器R0~R7
➢分组寄存器R8~R14
➢程序计数器PC(R15)
未分组寄存器R0~R7
❑ 在所有的运行模式下,未分组寄存器都指向同一个物理寄存器,他们未被系统用作特殊的用途,因此,在中断或异常处理进行运行模式转换时,由于不同的处理器运行模式均使用相同的物理寄存器,可能会造成寄存器中数据的破坏,这一点在进行程序设计时应引起注意。
分组寄存器R8~R12
❑ 每次所访问的物理寄存器与处理器当前的运行模式有关
❑ R8~R12:每个寄存器对应两个不同的物理寄存器
➢ 当使用fiq模式时,访问寄存器R8_fiq~R12_fiq;
➢ 当使用除fiq模式以外的其他模式时,访问寄存器R8_usr~R12_usr。
分组寄存器R13~R14
❑ R13、R14:每个寄存器对应6个不同的物理寄存器
❑ 其中的一个是用户模式与系统模式共用,另外5个物理寄存器对应于其他5种不同的运行模式
❑ 采用以下的记号来区分不同的物理寄存器:
➢ R13_
➢ R14_
❑ mode为以下几种之一:usr、fiq、irq、svc、abt、und。
堆栈指针(SP)—R13
❑ R13在ARM指令中常用作堆栈指针,但这只是一种习惯用法,用户也可使用其他的寄存器作为堆栈指针。
❑ 在Thumb指令集中,某些指令强制性的要求使用R13作为堆栈指针。
❑ 由于处理器的每种运行模式均有自己独立的物理寄存器R13,在初始化部分,都要初始化每种模式下的R13,这样,当程序的运行进入异常模式时,可以将需要保护的寄存器放入R13所指向的堆栈,而当程序从异常模式返回时,则从对应的堆栈中恢复。
注意:堆栈指针SP通常指向数据存储区,LR指向代码存储区(子函数跳转前),PC指向代码存储区当前执行代码(+8)
子程序连接寄存器(LR)—R14
❑ R14也称作子程序连接寄存器或连接寄存器LR。当执行BL子程序调用指令时,可以从R14中得到R15(程序计数器PC)的备份。其他情况下,R14用作通用寄存器。
❑ 在每一种运行模式下,都可用R14保存子程序的返回地址,当用BL或BLX指令调用子程序时,将PC的当前值拷贝给R14,执行完子程序后,又将R14的值拷贝回PC,即可完成子程序的调用返回。
注意:LR用于记录下一条指令的值,确保子函数执行完能跳转到下一行代码,因此通常来说LR = PC – 4
程序计数器(PC) — R15
❑ ARM状态下,位[1:0]为0,位[31:2]用于保存PC;
❑ Thumb状态下,位[0]为0,位[31:1]用于保存PC;
❑ R15虽然也可用作通用寄存器,但一般不这么使用,因为对R15的使用有一些特殊的限制,当违反了这些限制时,程序的执行结果是未知的。
❑ 由于ARM体系结构采用了多级流水线技术,对于ARM指令集而言,PC总是指向当前指令的下两条指令的地址,即PC的值为当前指令的地址值加8个字节。
注意:PC通常=当前指令(执行时刻)的地址+8,具体取值还要看流水线构架和当前阶段
程序状态寄存器(CPSR/SPSR)
寄存器R16用作CPSR(当前程序状态寄存器),CPSR可在任何运行模式下被访问,它包括条件标志位、中断禁止位、当前处理器模式标志位,以及其他一些相关的控制和状态位。
❑ 每一种运行模式下又都有一个专用的物理状态寄存器,称为SPSR(备份的程序状态寄存器),异常发生时,SPSR用于保存CPSR的值,从异常退出时则可由SPSR来恢复CPSR。
通用寄存器= 8+5*2+2*6+1=31
状态寄存器= CPSR*1+SPSR*5=6
❑ 由于用户模式和系统模式不属于异常模式,他们没有SPSR,当在这两种模式下访问SPSR,结果是未知的。
2.Thumb状态下的寄存器组织
Thumb状态下的寄存器集是ARM状态下寄存器集的一个子集
❑ 程序可以直接访问8个通用寄存器(R7~R0)、程序计数器(PC)、堆栈指针(SP)、连接寄存器(LR)和CPSR。
❑ 同样,每一种特权模式下都有一组SP、LR和SPSR。
Thumb下R8到R12没有总数:8+2*6+1+1+5
Thumb状态下的寄存器与ARM状态下的寄存器关系:
❑ Thumb状态下和ARM状态下的R0~R7是相同的。
❑ Thumb状态下和ARM状态下的CPSR和所有的SPSR是相同的。
❑ Thumb状态下的SP对应于ARM状态下的R13。
❑ Thumb状态下的LR对应于ARM状态下的R14。
❑ Thumb状态下的程序计数器对应于ARM状态下R15。
访问THUMB状态下的高位寄存器(Hi-registers)
• 在Thumb状态下,高位寄存器R8~R15并不是标准寄存器集的一部分,但可使用汇编语言程序受限制地访问这些寄存器,将其用作快速的暂存器。
• 使用带特殊变量的MOV指令,数据可以在低位寄存器和高位寄存器之间进行传送;高位寄存器的值可以使用CMP和ADD指令进行比较或加上低位寄存器中的值。
程序状态寄存器作用
ARM体系结构包含一个当前程序状态寄存器(CPSR)和五个备份的程序状态寄存器(SPSRs)
(1)当前程序状态寄存器 CPSR (Current Program Status Register)
---用来保存当前程序状态的寄存器。
---所有处理器模式下都可以访问当前程序状态寄存器CPSR。仅一个CPSR。
(2)保存程序状态寄存器SPSR_mode (Saved Program Status Register)
SPSR_mode用来进行异常处理,其功能包括:
─ 保存ALU(算术逻辑单元)中的当前操作信息当异常发生时, 用来保存CPSR的值,从异常返回时,将SPSR_mode复制到CPSR中,恢复CPSR的值。
─ 控制允许和禁止中断 修改SPSR的值
─ 设置处理器的运行模式 修改SPSR的值
程序状态寄存器的条件码标志
N、Z、C、V均为条件码标志位。它们的内容可被算术或逻辑运算的结果所改变,并且可以决定某条指令是否被执行
❑ 在ARM状态下,绝大多数的指令都是有条件执行的。
❑ 在Thumb状态下,仅有分支指令是有条件执行的。
影响标志位的指令
程序状态寄存器的控制位
状态寄存器的低8位(I、F、T和M[4:0])称为控制位,发生异常时这些位可以被改变。如果处理器运行特权模式,这些位也可以由程序修改。
❑中断禁止位I、F:
I=1 禁止IRQ中断; I=0 允许IRQ中断
F=1 禁止FIQ中断; F=0 允许FIQ中断
❑T标志位:该位反映处理器的运行状态
T=1时,程序运行于Thumb状态
T=0时,程序运行于ARM状态
❑运行模式位M[4:0]是模式位,决定处理器的运行模式
处理器运行模式及可以访问的寄存器
异 常
1. 中断和异常的概念
1.中断
当CPU正在执行程序时,系统发生了一件急需处理的事件,CPU暂时停下正在执行的程序,转去处理相应的事件,事件处理完后,CPU再返回执行原来的程序,这种情况称为中断。
中断事件:引起CPU产生中断、并且与CPU当前所执行的程序无关的、由外部硬件产生的事件,也叫中断源。中断事件也常称为外中断。
中断是计算机系统基本的功能 利用中断,外设可以与CPU并行工作,当外设需要传输数据或控制时,向CPU发出中断请求信号。CPU响应其请求进行处理。因此,使用中断既可以实现CPU与外设并行工作,又可以实时处理各种紧急事件。
2.异常
是指CPU在执行指令时出现的错误,即不正常的情况。异常是与当前所执行的程序有关的。如存取数据或指令错误、计算结果溢出等。异常的处理:也用中断的方式进行处理。计算机通常是用中断来处理外中断和异常,因此下面将二者均称为异常。
对异常的说明:
当系统运行时,异常可能会随时发生,为保证在ARM处理器发生异常时不至于处于未知状态,在应用程序的设计中,首先要进行异常处理,采用的方式是在异常向量表中的特定位置放置一条跳转指令,跳转到异常处理程序。
当ARM处理器发生异常时,程序计数器PC会被强制设置为对应的异常向量,从而跳转到异常处理程序,当异常处理完成以后,返回到主程序继续执行。我们需要处理所有的异常,尽管我们可以简单的在某些异常处理程序处放置死循环。
2.ARM7种异常
• (1)复位
– 处理器上一旦有复位输入,ARM处理器立刻停止执行当前指令。复位后,ARM处理器在禁止中断的管理模式下,从地址0x00000000或0xFFFF0000开始执行指令。
• (2)未定义指令异常
– 当ARM处理器执行协处理器指令时,它必须等待任一外部协处理器应答后,才能真正执行这条指令。若协处理器没有响应,就会出现未定义指令异常。
– 未定义指令异常可用于在没有物理协处理器(硬件)的系统上,对协处理器进行软件仿真,或在软件仿真时进行指令扩展。
• 3)软件中断异常
– 该异常由执行软件中断指令(Software Interrupt, SWI)产生,可使用此机制进行软件仿真。
• 4)预取中止(取指令存储器中止)
– 若处理器预取指令的地址不存在,或该地址不允许当前指令访问,存储器会向处理器发出中止信号,但当预取的指令被执行时,才会产生指令预取中止异常。
• 5)数据中止(访问数据存储器中止)
– 若处理器数据访问指令的地址不存在,或该地址不允许当前指令访问时,产生数据中止异常。
• 6) IRQ异常
– 当处理器的外部中断请求引脚有效,且CPSR中的I=0,产生IRQ异常。
– 系统的外设可通过该异常请求中断服务。
• 7) FIQ异常
– 当处理器的外部中断请求引脚有效,且CPSR中的F=0,产生FIQ异常。
– FIQ支持数据传送和通道处理,并有足够的私有寄存器,从而在应用中可避免对寄存器保存的需求,减少了开销。
• 先捕获异常中断,再跳到特定处理器模式来处理
• 异常是被动产生的,处理器模式可修改CPSR主动进入
• 异常源与模式关系:
1. 快速中断请求异常进入快速中断模式,支持高速数传输及通道处理(FIQ异常响应时进入此模式);
2. 中断请求异常进入中断模式,用于通用中断处理
3. 预取指中止,数据中止异常进入中止模式,用于支持虚拟内存和/或存储器保护;
4. 未定义指令异常进入未定义模式,支持硬件协处理器的软件仿真软件中断(swi)
5. 复位异常(reset)进入管理模式,操作系统保护代码
注:除用户模式、系统模式之外的五种模式称为异常模式。
3. ARM异常中断响应过程
当发生异常时,除了复位异常立即中止当前指令外,处理器尽量完成当前指令,然后脱离当前的程序去处理异常。ARM处理器对异常中断的响应过程如下 :
(1) 保存返回地址
将引起异常指令的下一条指令的地址保存到新的异常模式x下的R14,即R14-中,使异常处理程序执行完后能正确返回原程序。
(2) 保存当前状态寄存器CPSR的内容将CPSR的内容保存到将要执行的异常中断对应的SPSR中,便于中断返回时恢复处理器当前的状态位、中断屏蔽位以及各条件标志位。
(3) 设置当前状态寄存器CPSR中的相应位设置CPSR模式控制位CPSR[4:0],使处理器进入相应的执行模式;设置中断标志位(CPSR[7]=1),禁止IRQ中断;设置中断标志位(CPSR[6]=1)禁止FIQ中断,当进入Reset或FIQ模式时。
(4)转去执行中断处理程序;取相应的中断向量给程序计数器PC,使程序开始执行中断处理程序。
一般地说,矢量地址处将包含一条指向相应程序的转移指令,从而可跳转到相应的异常中断处理程序处执行异常中断处理程序
注意使用异常模式下的特有寄存器
每个异常模式对应有两个寄存器R13_、R14_分别保存相应模式下的堆栈指针、返回地址;堆栈指针可用来定义一个存储区域保存其它用户寄存器,在程序初始化时应该对各种模式堆栈设置,便于随时使用。FIQ模式还有额外的专用寄存器R8_fiq~R12_fiq,使用这些寄存器可以加快快速中断的处理速度。
4.异常返回
(1)异常返回应执行的操作
异常处理完毕之后,ARM微处理器会执行以下几步操作从异常返回:
将返回地址装入PC 把连接寄存器LR的值减去相应的偏移量,然后送到PC中。
恢复CPSR的值 将SPSR复制回CPSR中。
清除中断屏蔽位 若在进入异常处理时设置了中断禁止位,要在此清除。
可以认为应用程序总是从复位异常处理程序开始执行的,因此复位异常处理程序不需要返回
(2)各种异常返回方法
FIQ中断返回
不管是在ARM状态还是在Thumb状态下进入FIQ模式,FIQ处理程序均可以执行以下指令从FIQ模式返回:
SUBS PC,R14-fiq ,#4
指令预取中止( Abort )异常返回
当指令预取访问存储器失败时,存储器系统向ARM处理器发出存储器中止(Abort)信号,预取的指令被记为无效,但只有当处理器试图执行无效指令时,指令预取中止
异常才会发生,如果指令未被执行。例如在指令流水线中发生了跳转,则预取指令中止不会发生。
如果发生了指令预取中止异常,无论是在ARM状态还是Thumb状态,其返回指令为:
SUBS PC, R14_abt, #4 ;重新执行被中止的指令
数据中止( Abort )异常返回
如果发生了数据中止异常,无论是在ARM状态还是Thumb状态,其返回指令为:
SUBS PC, R14_abt, #8
重新执行被中止的指令
软件中断指令(SWI)异常返回
用于进入管理模式,常用于请求执行特定的管理功能。软件中断处理程序执行以下指令可以从SWI模式返回,无论是在ARM状态还是Thumb状态:
MOVS PC , R14_svc
以上指令恢复PC(从R14_svc)和CPSR(从SPSR_svc)的值,并返回到SWI的下一条指令。
未定义指令异常返回
当ARM处理器遇到不能处理的指令时,会产生未定义指令异常。采用这种机制,可以通过软件仿真扩展ARM或Thumb指令集。处理器执行以下程序返回,无论是在
ARM状态还是Thumb状态:
MOVS PC, R14_und
以上指令恢复PC(从R14_und)和CPSR(从SPSR_und)的值,并返回到未定义指令后的下一条指令。
异常中断向量表说明:
存储器的前8个字中除了地址0x00000014之外,全部被用作异常矢量地址。
这是因为在早期的26位地址空间的ARM处理器中,曾使用地址0x00000014来捕获落在地址空间之外的load和store存储器地址。
这些陷阱称为“地址异常”,因为32位的ARM不会产生落在它的32位地址空间之外的地址,所以地址异常在当前的体系结构中没有作用,0x00000014的矢量地址也就不再使用了