ARM7体系结构

ARM7体系结构

ARM7体系结构

  • ARM7体系结构
    • 1. ARM公司简介
    • 2. ARM7TDMI
      • 存储器的字与半字
      • 存储器的存储方式
      • 三级流水线
    • 3.ARM的模块、内核和功能框图
    • 4.ARM处理器状态
      • 处理器状态
    • 5.ARM处理器模式
    • 6.ARM内部寄存器
      • 在Thumb状态各模式下实际访问的寄存器
      • Thumb寄存器在ARM状态寄存器上的映射
    • 7.当前程序状态寄存器
      • 条件代码标志
      • 控制位
          • 中断禁止控制位I和F
          • 处理器状态位T
          • 处理器模式位M0~M4
          • 保留位
    • 8.ARM体系的异常、中断及其向量表
      • 异常简介
      • 异常入口/出口汇总
      • 异常向量表
      • 异常优先级
      • 异常的进入
      • 异常的退出
      • 复位异常
      • 中断请求异常
      • 进入IRQ异常模式
      • 退出IRQ异常模式
      • 快速中断请求异常
      • 未定义的指令异常
      • 中止异常
      • 预取指中止
      • 数据中止
      • 软件中断异常
      • 中断延迟
    • 9.ARM体系的存储系统
      • 地址空间
      • 存储器格式
      • 存储器格式
      • 非对齐的存储器访问

1. ARM公司简介

ARM是Advanced RISC Machines的缩写,它是一家微处理器行业的知名企业,该企业设计了大量高性能、廉价、耗能低的RISC (精简指令集)处理器。

公司的特点是只设计芯片,而不生产。它将技术授权给世界上许多著名的半导体、软件和OEM厂商,并提供服务。

RISC是精简指令集计算机的缩写,其目标是设计出在高时钟频率下单周期执行,简单而有效的指令集。ARM内核采用RISC体系结构,因此具有RISC的结构特点:

  • 具有大量的通用存储器;
  • 独特的装载/保存(load-store)结构;
  • 简单的寻址模式;
  • 统一和固定长度的指令格式。

2. ARM7TDMI

ARM7TDMI是基于ARM体系结构V4版本的低端ARM核。其弥补了ARM6很难在低于5V电压下稳定工作的不足,还增加了后缀所对应的功能:

注意:“ARM核”并非芯片,ARM核与其它部件如RAM、ROM、片内外设组合在一起才能构成现实的芯片。

存储器的字与半字

从偶数地址开始的连续2个字节构成一个半字

以能被4整除的地址开始的连续4个字节构成一个字

ARM指令的长度刚好是一个字,Thumb指令的长度刚好是一个半字

存储器的存储方式

如果一个数据是从偶地址开始的连续存储,那么它就是半字对齐,否则就是非半字对齐;

如果一个数据是以能被4整除的地址开始的连续存储,那么它就是字对齐,否则就是非字对齐。

三级流水线

ARM处理器使用流水线来增加处理器指令流的速度,这样可使几个操作同时进行,并使处理和存储器系统连续操作,能提供0.9MIPS/MHz的指令执行速度。

ARM7TDMI的流水线分3级,分别为:

graph LR
取值-->译码
译码-->执行
  1. 在第1个周期,PC指向指令1,此时指令1进入三级流水线的取指阶段。
  2. 在第2个周期,PC指向指令2,此时指令1进入三级流水线的译码阶段,同时取出指令2。
  3. 在第3个周期,PC指向指令3,此时指令1进入三级流水线的执行阶段,指令2进入译码阶段,取出指令3。
  4. 在第4个周期,指令1执行完成,指令2和指令3流水线推进一级,同时开始指令4的取指处理。

程序计数器R15(PC)总是指向“正在取指”的指令,而不是指向“正在执行”的指令或“正在译码”的指令。

一般来说,人们习惯性约定将“正在执行”的指令作为参考点,则:PC值=当前程序执行位置+8

3.ARM的模块、内核和功能框图

PPT第二章

4.ARM处理器状态

处理器状态

ARM7TDMI处理器内核包含2套指令系统,分别为ARM指令集和Thumb指令,并且各自对应1种处理器的状态:

ARM状态:32位,处理器执行字方式的ARM指令,处理器默认为此状态;

Thumb状态:16位,处理器执行半字方式的Thumb指令。

注意:两个状态之间的切换并不影响处理器模式或寄存器内容。

使用BX指令将ARM内核的操作状态在ARM状态和Thumb状态之间进行切换。

ARM指令集 > Thumb指令集

CODE32
	LDR	R0, =Lable+1  ;跳转地址标号,地址最低位为1,表示切换到Thumb状态
	BX 	R0   ;执行完BX指令,处理器切换到Thumb状态,开始执行Thumb指令
	CODE16
