第二章 ARM 技术及体系结构【嵌入式系统】

这篇具有很好参考价值的文章主要介绍了第二章 ARM 技术及体系结构【嵌入式系统】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

2023-7-3 14:28:36

以下内容源自《【嵌入式系统】》
仅供学习交流使用

推荐

第二章 ARM 技术及体系结构

2.1 嵌入式 ARM 处理器概况

第二章 ARM 技术及体系结构【嵌入式系统】,# 嵌入式系统,arm开发,嵌入式操作系统
第二章 ARM 技术及体系结构【嵌入式系统】,# 嵌入式系统,arm开发,嵌入式操作系统

2.1.1 ARM 体系的版本说明

2.1.2 ARM 内核的命名

2.1.3 常用 ARM 处理器系列介绍

第二章 ARM 技术及体系结构【嵌入式系统】,# 嵌入式系统,arm开发,嵌入式操作系统

ARM7 系列处理器包括 4 种类型的核:ARM7TDMI、ARM7TDMI-S、ARM720T 和
ARM7EJ,其中 ARM7TDMI 是目前应用最广泛的 32 位嵌入式 RISC 处理器,ARM7 系列采
用 ARMv4T 体系结构,基于冯*诺依曼结构,能够提供 0.9MIPS/MHz 的速度,具有三级流
水线功能,主要的应用在工业控制、Internet 设备、网络和调制器设备、移动通信等以及嵌
入式应用,同时由于功耗很低,适合用于对功耗要求较高的应用,如便携式产品。

ARM7 处理器特点,是提供 16 位压缩的 Thumb 指令集、嵌入式 ICE-RT 逻辑、JTAG
软件调试方式,适用于大规模的 SOC 设计,其中 ARM720T 还提供 8KB 的高速缓存和存储
器管理功能部件,可以支持 Linux 和 Windows CE 等操作系统。

2.2 ARM 处理器技术

2.2.1 ARM处理器的RISC特征

CISC 结构存在如下一些问题
(1)在 CISC 结构的指令系统中,各种指令的使用频率相差悬殊。椐统计约有 20%
的指令使用频率最大,占运行时间的 80%。也就是说,有 80%的指令只在 20%的运行时
间内才会用到。
(2)CISC 结构指令系统的复杂性带来了计算机体系结构的复杂性,这不仅增加了研
制时间和成本,而且还容易造成设计错误。另外,CISC 结构指令系统的复杂性还给 VLSI
设计带来了很大负担,不利于单片集成,而且许多复杂指令需要很复杂的操作,因而运
行速度慢。
(3)在 CISC 结构的指令系统中,由于各条指令的功能不均衡性,不利于采用先进的
计算机体系结构技术(如流水技术)来提高系统的性能。
针对这些缺点,提出了RISC 的结构特点
(1) 简化指令集,只保留常用的基本指令;
(2) 设计大量的通用存储器,减少访存的次数;
(3) 采用装载/保存(load-store)结构,支持流水线技术,使每个周期时间相等;
(4) 采用简单的指令格式、规整的指令字长和简单的寻址方式。
(5) 单机器周期指令,即大多数的指令都可以在一个机器周期内完成,并且允
许处理器在同一时间内执行一系列的指令。

RISC 技术的主要特点是 CPU 的指令集大大简化,并且关注如何用简单的指令来提
高机器的性能,特别是提高运行速度。一般来说,CPU 的平均指令执行速度受三个因素
的影响,即程序中的指令数 IN、每条指令执行所需的机器周期数 CPI 和每个机器周期的
时间 TC,它们之间的关系如下:
程序的执行时间=IN×CPI×TC

ARM 处理器采用了 RISC 技术,为了使 ARM 能够更好地满足嵌入式应用的需要,ARM 体系结构还增加了以下功能:

  • 每条数据处理指令可同时包含算术逻辑单元(ALU)的运算和移位处理,实现ALU 和移位器的最大利用;
  • 使用地址自增和自减的寻址方式优化程序循环;
  • 装载/保存指令对数据的批量传输,实现最大数据吞吐量;
  • 大多数指令提供条件执行,实现最快速的代码执行。

2.2.2 流水线

在 ARM 处理器中不同系列的 CPU 采用的流水线深度不同,如图 2.2 所示,ARM7
采用三级流水线、ARM9 采用五级流水线,ARM10 采用六级流水线、ARM11 采用八级
流水线。
第二章 ARM 技术及体系结构【嵌入式系统】,# 嵌入式系统,arm开发,嵌入式操作系统

第二章 ARM 技术及体系结构【嵌入式系统】,# 嵌入式系统,arm开发,嵌入式操作系统

第二章 ARM 技术及体系结构【嵌入式系统】,# 嵌入式系统,arm开发,嵌入式操作系统

在 ARM 处理器中将 PC 程序计数器定义到 R15 寄存器,无论处理器处于何种状态, PC 总是指向“正在取指”指令的地址。

2.2.3 哈佛结构

哈佛结构是一种将程序中的指令和数据分开存储的存储器结构

冯·诺伊曼结构也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构

第二章 ARM 技术及体系结构【嵌入式系统】,# 嵌入式系统,arm开发,嵌入式操作系统

2.3 ARM7 处理器结构

2.4 ARM7TDMI 的工作状态及模式

2.4.1 ARM 处理器的工作状态

ARM7TDMI 处理器内核包含 2 套指令系统,分别为 ARM 指令集和 Thumb 指令集,
并且各自对应 1 种处理器的状态,即 ARM 状态和 Thumb 状态,这两种状态由程序状态字
CPSR 中 T 标志位确定,为 0 时处理器工作在 ARM 状态,为 1 时处理器工作在 Thumb 状态,
两种状态的特点是:

  • ARM 状态:处理器执行 32 位字对齐方式的 ARM 指令,每条 ARM 指令长度为 32
    位,指令的功能强大,处理器默认为此状态;
  • Thumb 状态:处理器执行 16 位半字对齐方式的 Thumb 指令。每条 Thumb 指令长
    度为 16 位,是 ARM 指令功能的子集。

