ARM/ARM处理器及系统结构

ARM/ARM处理器及系统结构

ARM 介绍

ARM(Advanced RISC Machines)有 3 种含义:

  • 是一个公司的名称;
  • 是一种技术的名称
  • 是一类微处理器的通称;

基于 ARM 技术 的微处理器应用约占据了 32 位 RISC 微处理器 80% 以上的市场份额,其中,在手机市场,ARM 占有绝对的垄断地位。

处理器 Processor(也称为中央处理单元或 CPU)是计算机的核心组件,它负责执行大部分的计算和逻辑操作。处理器不仅包括处理芯片,还有其他几个关键的部分:

  • 内核(Cores):现代处理器通常包含多个内核,每个内核都可以独立执行指令。多核处理器可以同时执行多个任务,提高了性能。
  • 缓存(Cache):缓存是一种快速存储器,用于存储处理器可能需要的数据和指令。通过使用缓存,处理器可以减少从主内存获取数据的时间,提高性能。
  • 控制单元(Control Unit):控制单元是处理器的一个部分,负责管理和协调处理器的操作。它解释和执行存储在内存中的指令。
  • 算术逻辑单元(Arithmetic Logic Unit, ALU):ALU 负责执行所有的算术和逻辑操作,包括加法、减法、乘法、除法以及比较操作。
  • 寄存器(Registers):寄存器是一种非常快速的存储器,用于临时存储和访问正在被处理器处理的数据和指令。
  • 总线(Buses):总线是连接处理器和其他系统组件(如内存、硬盘、输入/输出设备等)的通道,用于数据传输。

ARM 公司是一家总部位于英国 Cambridge 的设计和许可证公司,专注于处理器核心的设计。ARM 并不直接生产和销售芯片,而是设计和开发处理器架构,然后向各种芯片制造商授权这些设计。这些芯片制造商,如高通(Qualcomm)、三星(Samsung)、苹果(Apple)等,会基于 ARM 的设计,制造出各自的处理器产品。

ARM 的业务模式使得它可以专注于设计和优化处理器架构,而无需投入大量资金来建立和维护自己的制造设施。同时,芯片制造商可以利用 ARM 的设计来生产高效、低功耗的芯片,而无需自行从头开始设计处理器架构。

采用 RISC 架构的 ARM 微处理器一般有如下特点

  • 体积小、功耗低、低成本、高性能;
  • 支持 Thumb(16 位)/ARM(32 位)双指令集,能很好地兼容 8 位/16 位 器件;
  • 大量使用 寄存器,指令执行速度更快;
  • 大多数数据操作都在寄存器中完成;
  • 寻址方式灵活简单,执行效率高;
  • 指令长度固定。

ARM Processor 系列介绍

ARM 处理器指令集的特点

ARM 内核不是一个纯粹的 RISC 体系结构,ARM 指令集与纯粹的 RISC 的定义有以下几个不同。

  • 一些特定指令的周期数可变,并不是每条 ARM 指令都是单周期的。
  • 内嵌的桶形移位器(可以单个时钟周期内对二进制数进行多位的移位操作)产生了更为复杂的指令,扩展了指令的功能,因此改善了内核的性能。
  • 支持 16 位的 Thumb 指令集,提高了代码密度。
  • 支持条件执行:每条指令都可以设置一个执行条件,只有条件满足时才执行。
  • 增强指令:一些功能强大的数字信号处理指令被加入到 ARM 指令集中。

ARM 指令集体系结构的演变(了解)

ARM 公司定义了不同版本的 ARM 指令集体系结构版本,用 vn 来标识(n 是版本号,目前是 1-8)。
ARM v1 ~ v3 版本的处理器未得到大量应用,ARM 处理器的大量广泛应用是从其 v4 版本开始的。
v7 系列 CPU 被称作 CoreTex 系列
到目前 v8 是最新的版本, 可以选择 64 或 32 执行状态。64 执行状态针对 64 位处理技术,引入了一个全新指令集 A64,可以存取大虚拟地址空间。

ARMv4
ARMv4 是目前支持的最老的架构,是基于 32-bit 地址空间的 32-bit 指令集。ARMv4 除了支持 ARMv3 的指令外还扩展了:
支持 halfword 的存取
支持 byte 和 halfword 的符号扩展读
进一步的明确了会引起 Undefined 异常的指令
对以前的 26bits 体系结构的 CPU 不再兼容