Lable 	MOV 	R1, #12

CODE16
	LDR 	R0, =Lable;  地址最低位为0,表示切换到ARM状态
	BX 	R0;  执行完BX指令,处理器切换到ARM状态,开始执行ARM指令
	CODE32
Lable	MOV 	R1, #10

5.ARM处理器模式

ARM体系结构支持7种处理器模式,分别为:用户模式(usr)快中断模式(fiq)中断模式(irq)管理模式(svc)中止模式(abt)未定义模式(und)系统模式(sys)。这样的好处是可以更好的支持操作系统并提高工作效率。ARM7TDMI完全支持这七种模式。

graph LR
ARM处理器模式-->用户模式
ARM处理器模式-->特权模式
特权模式-->系统模式
特权模式-->异常模式
异常模式-->快中断模式
异常模式-->管理模式
异常模式-->中止模式
异常模式-->未定义模式
异常模式-->中断模式

除用户模式外,其它模式均为特权模式。ARM内部寄存器和一些片内外设在硬件设计上只允许(或者可选为只允许)特权模式下访问。此外,特权模式可以自由的切换处理器模式,而用户模式不能直接切换到别的模式。

用户模式,系统模式都不能由异常进入,想要进入必须修改CPSR,而且它们使用完全相同的寄存器组。系统模式是特权模式,不受用户模式的限制。操作系统在该模式下访问用户模式的寄存器就比较方便,而且操作系统的一些特权任务可以使用这个模式访问一些受控的资源。

这五种模式称为异常模式。它们除了可以通过程序切换进入外,也可以由特定的异常进入。当特定的异常出现时,处理器进入相应的模式。每种异常模式都有一些独立的寄存器,以避免异常退出时用户模式的状态不可靠。

6.ARM内部寄存器

在ARM处理器内部共有37个用户可访问的寄存器,分别为31个通用32位寄存器和6个状态寄存器

ARM处理器共有7种不同的处理器模式,每种模式都有一组相应的寄存器组,最多可以18个活动的寄存器。

用户模式

通用32位寄存器 R0 - R15

状态寄存器 CPSR

系统模式

通用32位寄存器 R0 - R15

状态寄存器 CPSR

管理模式

通用32位寄存器 R0 - R12  R13_svc  R14_svc  R15

状态寄存器 CPSR  SPSR_svc

中止模式

通用32位寄存器 R0 - R12  R13_abt  R14_abt  R15

状态寄存器 CPSR  SPSR_abt

未定义模式

通用32位寄存器 R0 - R12  R13_und  R14_und  R15

状态寄存器 CPSR  SPSR_und

中断模式

通用32位寄存器 R0 - R12  R13_irq  R14_irq  R15

状态寄存器 CPSR  SPSR_irq

快中断模式

通用32位寄存器 R0-R7  R8_fiq  R9_fiq  R10_fiq  R11_fiq  R12_fiq  R13_fiq  R14_fiq  R15
状态寄存器 CPSR  SPSR_fiq

寄存器R0~R7为未分组的通用寄存器,它们在任何处理器模式都对应于相同的32位物理寄存器。

寄存器R0~R7为未分组的通用寄存器,它们在任何处理器模式都对应于相同的32位物理寄存器。

寄存器R8~R12有两个分组的物理寄存器。一个用于除FIQ模式之外的所有寄存器模式,另一个用于FIQ模式。

寄存器R13、R14分别有6个分组的物理寄存器。1个用于用户和系统模式,其余5个分别用于5种异常模式。

寄存器R13通常作为堆栈指针(SP),用于保存待使用的寄存器的内容。

寄存器R14称为链接寄存器(LR),在结构上有两个特殊功能:当使用BL指令调用子程序时,返回地址将自动存入R14中;当发生异常时,将R14对应的异常模式版本设置为异常返回地址(有些异常有一个小的固定偏移量)。

寄存器R15称为程序计数器(PC),它指向正在“取指”的指令。

寄存器CPSR为当前程序状态寄存器,在异常模式中,另外一个寄存器“程序状态保存寄存器(SPSR)”可以被访问。每种异常都有自己的SPSR,在进入异常时它保存CPSR的当前值,异常退出时可通过它恢复CPSR。

在发生FIQ中断后,处理器不必为保护寄存器而浪费时间,从而加速了FIQ的处理速度。

在Thumb状态各模式下实际访问的寄存器

Thumb状态寄存器集是ARM状态集的子集,程序员可以直接访问的寄存器为:

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

在汇编语言中寄存器R0~R7为通用寄存器,对于任何处理器模式,它们中的每一个都对应于相同的32为物理寄存器。

堆栈指针SP对应ARM状态的寄存器R13。每个异常模式都有其自身的SP分组版本,SP通常指向各异常模式所专用的堆栈。