由于 Thumb 指令压缩了 ARM 指令的功能,使其指令长度缩短到 16 位,节省了程序
的存储空间,但也存在有些功能使用 ARM 指令编程要比使用 Thumb 指令编程,节约更多
的指令条数。这样就增加了程序的执行时间,因此在嵌入式应用中,如果要加快程序的执行
速度,一般采用 ARM 指令编程,如果要节省存储器资源,可以采用 Thumb 指令编程

在程序的执行过程中,处理器只能处于一种状态,也就是说 ARM 指令与 Thumb 指令
不能同时混合使用,但是,ARM 处理器可以随时在两种工作状态之间切换,处理器在切换
过程中,不会影响处理器工作模式和相应寄存器中的内容。处理器的状态切换一般采用 BX
指令实现。见程序举例【例 2-1】。
【例 2-1】

第二章 ARM 技术及体系结构【嵌入式系统】,# 嵌入式系统,arm开发,嵌入式操作系统

ARM 状态和 Thumb 状态切换时,使用带状态切换的转移指令 BX,BX 为寄存器寻址
方式,寄存器的内容是要转移的地址,由于指令是字对齐或半字对齐存放,因此地址的最低
位没有使用,BX 指令就利用地址的最低位的值来修改程序状态字 CPSR 中的 T 标志。以实
现处理器状态的切换

处理器开机或进入到异常模式,其工作状态默认为 ARM 状态,通过 BX 指令可以切换
到 Thumb 状态。处理器不论工作在哪一种状态下,都不会影响异常事件的发生,在 ARM
处理器中有备份程序状态字 SPSR 保存异常发生前的 CPSR 值,当异常退出时通过 SPSR 值,
就可以恢复异常前处理器的工作状态。

2.4.2 ARM 处理器模式

ARM 处理器共支持 7 种处理器模式,分别为:

  • 用户模式(usr):ARM 处理器正常的程序执行状态;
  • 快速中断模式(fiq):用于高速数据传输或通道处理;
  • 外部中断模式(irq):用于通用的中断处理;
  • 管理模式(svc):操作系统使用的保护模式;
  • 数据访问终止模式(abt):当数据或指令预取终止时进入该模式,可用于虚拟存储
    及存储保护;
  • 系统模式(sys):运行具有特权的操作系统任务;
  • 未定义指令中止模式(und):当未定义的指令执行时进入该模式,可用于支持硬
    件协处理器的软件仿真。

除用户模式外,其它的 6 种模式称为特权模式(Privileged Modes)。ARM 内部寄存器
和一些片内外设在硬件设计上只允许特权模式下访问。此外,特权模式可以自由的切换处理
器模式,而用户模式不能直接切换到别的模式。
在特权模式中,除去系统模式以外的 5 种又称为异常模式(Exception Modes),它们除
了可以通过程序切换进入外,也可以由特定的异常进入。当特定的异常出现时,处理器进入
相应的模式。每种异常模式都有一些独立的寄存器,以避免异常退出时用户模式的状态不可
靠。如表 2-3 所示。

第二章 ARM 技术及体系结构【嵌入式系统】,# 嵌入式系统,arm开发,嵌入式操作系统

ARM 处理器中的 7 中模式,是以当前程序状态寄存器 CPSR 中控制位 M[4:0]来标志,
在特权模式下通过修改 M[4:0]值,就可以改变处理器的运行模式。

2.5 ARM7 内部寄存器

ARM7 微处理器共有 37 个 32 位寄存器,其中 31 个为通用寄存器,6 个为状态寄存器。
但是这些寄存器不能被同时访问,具体哪些寄存器是可访问的,取决微处理器的工作状态及
具体的运行模式。37 个寄存器定义如下:

  • 31 个通用寄存器:R0~R15、R8_fiq 、R9_fiq、R10_fiq、R11_fiq、R12_fiq、R13_svc、
    R13_irq、R13_fiq、R13_abt、R13_und、R14_svc、R14_irq、R14_fiq、R14_abt、
    R14_und。
  • 6 为状态寄存器,其中 ARM7 的 6 个状态寄存器只使用了 12 位,分别为:CPSR、
    SPSR_svc、SPSR _irq、SPSR _fiq、SPSR _abt、SPSR _und。
    ARM 处理器共有 7 种不同的处理器模式,每种模式都有一组相应的寄存器组,其中用
    户模式和系统模式使用同一组寄存器。

2.5.1 ARM 状态下的寄存器组织

在 ARM 状态下,程序设计人员能够访问的寄存器如表 2-4 所示,但是究竟那些寄存器
对程序员来说当前是可用的,则完全取决于当前处理器的运行模式,因此,在不同的运行模
式下,程序员实际能访问寄存器的权限是不一样的。

第二章 ARM 技术及体系结构【嵌入式系统】,# 嵌入式系统,arm开发,嵌入式操作系统