ARMv4T
ARMv4T 增加了 16-bit Thumb  指令集,这样使得编译器能产生紧凑代码(相对于 32-bit 代码,内存能节省到 35%以上)并保持 32-bit 系统的好处。
Thumb 在处理器中仍然要扩展为标准的 32 位 ARM 指令来运行。用户采用 16 位 Thumb 指令集最大的好处就是可以获得更高的代码密度和降低功耗。

ARMv8
2011 年 11 月,ARM 公司发布了新一代处理器架构 ARM V8,ARM 的首个 64 位架构;ARM 2012 年十月发布了 Cortex-A53 and Cortex-A57 核心。2013 年苹果基于 V8 架构的 Apple 7 使用在了 iPhone 5S 上。

Cortex
ARM 推出的 Cortex 系列包括:Cortex-A、Cortex-R 和 Cortex-M 三个系列。

  • Cortex-A(Application)系列主要应用于复杂的应用中,支持:ARM、Thumb 和 Thumb2 指令集。
  • Cortex-R(Real-time)系列是为实时操作系统设计的嵌入式处理器,能带来更小的芯片面积和低功耗。
  • Cortex-M(Microcontroller)系列处理器结合了多种突破性技术,集成了许多紧耦合系统外设,以便能满足下一代产品的控制要求,适用于高性能、低成本需求的嵌入式应用。 Cortex-M 主要针对单片机领域。

ARM9 的 5 级流水线(流水线的级数,代表的是指令周期被划分成的阶段数量)
5 级流水线 是 ARM9TDMI 的主要特征之一,其设计减少了在每个时钟内必须完成的最大工作量,进而允许使用较高的时钟频率。

  • 取指:指令从存储器中取出,放入指令流水线
  • 译码:指令译码,从寄存器堆中读取寄存器操作数
  • 执行:把一个操作数移位,产生 ALU 的结果。如果指令是 Load 或 Store,在 ALU 中计算存储器的地址
  • 缓存/数据:如果需要,则访问数据存储器;否则,ALU 的结果只是简单地缓冲一个时钟周期,以便使所有指令具有同样的流水线流程
  • 回写:将指令产生的结果写回到寄存器堆,包括任何从寄存器读出的数据

classic name

1
2
3
4
5
6
7
8
9
10
11
12
13
ARM 处理器命名
规则:ARM{x}{y}{z}{T}{D}{M}{I}{E}{J}{F}{-S}
x -- 处理器系列
y -- 存储管理/保护单元
z -- cache
T -- 支持 Thumb 指令集
D -- 支持片上调试
M -- 支持快速乘法器
I -- 支持 Embedded ICE,支持嵌入式跟踪调试
E -- 支持增强型 DSP(Digital Signal Processor) 指令
J -- 支持 Jazelle
F -- 具备向量浮点单元 VFP
-S -- 可综合版本

ARM Processor 工作状态

ARM 状态和 Thumb 状态

Thumb 指令集
嵌入式系统在某些应用场合对存储成本或空间要求比较苛刻,为了让用户更好地控制代码量,于是设计了 2 套指令系统,分别为 ARM 指令集和 Thumb 指令集。其中 ARM 指令集为 32 位(字)长度,具有最完整的功能;Thumb 指令集为 16 位(半字)长度,能实现 ARM 指令集的大部分功能
在功能上可以认为 Thumb 是 ARM 指令集的子集

既然 ARM 处理器共存 2 种指令集,那么到底何时执行 ARM 指令集,何时执行 Thumb 指令集呢?
ARM 处理器有 2 个处理器状态与这 2 套指令集分别对应;ARM 处理器的两种状态可以通过相应的指令进行切换;

ARM9TDMI 核是具有 T 变种的 ARM 处理器核,其工作状态一般有以下两种,并可在两种状态之间切换。

  • ARM 状态:执行 32 位的字对齐的 ARM 指令。是系统上电默认的状态。
  • Thumb 状态:执行 16 位的、半字对齐的 Thumb 指令。

Note

  • ARM 指令集与 Thumb 指令集不能同时混合使用
  • ARM 和 Thumb 状态间的切换并不影响处理器模式或寄存器内容。
  • 从一个 ARM 例程调用另一个 Thumb 例程时,内核必须切换状态,反之亦然

Work state

指令长度和数据格式

ARM 微处理器的指令长度可以是 32 位(在 ARM 状态下),也可以为 16 位(在 Thumb 状态下)。
ARM 微处理器中支持字节Byte(8 位)、半字 Half-Word(16 位)、字 Word(32 位)三种数据类型。

  • 如果一个数据是以字方式存储的,那么它就是字对齐的;
  • 如果一个数据是以半字方式存储的,那么它就是半字对齐的。