链接寄存器LR对应ARM状态寄存器R14。

注意:在发生异常时,处理器自动进入ARM状态。

Thumb寄存器在ARM状态寄存器上的映射

Thumb状态R0~R7与ARM状态R0~R7相同;

Thumb状态SP映射到ARM状态R13;

Thumb状态LR映射到ARM状态R14;

Thumb状态PC映射到ARM状态R15(PC);

Thumb状态CPSR(无SPSR)与ARM状态CPSR相同。

R0-R7为低端寄存器  R8-R12为高端寄存器

在Thumb状态中,高端寄存器的访问是受到限制的,只有MOV、CMP和ADD指令可以对其访问,可以用于数据的快速暂存。

7.当前程序状态寄存器

ARM内核包含1个CPSR和5个仅供异常处理程序使用的SPSR。CPSR反映当前处理器的状态,其包含:

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

条件代码标志

各标志位的含义如下:

  • 负标志N:运算结果的第31位值,记录标志设置操作的结果;
  • 零标志Z:如果标志设置的操作为0,则置位;
  • 进位标志C:记录无符号加法溢出,减法无借位,循环移位;
  • 溢出标志V:记录标志设置操作的有符号溢出。

控制位

中断禁止控制位I和F

当控制位I置位时,IRQ中断被禁止;

当控制位F置位时,FIQ中断被禁止。

处理器状态位T

当控制位T置位时,处理器正在Thumb状态下运行

控制位T清零时,处理器正在ARM状态下运行

绝对不要强制改变CPSR寄存器中的控制位T。如果这样做,处理器将进入一个无法预测的状态。

处理器模式位M0~M4

10000  用户

10001  快速中断

10010  中断

10011  管理

10111  中止

11011  未定义

11111  系统

不是所有模式位的组合都定义了有效的处理器模式,如果将非法值写入M[4:0]中,处理器将进入一个无法恢复的模式。

保留位

CPSR中的保留位被保留将来使用。当改变CPSR标志和控制位时,请确认没有改变这些保留位。

另外,请确保您的程序不依赖于包含特定值的保留位,因为将来的处理器可能会将这些位设置为1或者0。

8.ARM体系的异常、中断及其向量表

异常简介

只要正常的程序流被暂时中止,处理器就进入异常模式。例如在用户模式下执行程序时,当外设向处理器内核发出中断请求导致内核从用户模式切换到异常中断模式。

如果同时发生两个或更多异常,那么将按照固定的顺序来处理异常。

异常入口/出口汇总

下表所示为异常返回地址值以及退出异常处理程序所推荐使用的指令。

异常或入口 返回指令 返回地址
SWI MOVS PC,R14_svc R14
未定义的指令 MOVS PC,R14_und R14
预取中止 SUBS PC,R14_abt,#4 R14
快速中断 SUBS PC,R14_fiq,#4 R14-4
中断 SUBS PC,R14_irq,#4 R14-4
数据中止 SUBS PC,R14_abt,#8 R14-8
复位 ——

注意: “MOVS PC,R14_svc”是指在管理模式执行MOVS PC,R14 指令,同样类似的指令还有“MOVS PC,R14_und”、“SUBS PC,R14_abt,#4”等。

异常向量表

地址 异常 进入时的模式 进入时I的状态 进入时F的状态
0x00000000 复位 管理 禁止 禁止
0x00000004 未定义指令 未定义 I F
0x00000008 软件中断异常 管理 禁止 F
0x0000000C 中止(预取) 中止 I F
0x00000010 中止(数据) 中止 I F
0x00000014 保留 保留 —— ——
0x00000018 IRQ 中断 禁止 F
0x0000001C FIQ 快速中断 禁止 禁止

异常优先级

当多个异常同时发生时,一个固定的优先级决定系统处理它们的顺序

优先级 异常
1 复位
2 数据中止
3 FIQ
4 IRQ
5 预取指中止
6 未定义指令中止
6 软件中断异常

异常的进入

当一个异常导致模式切换时,内核自动的做如下处理:

  1. 将异常处理程序的返回地址(加固定的偏移量)保存到相应异常模式下的LR;
  2. 将CPSR的当前值保存到相应异常模式下的SPSR;
  3. 设置CPSR为相应的异常模式;
  4. 设置PC为相应异常处理程序的中断入口向量地址,跳转到相应的异常中断处理程序执行;

异常的退出

当异常处理程序结束时,异常处理程序必须:

  1. 返回到发生异常中断的指令的下一条指令处执行,即就是说将LR中的值减去偏移量后移入PC;
  2. 将SPSR的值复制回CPSR;
  3. 清零在入口处置位的中断禁止标志。

复位异常