在 ARM 状态中,R0~ R15 称为通用寄存器,其中,R0~ R7 是不分组的寄存器;R8~ R14
是根据运行模式进行分组的寄存器;R15 是程序计数器,也是不分组的。

  1. 一般通用寄存器
    R0~R7 是未分组的通用寄存器,他们未被系统用作特殊的用途,一般用于保存数据或
    地址值。处理器运行在任何模式下,R0~R7 寄存器都指向同一个物理寄存器,因此,在中
    断或异常处理进行模式转换时,由于不同的模式使用相同的物理寄存器,可能会造成寄存器
    中数据的破坏,在程序设计时应注意保护现场。

    R8~R14 寄存器按照不同的处理器运行模式进行分组,在任何一个运行模式下都有自
    己对于 R8~R14 的一组 32 位的物理寄存器。其中寄存器 R8~R12 只有 2 组不同的物理寄
    存器,一组是专为快速中断 FIQ 模式设计的 R8_fiq~R12_fiq 寄存器,另一组是其余 6 种模
    式共同使用的 R8~R12。因此在进入到 FIQ 模式后,就不必要为保护 R8~R12 寄存器而浪
    费时间。程序就可以直接使用 R8_fiq~R12_fiq 寄存器进行操作,从而实现了快速的中断处
    理。

    R13 和 R14 寄存器分别有 6 个不同的 32 位物理寄存器,其中用户模式和系统模式共有
    一组,其余的 5 个异常模式分别使用一组。

  2. 堆栈指针寄存器 SP
    堆栈是在内存中划出一段存储空间,用于暂时保存一些数据,堆栈操作通常会发生在子
    程序调用、异常发生或者是程序运行过程中寄存器数量不够时,堆栈操作的规则是先进后出
    (或称为后入先出),使用一个指针 SP,来指定数据在内存中的地址,堆栈操作分为“入栈”
    和“出栈”,入栈是往堆栈中写入数据,就是按照 SP 的值确定将数据写入到内存中对应的
    存储单元,每写入一个数据堆栈的剩余空间就减少一个,同时对堆栈指针 SP 进行修改;出
    栈是相反的操作,是从堆栈中取走数据,就是按照 SP 的值将内存中对应存储中的数据取走,
    每取走一个数据堆栈的剩余空间就增加一个,同时对堆栈指针(SP)进行修改。堆栈实际
    是一段内存空间,那么堆栈的出入口其实就是一个地址,在进行堆栈操作时需要能够非常方
    便地知道当前的出入口在哪里,因此设计了堆栈指针(SP),始终指向当前堆栈操作的出入
    口的地址。

    在 ARM 程序设计中通常用寄存器 R13 作为堆栈指针(SP),用于指定堆栈操作出入口
    的地址
    ,ARM 处理器一共有 6 个堆栈寄存器,分别是 R13、R13_svc、R13_irq、R13_fiq、
    R13_abt、R13_und,其中用户模式和系统模式共用一个,每种异常模式都有自己专用的 R13
    寄存器,它们通常指向各模式所对应的专用堆栈,也就是说,ARM 处理器向程序设计者提
    供了 6 个不同的堆栈空间,提高了处理器的异常处理速度。这些堆栈指针分别是用户和系统
    共用堆栈,指针 SP 是 R13;管理堆栈,指针 SP 是 R13_svc;中止堆栈,指针 SP 是 R13_abt;
    未定义堆栈,指针 SP 是 R13_und;中断堆栈,指针 SP 是 R13_irq;快速中断堆栈,指针 SP
    是 R13_fiq。

    ARM 处理器提供了 6 个 32 位的堆栈指针,而且堆栈的操作也非常灵活,根据堆栈指针
    的增减方向和指针指向存储单元是否为空,可以提供 4 种不同的堆栈方式:满递增、空递增、
    满递减、空递减
    。在用户应用程序的初始化部分,一般都要初始化每种模式下的堆栈指针,
    使其指向该运行模式的栈空间,这样,当程序的运行进入异常模式时,可以将需要保护的寄
    存器压入到堆栈指针所指向的堆栈单元,而当程序从异常模式返回时,则从对应的堆栈中恢
    复,采用这种方式可以保证异常发生后程序的正常执行。

  3. 连接寄存器 LR
    在 ARM 处理器中 R14 寄存器可以作为通用寄存器使用之外,主要用作连接寄存器(LR:
    Link Register),连接寄存器用于保存子程序返回地址或者异常处理程序的返回地址
    ,LR 寄
    存器一共有 6 个,其中子程序的返回地址使用一个 R14,每种异常模式各自有一个专用的
    LR 寄存器用于保存异常处理程序的返回地址,它们分别为 R14_svc、R14_irq、R14_fiq、
    R14_abt、R14_und。LR 的保存过程如下:

    ① 对子程序返回地址保存
    在 ARM 指令集或者 Thumb 指令集中,分支指令 BL 具有保存断点的功能,就是说在程
    序转移之前,将程序计数器 PC 的内容自动保存到链接寄存器 LR 中,当使用 BL 指令调用
    子程序时,返回地址将自动存入到 R14 中,在子程序结束时,将 R14 的内容复制到 PC 中,
    即可实现子程序的返回。通常实现子程序的调用过程有 2 种情况。

    一种是子程序中不会嵌套子程序,那么就不需要将 R14 的内容保护,可以直接将 R14
    的内容送给 PC,实现程序的跳转。只要执行下列的任何一条指令即可。
    MOV PC,LR
    BX LR

    另一种是子程序中嵌套子程序,那么就要对 R14 寄存器和其他寄存器的内容进行保护,
    一般在子程序的入口,使用“入栈”操作指令将要保护的寄存器压入堆栈,如下列的入栈操
    作指令:
    STMFD SP!,{< registers>,LR}

    在子程序结束时,使用“出栈”操作指令将堆栈中的内容弹出到对应的寄存器,就可将
    返回地址从堆栈中复制到 PC 中,即可实现程序的返回。如下列的出栈操作指令:
    LDMFD SP!,{< registers>,PC}

    ② 对异常处理返回地址的保存
    在 ARM 处理器中有 5 种异常,异常事件的发生是随机的,是可以相互嵌套的,为了加
    快处理速度,设计了 5 个专用寄存器存放异常处理程序的返回地址。当异常发生时,会自动
    的保存程序计数器 PC 的内容。保存操作如下:

    • 系统复位或者软中断发生时,将当前的 PC 复制到 R14_svc 寄存器中;
    • 存储器非法访问时发生的异常,将当前的 PC 复制到 R14_abt 寄存器中;
    • 解码器解码后确认是未定义指令时的异常,将当前的 PC 复制到 R14_und 寄存器中;
    • IRQ 中断发生时,将当前的 PC 复制到 R14_irq 寄存器中;
    • 快速中断 FIQ 发生时,将当前的 PC 复制到 R14_fiq 寄存器中;
  4. 程序计数器 PC
    在 ARM 处理器中 R15 寄存器就是 CPU 中的程序计数器,R15 中的内容总是指向正在
    “取指”指令的地址
    。由于 ARM 指令是字对齐的,R15 最低两位 bit[1:0]总为 0,bit[31:2]
    用于保存 ARM 指令地址;而 Thumb 指令是半字对齐的,R15 最低位 bit0 总为 0,bit[31:1]
    用于保存 Thumb 指令地址;也就是说,在 ARM 状态下,PC 值的最低两位总是 0,在 Thumb
    状态下,PC 值的最低位总是 0。在程序设计中,R15 虽然可以用作通用寄存器,但是有一
    些指令在使用 R15 时有一些特殊限制,若不注意,执行的结果将是不可预料的。

    由于 ARM7 体系结构采用了 3 级流水线技术,对于 ARM 指令集而言,PC 总是指向当
    前指令的下两条指令的地址,PC 值一般为当前指令地址值加 8 个字节。但使用 STR 或 STM
    指令保存 R15 时,R15 保存的值可能是当前指令地址加 8 字节,或者是当前指令地址加 12
    字节(或别的数据),偏移量究竟是 8 还是 12(或是其他数)取决于 ARM 芯片的设计。对
    于某个具体的芯片,它是个常量。

    当执行一条写 R15 的指令时,写入 R15 的值被当成一个指令的地址,程序从这个地址
    处继续执行,因此执行写入 R15 的指令相当于程序执行一次跳转。由于 ARM 指令是字对齐
    的,写入 R15 值的最低两位 bit[1:0]必须是 0b00,否则结果将不可预测。在 Thumb 指令集
    中,指令是半字对齐的,写入 R15 地址值的最低位必须是 0,否则难于预测执行结果。

  5. 状态寄存器
    ARM7 中有一个当前程序状态寄存器 CPSR(Current Program Status Register),CPSR 可
    在任何运行模式下被访问,它包括条件标志位、中断禁止位、当前处理器模式标志位,以及
    其他一些相关的控制和状态位。ARM 内核就是通过使用 CPSR 来监视和控制内部操作的。

    每一种异常运行模式都有一个专用的物理状态寄存器,称为备份程序状态寄存器 SPSR
    (Saved Program Status Register),它们分别为 SPSR_svc、SPSR _irq、SPSR _fiq、SPSR _abt、SPSR _und。当异常发生时,SPSR 用于保存 CPSR 的当前值,从异常退出时则可由 SPSR 来恢复 CPSR。

    CPSR 与 SPSR 相互间的关系:

    • 当一个特定的异常中断发生时,将 CPSR 的当前值保持到相应异常模式下的 SPSR
      寄存器中,然后设置 CPSR 为相应的异常模式;
    • 从异常中断程序退出返回时,可通过保持在 SPSR 中的值来恢复 CPSR 值。

    由于用户模式和系统模式不属于异常模式,他们没有 SPSR,当在这两种模式下访问
    SPSR,结果是未知的。