alignment

0x40020x4004 相差 2 个 Byte,即 16bit,所以为半字对齐 Half-Word Aligned

ARM Processor 运行模式

ARM 体系结构支持7 种运行模式:
ARM Processor Mode

  • 用户模式(USR)正常程序执行模式,大部分任务执行在这种模式下。用户模式是用户程序的工作模式。该没有权限去操作其它硬件资源,也不能切换到其它模式下。
  • 系统模式(SYS)系统模式是特权模式,不受用户模式的限制。用户模式和系统模式共用一套寄存器,但比用户模式有更高的权限,可以访问所有系统资源及进行模式切换。
  • 一般中断模式(IRQ)一般中断模式也叫通用中断模式,用于处理一般的中断请求,通常在硬件产生中断信号之后自动进入该模式,该模式为特权模式,可以自由访问系统硬件资源。
  • 快速中断模式(FIQ)快速中断模式是相对一般中断模式而言的,它是用来处理对时间要求比较紧急的中断请求,主要用于高速数据传输及通道处理中,其中断优先级相对普通中断更高
  • 管理模式(Supervisor,SVC) 管理模式是 CPU 上电后默认模式,因此在该模式下主要用来做系统的初始化,软中断处理也在该模式下。系统复位或开机、软中断时进入到 SVC 模式下。
  • 中止模式(ABT)中止模式用于支持虚拟内存或存储器保护,当用户程序访问非法地址,没有权限读取的内存地址时,会进入该模式。
  • 未定义模式(UND)CPU 在指令的译码阶段不能识别该指令操作时,会进入未定义模式,进行未定义陷阱处理。

特权模式: 除用户模式外的其它 6 种处理器模式称为特权模式(Privileged Modes)。在特权模式下,程序可以访问所有的系统资源,也可以任意的进行处理器模式切换。只有在特权模式下才允许对当前程序状态寄存器(CPSR)的所有控制位直接进行读/写访问,而在非特权模式下只允许对 CPSR 的控制位进行间接访问(SWI 方式)。
特权模式中除系统模式之外的其他 5 种模式又统称为异常模式。它们除了可以通过在特权下的程序切换进入外,也可以由特定的异常进入。其中管理模式也称为超级用户模式,是为操作系统提供软中断的特有模式。大多数的用户程序运行在用户模式下。当处理器工作在用户模式时,需要进行处理器模式切换时,应用程序可以产生异常处理,在异常处理过程中进行处理器模式切换。这种体系结构可以使操作系统控制整个系统资源的使用。

fix:快速中断为FIQ

ARM Register

ARM 处理器有如下 37 个用户可见寄存器。
31 个通用寄存器:

  • R0~R15
  • R13_svc,R14_svc,
  • R13_abt,R14_abt,
  • R13_und、R14_und、
  • R13_irq、R14_irq
  • R8_fiq~R14_fiq。

6 个状态寄存器:

  • 1 个 CPSR
  • 5 个 SPSR( SPSR_svr、 SPSR_abt 、 SPSR_und 、 SPSR_irq 、 SPSR_frq );

ARM 处理器共有 7 种运行模式,在每一种处理器模式中都有一组相应的寄存器。

在 ARM 状态下,任一时刻都可以访问到 16 个 通用寄存器和 1~2 个状态寄存器。各种模式下能访问的寄存器如下图所示

堆栈指针 SP R13

寄存器 R13 通常用作堆栈指针,称作 SP。每种异常模式都有自己的分组 R13。通常 R13 应当被初始化成指向给异常模式所分配的堆栈。
其中用户模式和系统模式共用一个,每种异常模式都有专用的 R13 寄存器。它们通常指向各模式所对应的专用堆栈,也就是说 ARM 处理器允许用户程序有 6 个不同的堆栈空间。

链接寄存器 LR R14