当nRESET信号被拉低时,ARM处理器放弃正在执行的指令,等到nRESET信号再次变高时,处理器执行一下操作:

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

中断请求异常

只有当CPSR中相应的中断屏蔽位被清除时,才可能发生IRQ异常,中断请求(IRQ)异常由一个nIRQ输入端的低电平所产生的正常中断。
**注:**中断异常产生时,中断异常模式下的R14保存的是PC的值。

三级流水线结构的指令执行顺序中,

指令1的执行不会中断;
异常程序结束时返回到指令2;
进入中断服务程序时,指令3地址被保存在R14中。

所有R14存放的是指令3的取值的地址(PC)

进入IRQ异常模式

程序运行在用户模式下,当一个IRQ异常中断发生时,内核切换到“中断模式”,并自动的做如下处理

  1. 将异常处理程序的返回地址保存到异常模式下的R14(R14_irq)中。
  2. 用户模式的CPSR被保存到新的IRQ中断异常模式SPSR_irq中。
  3. 修改CPSR,禁止新的IRQ中断产生,进入ARM状态,设置为IRQ模式。
  4. 设置IRQ模式下的PC为IRQ异常处理程序的中断入口向量地址0x00000018。
  5. 将IRQ中断异常模式的栈顶指针保存到R13_irq中,之后软件处理程序调用中断服务程序为中断源服务。

退出IRQ异常模式

中断服务程序执行完毕后,系统将通过以下几步软件操作返回用户模式:

  1. 从R13_irq中获取IRQ中断异常模式的栈顶指针。
  2. 将SPSR_irq中的内容复制到CPSR。
  3. 由于流水线的特性,将R14_irq指向的地址减去一个偏移量后存入R15(PC),实现指令为:
SUBS    PC,R14_irq,#4

快速中断请求异常

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

不管异常入口是来自ARM状态还是Thumb状态,FIQ处理程序都会通过执行下面的指令从中断返回:

SUBS    PC,R14_fiq,#4

在一个特权模式中,可以通过置位CPSR中的F位来禁止FIQ异常。

未定义的指令异常

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

在仿真失败的指令后,捕获处理器执行下面的指令:

MOVS    PC,R14_und

中止异常

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

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

预取指中止

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

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

SUBS    PC,R14_abt,#4

数据中止

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

在修复产生中止的原因后,不管处于哪种处理器操作状态,处理程序都必须执行下面的返回指令 :

SUBS    PC,R14_abt,#8

软件中断异常

软件中断异常(SWI)用于进入管理模式,通常用于请求一个特定的管理函数。SWI处理程序通过执行下面的指令返回:

MOVS    PC,R14_svc

这个动作恢复了PC和CPSR并返回到SWI之后的指令。SWI处理程序读取操作码以提取SWI函数编号。

中断延迟

中断延迟即从外部中断请求信号发出到执行对应的中断服务程序ISR的第1条指令所需要的时间。

通过软件程序设计来缩短中断延迟的方法有:中断优先级和中断嵌套。

9.ARM体系的存储系统

ARM处理器采用冯·诺依曼(Von Neumann)结构,指令、数据和I/O统一编址(即存在同一个空间)。只有装载、保存和交换指令可访问存储器中的数据

ARM芯片一般在处理器核和外部存储器之间有一个存储器管理部件将局部总线的信号和时序转换为现实的外部总线信号和时序。

地址空间

ARM结构使用单个平面的232个8位字节地址空间。地址空间可以看作是包含230个32位字,或231个16位半字。如果地址向上或向下溢出地址空间,通常会发生翻转。

**注意:**如果在取指操作时地址发生溢出,只要没有执行预取的无效指令,就不会导致异常。

存储器格式

地址空间的规则要求字地址A:

  • 位于地址A的字包含的字节位于地址A,A+1,A+2和A+3;
  • 位于地址A的半字包含的字节位于地址A和A+1;
  • 位于地址A+2的半字包含的字节位于地址A+2和A+3;
  • 位于地址A的字包含的半字位于地址A和A+2;

存储器格式

存储器系统有两种映射机制:

小端存储器系统: 在小端格式中,数据的高字节存放在高地址中。

大端存储器系统: 在大端格式中,数据的高字节存放在低地址中。

非对齐的存储器访问

ARM结构通常希望所有的存储器访问都合理的对齐,具体来说就是字访问的地址通常是字对齐的,而半字访问使用的地址是半字对齐的。不按这种方式对齐的存储器访问称为非对齐的存储器访问。

将一个非字(半字)对齐的地址写入ARM(Thumb)状态的R15寄存器,将引起非对齐的指令取指。

在一个非字(半字)对齐的地址读写一个字(半字),将引起非对齐的数据访问:

你可能感兴趣的:(嵌入式,嵌入式)