2.5.2 Thumb 状态下的寄存器组织

1. 各种模式下的寄存器
Thumb 状态下的寄存器集是 ARM 状态下寄存器集的一个子集,程序可以直接访问:

  • 8 个通用寄存器(R0~R7);
  • 程序计数器 PC(R15);
  • 堆栈指针 SP(R13);
  • 连接寄存器 LR(R14)
  • 程序状态寄存器 CPSR。

每种特权模式都有一组 SP、LR 和 SPSR。Thumb 状态下的寄存器组织详细情况见表 2-5。

第二章 ARM 技术及体系结构【嵌入式系统】,# 嵌入式系统,arm开发,嵌入式操作系统

在Thumb 指令集中,寄存器 R0~R7 是保护数据或地址值的通用寄存器,对应任何处
理器模式,它们中的每一个都对应于 32 位物理寄存器。是完全通用的寄存器,不会被处理
器作为特殊的用途,并且可用于任何使用通用寄存器的指令。
堆栈指针寄存器SP,与ARM状态下的R13寄存器相同,Thumb指令集使用传统的PUSH
和 POP 指令,实现堆栈操作,它们以“满递减堆栈”的方式来实现,详见 2.5.1 小节“堆栈
指针寄存器 SP”部分。
链接寄存器 LR,与 ARM 状态下的 R14 寄存器相同,详见 2.5.1 小节“连接寄存器 LR”
部分。
状态寄存器 CPSR 和 SPSR 与 ARM 状态下的状态寄存器寄存器相同,使用方法相似,
详见 2.5.1 小节“状态寄存器”部分。

2. Thumb 状态下寄存器与 ARM 状态下寄存器的关系

  • Thumb 状态下 R0~R7 和 ARM 状态下的 R0~R7 是相同的。
  • Thumb 状态下和 ARM 状态下的 CPSR 和所有的 SPSR 是相同的。由于 Thumb
    指令集不包含 MSR 和 MRS 指令,如果用户需要修改 CPSR 和 SPSR 的标志位,
    可以使用 BX 指令切换到 ARM 状态,在 ARM 状态下使用 MSR 和 MRS 指令进
    行修改。
  • Thumb 状态下的 SP 对应于 ARM 状态下的 R13。
  • Thumb 状态下的 LR 对应于 ARM 状态下的 R14。
  • Thumb 状态下的程序计数器 PC 对应于 ARM 状态下 R15

Thumb 状态寄存器在 ARM 状态下的映射应关系如图 2.15 所示

第二章 ARM 技术及体系结构【嵌入式系统】,# 嵌入式系统,arm开发,嵌入式操作系统
在图 2.15 中的 R0~R7 为低端寄存器,R8~R12 为高端寄存器,在 Thumb 状态下,高
端寄存器是不能访问。如果有异常中断出现,那么处理器就会自动切换到 ARM 状态去进行
异常处理,当异常处理完毕返回时,处理器又会自动切换返回到 Thumb 状态。

2.5.3 程序状态寄存器

ARM 处理器的程序状态寄存器包含 1 个当前程序状态寄存器 CPSR 和 5 个仅供异常处
理程序使用的备份程序状态寄存器SPSR。其中CPSR可以在任何处理器模式下被访问,SPSR
是每一种异常模式下专用的寄存器,当异常发生时,这个寄存器保存 CPSR 的内容,在异常
退出时,可以用 SPSR 中保存的值来恢复 CPSR,图 2.16 给出了程序状态寄存器 PSR 的基
本格式,具体含义如下:

  • 4 个条件代码标志(负标志 N、零标志 Z、进位标志 C 和溢出标志 V );
  • 2 个中断禁止位(IRQ 禁止与 FIQ 禁止);
  • 5 个对当前处理器模式进行编码的位(M[4:0]);
  • 1 个用于指示当前执行指令的状态位(ARM 指令还是 Thumb 指令)。