寄存器 R14(链接寄存器或 LR)在体系结构中有两种特殊用途:
用途 1
在各种模式下,R14 用来保存子程序的返回地址。当一条 BL 或者 BLX 指令执行子程序调用时,R14 设为子程序的返回地址。返回时,通过复制 R14 中的地址值到 PC 中来实现子程序的返回。通常有以下2 种方式
Method1:执行下列指令之一

  • MOV PC, LR 把 LR 中的值写入到 PC 寄存器中
  • BX LR跳转(带状态切换)到 LR 地址所指向的指令执行。用于从实现从一个状态返回另外一个状态并继续执行。
    Method2
    在子程序入口,执行 R14 的入栈操作STMFP SP!, {<registers>, LR} 该条指令用于把,和 LR(R14)等多个寄存器压入堆栈,SP(R13)指向堆栈顶部。
    并使用匹配的指令返回LDMFP SP!, {<registers>, PC}该条指令用于把堆栈顶部多个单元,执行出栈操作,出栈的数据保存到和 PC 等多个寄存器中。
    注:执行该操作后,原 R14 入栈的值,出栈后就保存到 PC 中了,相当于执行了把 R14 的值写入到 PC 的操作。
    用途 2
    当发生异常时,相关异常模式下的 R14 就设为异常返回地址。异常的返回地址与子程序的返回类似。区别在于有些异常有一个小常量的偏移

程序计数器 PC R15

无论处理器处于何种状态,程序计数器 R15(即 PC)总是指向“正在取指”的指令,而不是指向“正在执行”的指令或正在“译码”的指令。
一般来说,人们习惯性约定将“正在执行的指令作为参考点”,称之为当前第 1 条指令。
因此,PC 总是指向第 3 条指令,或者说 PC 总是指向当前正在执行的指令地址再加 2 条指令的地址。

MOV 执行时,LDR 在取值,相差 2 条指令的地址,如果为 ARM 指令,设三条指令地址分别为 0x4000,0x4004,0x4008,PC 值等于当前指令的地址+8Bytes,0x4000 + 8 = 0x4008
当处理器处于 Thumb 状态时,每条指令长为 2 字节,所以 PC 的值为正在执行的指令地址加 4 字节,即:PC值=当前程序执行位置+4字节

程序状态寄存器 PSR

当前程序状态寄存器(CPSR,Curren Program Status Register)可以在任何处理器模式下被访问,它包含下列内容:

  • ALU 状态标志(条件码标志位);
  • 当前的处理器模式;
  • 中断使能标志;
  • 设置处理器的状态。

每一种异常器模式下,都有一个专用的物理寄存器做备份程序状态寄存器(SPSR,Saved Program Status Register )。当特定的异常中断发生时,这个物理寄存器负责存放当前程序状态寄存器的内容。当异常处理程序返回时,再将其内容恢复到当前程序状态寄存器。

这些条件标志位会根据程序中的算数指令或逻辑指令的执行结果进行改变,而且这些条件标志位可由大多数指令检测以决定指令是否执行。

  • N 本位设置成当前指令执行结果的第 31 位。当两个由补码表示的有符号整数运算时,N=1 表示结果为负数;否则结果为正数或零。
  • Z Z=1 表示运算的结果为零,否则结果不为零。
  • C 分 4 种情况设置 C 的方法:
    • 在加法指令中(包括比较指令 CMN),当结果产生了进位,则 C=1,表示无符号数运算发生上溢出,其它情况下 C=0;
    • 在减法指令中(包括比较指令 CMP),当运算中发生了借位,则 C=0,其它情况下 C=1;
    • 对于在操作数中包含移位操作的运算指令(非加/减指令),C 被设置成被移位寄存器最后移出去的位;
    • 对于其它非加/减法运算指令,C 的值通常不受影响。
  • V 下面分两种情况讨论 V 的设置方法:
    • 对于加/减运算指令,当操作数和运算结果都是以二进制的补码表示的带符号的数时,且运算结果超出了有符号运算的范围时溢出。V=1 表示符号位溢出;
    • 对于非加/减法指令,通常不改变标志位 V 的值。
  • Q(了解)在带 DSP 指令扩展的 ARMV5 及更高版本中,Q 标志位被指定用于指示增强 DSP 指令是否发生了溢出。在 ARMV5 以前的版本及 ARMV5 的非 E 系列处理器中,Q 标志位没有被定义,属于待扩展的位。

控制位:CPSR 的低 8 位属于控制位。

  • I,F中断禁止位(第 7、6 位) I=1:IRQ 被禁止;F=1:FIQ 被禁止。
  • T状态控制位(第 5 位)T 是处理器的状态控制位。T=0:处理器处于 ARM 状态;T=1:处理器处于 Thumb 状态。
    注意:绝对不要强制改变 CPSR 寄存器中的控制位 T。如果这样做,处理器会进入一个无法预知的状态。
  • MMMMM模式控制位

注意
通过程序修改 CPSR 可以进入异常(除 SYS 以外的特权模式)。除此之外,也可以在内核对异常或者中断响应时由硬件切换到异常模式。