32 位的 PSR 分为四个域:控制域、扩展域、状态域和标志域。
第二章 ARM 技术及体系结构【嵌入式系统】,# 嵌入式系统,arm开发,嵌入式操作系统

  1. 标志域(PSR[31:24])
    在 ARM7 中标志域只使用了四位:N 标志、Z 标志、C 标志和 V 标志,它们都是条件
    代码标志,可以由算术或逻辑操作来设置这些位,这些标志还可通过 MSR 和 LDM 指令进
    行设置,ARM 处理器对这些位进行测试以决定是否执行一条指令,这样就可以实现条件执
    行。

    各标志位的含义如下:

    • 负标志 N:N的取值为当前指令运算结果的最高位 bit[31]的值,当 N=1 时表示运算结果为负数,当 N=0 时表示运算结果为正数或零;
    • 零标志 Z:Z=1 表示运算结果是零,Z=0 表示运算结果不为零;进位或借位标志 C:对于加法指令(包括比较指令 CMN),当运算结果产生进位时,则 C=1,其他情况,C=0;对于减法指令(包括比较指令 CMP),当运算结果产生借位时,则 C=0,其他情况,C=1;
    • 溢出标志 V:对于加减运算指令,当操作数和运算结果按照补码进行运算时,如果运算结果超出了规定的数据表示范围,即产生了溢出时,则 V=1,其他情况 V=0;

    在 ARM 状态中,所有指令都可按条件执行,在 Thumb 状态中,只有分支指令可条件
    执行。

  2. 状态域(PSR[23:16])
    ARM7 版本中未使用。

  3. 扩展域(PSR[15:8])
    ARM7 版本中未使用。

  4. 控制域(PSR[7:0])
    PSR 的最低 8 位为控制位,它们分别是:

    • 中断禁止标志位;
    • 处理器状态位;
    • 处理器模式位。

    处理器在特权模式下,可修改这些位,或者发生异常时处理器自动改变这些位。

    ① 中断禁止控制位 I 和 F
    标志位 I 和 F 都是中断禁止标志位,用来使能或禁止 ARM 的 2 种外部中断,在 2.3.1
    小节的图 2.10 中 ARM 核有 2 个引脚 nFIQ 和 nIRQ 分别对应 F 和 I 标志位,对通过 nFIQ 和
    nIRQ 进入的外部中断实现使能或禁止。
    当控制位 I 置位时,IRQ 中断被禁止;
    当控制位 F 置位时,FIQ 中断被禁止。

    ② 状态控制位 T
    处理器的状态控制位 T,控制处理器按照 ARM 指令集运行,还是按照 Thumb 指令集运
    行,要注意对状态位的修改只能使用 BX 指令,不要在特权模式下对状态位修改,否则处理
    器运行不可预知。
    当控制位 T 置位时,处理器正在 Thumb 状态下运行;
    当控制位 T 清零时,处理器正在 ARM 状态下运行。

    ③ 模式控制位 M[4:0]
    M[4:0]是模式控制位,这些位决定处理器的工作模式,不是所有模式位的组合都定义了
    有效的处理器模式,因此不要使用没有定义的 M[4:0]编码。

    7 种模式定义如下:

    • M[4:0] = 0b10000:用户模式;
    • M[4:0] = 0b10001:快速中断模式;
    • M[4:0] = 0b10010:中断模式;
    • M[4:0] = 0b10011:管理模式;
    • M[4:0] = 0b10111:中止模式;
    • M[4:0] = 0b11011:未定义模式;
    • M[4:0] = 0b11111:系统模式。

    如果将非法的值写入 M[4:0]中,处理器将进入一个无法恢复的模式。

2.6 ARM 体系的异常处理

计算机在执行正常程序过程中,当发生某种异常事件或某种外部请求时,处理器就暂停
执行当前的程序,进入异常模式,去执行异常事件或某种外部请求的处理操作。就是说只要
正常的程序流被暂时中止,处理器就进入异常模式。例如在用户模式下执行程序时,当外设
向处理器内核发出中断请求,处理器便从用户模式切换到异常中断模式。如果同时发生多个
异常,那么将按照固定的优先顺序来处理异常。

2.6.1异常优先级

当多个异常同时发生时一个固定的优先级系统决定它们被处理的顺序,在 ARM 体系结
构中,异常优先级由高到低的排列次序如表 2-6 所示。

第二章 ARM 技术及体系结构【嵌入式系统】,# 嵌入式系统,arm开发,嵌入式操作系统

在异常优先级中,未定义指令和软件中断 SWI 之间是互斥的,不会同时发生,因此它
们的优先级是相同的。
在一个数据中止处理程序中,由于没有禁止 FIQ 异常中断,所以可以发生 FIQ 异常中
断。当 FIQ 使能,并且在发生 FIQ 的同时产生了一个数据中止时,ARM7 内核进入数据中
止处理程序,然后立即转到 FIQ 向量。当 FIQ 服务完成之后,恢复执行数据中止处理程序。

2.6.2 异常向量表

在异常处理过程中,为了加快异常服务的响应速度,异常处理程序的入口地址一般采用
硬件实现,处理器规定了异常处理程序入口的地址区间,并且规定了地址的存放顺序,一般
称为异常向量表
,ARM 处理器异常向量表见表 2-7 所示。

第二章 ARM 技术及体系结构【嵌入式系统】,# 嵌入式系统,arm开发,嵌入式操作系统
在表 2-7 中,I 和 F 表示先前的值,每一种处理模式都有一个相关的中断向量,当一个
异常发生时,ARM 处理器将自动改变模式,而程序计数器 PC 将会被强行指向异常向量,
异常向量表从地址 0 的复位向量开始,然后每 4 个字节就是一个异常向量。
在异常向量表中,有一个保留的异常入口,其位于 0 x0000 0014 地址处,这个位置在早
期的 ARM 结构中会被用到,而在 ARM7 中是保留的,以确保软件能与不同的 ARM 结构兼
容,然而,在有些 ARM7 处理器芯片中,这 4 个字节已经有了非常特殊的用途。

2.6.3 异常中断的进入与退出

  1. 进入异常
    程序代码正常运行时发生了异常,导致模式切换,这时 ARM 内核将自动做如下处理:

    • 将异常处理程序的返回地址保存到相应异常模式下的 LR 中;
    • 将 CPSR 的当前值保存到相应异常模式下的 SPSR 中;
    • 设置 CPSR 为相应的异常模式;
    • 设置 PC 为相应异常处理程序的中断入口向量地址,跳转到相应的异常中断处理程
      序执行;

    ARM7 内核在中断异常时置位中断禁止控制位,这样可防止不受控制的异常嵌套,异常总是在 ARM 状态中进行处理,当处理器处于 Thumb 状态时发生了异常,在异常向量地址装入 PC 时会自动切换到 ARM 状态。

  2. 退出异常
    当异常处理程序结束时,异常处理程序必须:

    • 返回到发生异常中断的指令的下一条指令处执行,即就是说将 LR 中的值减去偏移
      量后复制到 PC 中;
    • 将 SPSR 的值复制回 CPSR;
    • 清零在入口处置位的中断禁止标志。
    • 恢复 CPSR 的动作会将 T, F 和 I 位自动恢复为异常发生前的值
  3. 异常入口/出口指令
    表 2-8 所示为异常返回地址值以及退出异常处理程序所推荐使用的指令。
    第二章 ARM 技术及体系结构【嵌入式系统】,# 嵌入式系统,arm开发,嵌入式操作系统

2.6.4 ARM 中的异常处理

  1. 复位异常
    在 2.3.1 小节的图 2.10 中,当 nRESET 信号被拉低时,ARM 处理器放弃正在执行的指
    令,等到 nRESET 信号再次变高时,处理器执行一下操作:

    • 强制 M[4:0]变为 b10011,系统进入管理模式;
    • 将 CPSR 中的标志位 I 和 F 置位,IRQ 与 FIQ 中断被禁止;
    • 将 CPSR 中的标志位 T 清零,处理器处于 ARM 状态;
    • 强制 PC 从地址 0x00 开始对下一条指令进行取指;
    • 返回到 ARM 状态并恢复执行。

    在系统复位后,除 PC 和 CPSR 之外的所有寄存器的值都是随机的。处理器进入管理
    模式,对系统进行初始化。

  2. 中断请求异常 IRQ
    IRQ 异常属于正常的中断请求,可通过对处理器的 nIRQ 引脚输入低电平产生,IRQ 的
    优先级低于 FIQ,当程序执行进入 FIQ 异常时,IRQ 可能被屏蔽。
    在特权模式下,若将 CPSR 的 I 位置为 1,则会禁止 IRQ 中断,若将 CPSR 的 I 位清零,
    处理器会在指令执行结束之前检查 IRQ 的输入。
    IRQ 异常的处理流程如下:
    ① 进入 IRQ 异常模式,
    程序运行在用户模式下,当一个 IRQ 异常中断发生时,内核切换到“中断模式”,并自
    动的做如下处理:

    • 将异常处理程序的返回地址保存到异常模式下的 R14(R14_irq)中;
    • 用户模式的 CPSR 被保存到中断异常模式 SPSR_irq 中。
    • 修改 CPSR,将 I 置 1,禁止新的 IRQ 中断产生,但不改变 F 值,不限制 FIQ
      中断发生,清零 T 标志位,进入 ARM 状态,修改模式位,设置为 IRQ 模式。
      将 IRQ 异常中断入口向量地址 0x00000018 送入 PC
      在 IRQ 模式下,用户模式的 R13 和 R14 将不能操作,而 R13_irq 和 R14_irq
      可以操作,即 R13_irq 保存 IRQ 模式下的地址指针,R14_irq 保存了“IRQ 中
      断返回地址+4”(见 2.2.2 小结)。

    ② 退出 IRQ 异常模式
    中断服务程序执行完毕后,使用一条指令将返回地址送入 PC,即可实现 IRQ 中断返回,
    在返回过程中处理器会自动将 SPSR_irq 中的内容复制到 CPSR,恢复中断前的处理器状态。
    由于流水线的特性,将 R14_irq 指向的地址减去一个偏移量后存入 R15(PC),IRQ 一般使用
    指令为:
    SUBS PC,LR,#4 ;PC= R14_irq-4

    该指令将寄存器 R14_irq 的值减去 4 后,复制到程序计数器 PC 中,从而实现从异常处
    理程序中的返回。由于 ARM7 采用三级流水线技术,而处理器是在当前指令执行结束前检
    测 nIRQ 中断请求信号,如果有中断请求将立即保存 PC 的值到 R14 中,此时 PC 的值是当
    前指令地址的值加 8(在 ARM 模式下),即下两条指令的地址,因此,异常返回的地址值应该是 PC=R14-4,如图 2.17 所示。
    第二章 ARM 技术及体系结构【嵌入式系统】,# 嵌入式系统,arm开发,嵌入式操作系统

  3. 快速中断请求异常 FIQ
    快速中断请求(FIQ)适用于对一个突发事件的快速响应,这得益于在 ARM 状态中,快
    中断模式有 8 个专用的寄存器可用来满足寄存器保护的需要(这可以加速上下文切换的速
    度)。

    当 CPSR 中相应的 F 位被清零时,快速中断就被使能,外部信号将内核中的 nFIQ 信号
    拉低可实现外部 FIQ 异常,处理器进入 FIQ 异常处理之后,FIQ 和 IRQ 中断同时被禁止,
    防止外部中断源再次发生中断,如果允许中断嵌套,则可以在快速中断服务程序中重新使能
    FIQ 和 IRQ 请求,也就是将 CPSR 中相应的 F 位和 I 位清零。
    可由外部通过对处理器上的 nFIQ 引脚输入低电平产生 FIQ,ARM 处理器规定了 FIQ
    异常中断的入口地址为0x001c,共4 个字节,不管 FIQ 异常入口是来自ARM状态还是Thumb
    状态,FIQ 处理程序都会通过执行下面的指令从中断服务程序中返回。
    SUBS PC,LR,#4 ;PC= R14_fiq-4

    该指令将寄存器 R14_fiq 的值减去 4 后,复制到程序计数器 PC 中,从而实现从异常处
    理程序中的返回,同时将 SPSR_ fiq 寄存器的内容复制到当前程序状态寄存器 CPSR 中。

    在特权模式中,可以通过置位CPSR中的F位来禁止FIQ异常。当F控制位清零时,ARM
    处理器在每条指令结束时检查 nFIQ 引脚(见 2.3.1 小节的图 2.10)的电平。FIQ 异常进入与
    退出的流程与 IRQ 类似。

  4. SWI 软中断异常
    软件中断异常(SWI)用于进入管理模式,通常用于请求一个特定的管理函数,通过 SWI处理程序读取指令中的操作数以提取 SWI 函数编号。SWI 处理程序通过执行下面的指令返回:
    MOVS PC,LR ;PC= R14_svc
    这条指令的动作恢复了 PC 和 CPSR,并返回到 SWI 之后的指令执行。

  5. 未定义指令异常
    未定义指令异常是内部异常中断,当 ARM 处理器遇到一条自己和系统内部任何协处理
    器都无法执行的指令时,就会发生未定义指令异常,从而进入中断处理程序,采用这种机制,
    可以通过软件仿真扩展 ARM 或 Thumb 指令集。

    在仿真未定义指令后,处理器执行以下返回指令:
    MOVS PC,LR ;PC= R14_und
    以上指令恢复 PC(从 R14_und)和 CPSR(从 SPSR_und)的值,并返回到未定义指令
    后的下一条指令执行。

  6. 中止异常
    中止表示当前对存储器的访问不能被完成,这是由外部 ABORT 输入信号引起的异常中
    断。中止异常包括两种类型:

    • 预取指中止:由程序存储器引起的中止异常;
    • 数据中止:由数据存储器引起的中止异常。

    ① 预取指中止异常
    当发生预取指中止时,ARM 内核将预取的指令标记为无效,但在指令到达流水线的执
    行阶段时才进入异常。如果指令在流水线中因为发生分支而没有被执行,中止将不会发生。

    在处理中止的原因之后,不管处于哪种处理器操作状态,处理程序都会执行下面的指令
    恢复 PC 和 CPSR 的内容,并重试被中止的指令:
    SUBS PC,LR,#4 ;PC= R14_abt-4

    ② 数据中止异常
    当发生数据中止异常时,异常会在“导致异常的指令”执行后的下一条指令发生。在这种
    情况下,理想的状况是进入数据中止异常的 ISR,然后在内存中挑选出问题,再重新执行导
    致异常的指令。

    在修复产生中止的原因后,不管处于哪种处理器操作状态,处理程序都必须执行下面的
    返回指令 :
    SUBS PC,R14_abt,#8 ;PC= R14_abt-8
    这条指令恢复 PC(从 R14_abt)和 CPSR(从 SPSR_abt)的值,将重新执行中止的指
    令。

    中止的机制使得分页的虚拟存储器系统能得以实现,在这样的系统中,处理器允许产生
    仲裁地址。当某一地址的数据无法访问时,存储器管理单元 MMU 通知产生了中止异常。
    中止处理程序完成寻找中止的原因,使请求的数据可以被访问,并重新执行被中止的指令,
    应用程序不必知道可用存储器的数量,也不必知道被中止时所处的状态。