1
2
3
4
5
6
7
8
: 从系统模式切换到管理模式
: MSR CPSR_c, #D3 是一条ARM汇编语言指令,用于修改当前程序状态寄存器(Current Program Status Register,CPSR)的特定字段。这条指令的具体含义如下

MSR:这是一个Move to Status Register的指令,用于将一个值移动到一个状态寄存器中。
CPSR_c:这表示目标是CPSR的控制字段(control field)
#D3:这是一个立即数,表示要将CPSR的控制字段设置为十六进制的D3。在二进制中,D3等于1101 0011-->

MSR CPSR_c,#D3;

用户模式与系统模式不能由异常进入,也就是说要想进入系统模式,必须通过修改 CPSR 才能实现。
MSR CPSR_c,#DF;

ARM Storage

ARM 存储方法

ARM 处理器外部采用冯·诺依曼(von Neumann)结构,指令和数据共用一条 32 位数据总线,只有装载、存储和交换指令可访问存储器中的数据。
ARM 处理器将存储器看作是一个从 0 开始的线性递增的字节集合,其中每个数组元素(字节)都是可以寻址的。
ARM 支持大端模式(big-endian)小端模式(little-endian)两种内存模式。
在大端模式下,一个字的高地址单元放的是数据的低位;而在小端模式下,数据的低位放在内存中低地址单元中。

一个基于 ARM 的实际芯片可能只支持小端存储器格式,也可能只支持大端存储器格式,还可能两者都支持。
ARM 指令集不包含任何直接选择大小端存储器格式的指令,但是一个同时支持大小端存储器格式基于 ARM 的芯片可以通过硬件配置(一般使用芯片的引脚来配置)来匹配存储器系统所使用的规则。如果芯片有一个标准系统控制的协处理器(例如 ARM920T 的 CP15 协处理器),系统控制协处理器寄存器 1 的 bit7 可用于改变配置。
注意:对于 S3C2440是通过软件来指定存储器格式的(通过设置 CP15 协处理器协处理器寄存器 1 的 bit7 来实现),缺省为小端格式

ARM 体系的存储空间

ARM9 使用 $2^{32}$ 个 8 位字节地址空间,字节地址的排列从 $0~2^{32}-1$
地址空间也可以看作是包含$2^{30}$个 32 位字,地址以字为单位进行分配。也就是将地址除以 4,地址为 A 的字包含 4 个字节,地址分别为 A、A+1、A+2和A+3
与此同时,地址空间还可被看作包含$2^{31}$个 16 位半字,地址按照半字进行分配。地址为 A 的半字包含 2 个字节,地址分别为 A和A+1

ARM 存储器结构

ARM 处理器有的带有指令 cache 和数据 cache,但不带有片内 RAM 和片内 ROM。
系统所需的 RAM 和 ROM(包括 Flash)都通过总线外接。
有的 ARM 片内还带有存储器管理单元 MMU(Memory Management Unit)

存储器映射 I/O

基于 ARM 内核的芯片具有许多的外设,这些外设访问的标准方法是使用存储器映射的 I/O(存储器统一编址),为外设的每个寄存器都分配一个地址。通常,从这些地址装载数据用于读入,向这些地址保存数据用于输出。有些地址的装载和保存用于外设的控制功能,而不是输入或输出功能。
注意:存储器映射的 I/O 位置的操作不同于正常的存储器位置的操作。通常,把存储器映射的 I/O 位置标记为无高速缓存和无缓冲区,以避免处理器把这部分地址当普通内存,调入到 cache 中,进行缓存操作。

Flash 组织形式

目前几乎所有 MCU 的程序都存储在 Flash 中。Flash 分为片内和片外两种。片外 Flash 又有以下种类。
NOR Flash:NOR Flash 读取速度快,但是擦除和写入速度慢。
NAND Flash:NAND Flash 读取速度比 NOR Flash 慢,但擦除和写入速度很快

RAM 的组织形式

芯片自带的 RAM 不够用时需要外加,外加的 RAM 一般是 SDRAM 和 DDR RAM,极少数使用 SRAM,因为 SRAM 的价格相对较贵,但 SRAM 速度要比动态 RAM 快。
SRAM:只需要在 IDE 中设置好地址。
SDRAM/DDR RAM:不仅要在 IDE 中设置好起始地址,还要在程序中做初始化操作后才能使用。如果使用仿真器,那么在仿真运行程序前,要执行一个初始化脚本文件,或者执行一系列命令对 SDRAM 和 DDR RAM 进行初始化,否则会运行出错。

作者

Jiaxing Gao

发布于

2024-03-09

更新于

2024-11-16

许可协议

评论

}