2.6.5 中断延时

中断延时就是系统响应一个中断所需要的时间,即从外部中断请求信号发出到执行对应
的中断服务程序 ISR 的第 1 条指令所需要的时间。在某些系统中如果对中断处理不及时,
系统可能会显得非常迟钝甚至出现系统崩溃的现象,在实时监控系统中,一般对中断延时有
较为严格的要求。那么用户如何计算中断延时,怎么确定系统响应中断的速度,这个问题取
决于以下几个因素:

  • 中断被禁止的最长时间;
  • 比自身更高优先级的异常中断所需要的处理时间;
  • CPU 开始处理中断,进行断点保护、状态设置、进入中断服务程序等所需要的时
    间。
  • 中断程序现场保护及其他要求配置的操作所需要的时间。

通过软件程序设计来缩短中断延迟的方法有:中断优先级和中断嵌套。在一些应用中允
许中断嵌套,就是说 CPU 在执行一个中断服务程序的同时,再次响应一个新的中断,而不
是等待中断处理程序全部完成之后才允许新的中断产生,一旦嵌套的中断服务程序完成之
后,则又回到前一个中断服务程序,对于要求快速响应的中断可以设置更高的优先级,他可
以打断正在执行的低优先级的中断。
例如 FIQ 的中断延时,当 FIQ 使能时,最坏情况下 FIQ 的延迟时间包含:

  • Tsyncmax,请求通过同步器的最长时间,Tsyncmax 为 2 个处理器周期;
  • Tldm,最长指令执行需要的时间(最长指令是 LDM 装载指令),Tldm 在零等待状态系统中的执行时间为 20 个周期;
  • Texc,数据中止异常进入时间,Texc 为 3 个周期;
  • Tfiq,FIQ 进入时间,Tfiq 为 2 个周期。

因此总的延迟时间为 27 个周期,如果 ARM 内核使用 40MHz 的时钟时,中断延时约
为 0.68 微妙,在此时间结束后 ARM7 执行位于 0x001c 处的指令。

2.7 ARM 体系的存储方式

ARM7 处理器采用冯·诺依曼(Von Neumann)结构,指令、数据和 I/O 统一编址(即存
储地址是在同一个地址空间)。其地址空间大小为 4GB,这些字节的单元地址是一个无符号
的 32 位数值,取值范围是 0~232-1,各存储单元地址作为 32 位无符号数,可以进行常规
的整数运算。

采用 ARM 核设计处理器芯片时,一般在处理器核和外部存储器之间设计一个存储器管
理部件,将 ARM 公司的 AMBA 总线接口信号和时序转换为现实的外部总线信号和时序。
ARM 处理器对存储器操作的数据单元包括:字节(8bit)存取、半字(16bit)存取,
字(32bit)存取,由引脚 SIZE[1:0]的编码控制(参见 2.3.1 小节的图 2.10)。

2.7.1 数据存储格式

在 ARM 中,存储地址为 A 的数据存储规则如下:

  • 位于地址 A 的字包含的字节位于地址 A,A+1,A+2 和 A+3;
  • 位于地址 A 的半字包含的字节位于地址 A 和 A+1;
  • 位于地址 A+2 的半字包含的字节位于地址 A+2 和 A+3;
  • 位于地址 A 的字包含的半字位于地址 A 和 A+2。
    但是这样并不能完全定义字、半字和字节之间的映射,存储器系统使用下列 2 种映射机
    制中的一种。

1. 小端存储格式
在小端存储格式中,对于地址为 A 的字单元,其中字节的低位字节到高位字节地址顺
序为 A,A+1,A+2,A+3;对于地址为 A 的半字单元,其中字节的低位字节到高位字节地
址顺序为 A,A+1。也就是说,按照数据的高字节存放在高地址中的顺序进行存储。如图 2.18
中的(a)所示。
第二章 ARM 技术及体系结构【嵌入式系统】,# 嵌入式系统,arm开发,嵌入式操作系统

2. 大端存储格式
在大端存储格式中,对于地址为 A 的字单元,其中字节的低位字节到高位字节地址顺
序为 A+3,A+2,A+1,A;对于地址为 A 的半字单元,其中字节的低位字节到高位字节地
址顺序为 A+1,A。也就是说,按照数据的低字节存放在高地址中的顺序进行存储。如图 2.18
中的(b)所示。

【例 2-2】
ARM 处理器寄存器 R1 中的数据内容为 0x12345678,将其存放到内存地址 0x2000 开始
的内 存单元中 ,分别采用小 端存储格 式和大端存储 格式存放 ,试分析内存 地址
0x2000~0x2003 各字节单元的内容。
解:(1)采用小端存储格式
根据小端存储格式的规定,数据的低位字节存到低地址,高位字节存到高地址的规则,
得到地址0x2000中的字节数为0x78,0x2001中的字节数为0x56,0x2002中的字节数为0x34,
0x2003 中的字节数为 0x12。
(2)采用大端存储格式
根据大端存储格式的规定,数据的低位字节存到高地址,高位字节存到低地址的规则,
得到地址0x2003中的数据为0x78,0x2002中的数据为0x56,0x2001中的数据为0x34,0x2000
中的数据为 0x12。

2.7.2 非对齐的存储器访问

最后

2023-7-3 15:11:04

祝大家逢考必过
点赞收藏关注哦文章来源地址https://www.toymoban.com/news/detail-532749.html

到了这里,关于第二章 ARM 技术及体系结构【嵌入式系统】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构】第二章——线性表(3)

    大家好,很高兴又和大家见面了!!! 在上一篇中,咱们介绍了顺序表的基本概念,以及通过C语言实现顺序表的创建和对表长的修改。今天咱们将详细介绍一下使用C语言实现顺序表的增删改查。接下来,跟我一起来看看今天的内容吧!!! 我们先来回顾一下上一篇的内容,

    2024年02月04日
    浏览(42)
  • 【数据结构】第二章——线性表(1)

    大家好,很高兴又和大家见面啦!!!从今天开始,我们将进入线性表的学习。 线性表是算法题命题的重点。这类算法题实现起来比较容易且代码量较少,但是要求具有最优的性能(时间复杂度、空间复杂度),因此,我们应该牢固掌握线性表的各种基本操作(基于两种存储

    2024年02月03日
    浏览(41)
  • 【笔记】ARM M3-M4权威指南第二章《嵌入式软件开发介绍》

    2.1 ARM微控制器是由哪些构成的 2.2 开始时需要准备什么 2.2.1 开发组件,C 编译器组件产品如下 2.2.2 开发板 2.2.3 调试适配板(Keil – ULINK;IAR-- I-Jet;STM Value Line Discover;JTAG/SW仿真器/在线仿真器(ICE);开源板 – ARM的CMSIC-DAP和Coocox的CoLink) 2.2.4 软件设备驱动 2.2.5 示例(Samp

    2024年04月13日
    浏览(40)
  • ARM 体系结构与汇编语言

    Load/Store 架构,CPU 不能直接处理内存中的数据,需要先将内存中的数据加载到寄存器中才能操作,然后将处理结果存储到内存中。 固定的指令长度、单周期指令。 倾向于使用更多的寄存器来存储数据,而不是使用内存中的堆栈、效率更高。 ARM 有桶型移位寄存器,单周期内可

    2024年02月16日
    浏览(35)
  • 【数据结构】第二章课后练习题——线性结构

    1、线性表是 一个有限序列,可以为空 2、链表中最常用的操作是在最后一个元素之后插入一个元素和删除最后一个元素,则采用 单循环链表 存储方式最节省运算时间 3、若某线性表中最常用的操作实在最后一个元素之后插入一个元素和删除第一个元素,则采用 仅有尾结点的

    2024年02月07日
    浏览(52)
  • JavaWeb高级开发技术第二章答案

    单选题 1、 下列选项中,启动Tomcat的命令startup.bat,放在哪个目录中() 2分 A、A、bin B、B、lib C、C、webapps D、D、work 参考答案 : A 答案说明 : bin目录用于存放Tomcat的可执行文件和脚本文件(扩展名为bat的文件) 2、 下列选项中,修改Tomcat端口号的文件是() 2分 A、A、conf.xm

    2024年02月07日
    浏览(41)
  • SQL Server基础 第二章 表结构管理

    目录 一、数据类型 1,字符类数据类型 2,数值型数据类型 3,日期/时间型数据类型 二、主键(Primary key) 三、默认值 四、唯一键(Unique) 五、自增标识 六、约束 七、外键 数据类型是数据的一种属性,是数据所表示信息的类型。 SQLServer提供了比较多的数据类型供用户使用

    2023年04月22日
    浏览(47)
  • Python基础练习题--第二章 顺序结构

    目录 1007:【例2.1】交换a和B的值 1008:【例2.2】打招呼Hello 1009:【例2.3】购买笔记本 1010:【例2.4】最适宜运动心率 1011:【例2.5】求3个整数的和 1012:练2.1  小明买图书 1013:练2.2  鸡兔同笼 1014:练2.3  求平均分 1015:【例2.6】数字对调 1016:【例2.7】BMI指数 1017:练2.4  与

    2024年02月09日
    浏览(71)
  • ChatGPT技术原理 第二章:自然语言处理基础

    目录 2.1 语言模型 2.3 词嵌入 2.4 注意力机制 2.5 生成式模型

    2024年02月02日
    浏览(34)
  • 数据结构英文习题解析-第二章 链表List

    前言:最近快到FDS考试了,po重刷了一下学校的题目,自己整理了一些解析orz 因为po在自己找解析和学习的过程中非常痛苦,所以在此共享一下我的题目和自己写的解题思路,欢迎各位指出错误~全章节预计会陆续更新,可在专栏查看~ HW2 1. For a sequentially stored linear list of leng

    2024年04月11日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包