ARM的异常响应过程

其他内容不再赘述,现在粘贴三张需要的表


表1                异常类型,优先级及向量地址

异常类型 优先级 工作模式 异常向量地址 说明
复位 RESET 1 管理模式 0x00000000 当RESET引脚有效时进入该异常
未定义的指令 UND 6 未定义指令的终止模式 0x00000004 协处理器认为当前指令未定义时产生指令异常。可利用它模拟协处理器操作

软件中断 SWI

6 管理模式 0x00000008 用户定义的中断指令,可用于用户模式下的程序调用特权操作
指令预取中止 PABT 5 中止模式 0x0000000C 当预取指令地址不存在或该地址不允许当前指令访问时,执行指令产生的异常
数据访问中止 DABT 2 中止模式 0x00000010 当数据访问指令的目标地址不存在或该地址不允许当前指令访问时,执行指令产生异常
外部中断请求 IRQ 4 外部中断模式 0x00000018 有外部中断时发生得异常
快速中断请求 FIQ 3 快速中断模式 0x0000001C 有快速中断请求时发生得异常

表2                           ARM状态下的寄存器组织(Thumb下是其一部分,就不列了)

寄存器\模式 用户模式 系统模式 管理模式 中止模式 未定义模式 外部中断模式 快速中断模式

通用寄存器

--

共31个

-R0-R7,8个

-R8~R12,分两组共10个

-R13~R14除了SP(堆栈指针)和LR(程序链接寄存器),其他模式下均有特定标记,分6组共12个

-(R15)PC,1个

8+10+12+1=31个

注:通用寄存器都是32位,并不是其中的某几位

R0
R1
R2
R3
R4
R5
R6
R7
R8 R8_fiq
R9 R9_fiq
R10 R10_fiq
R11 R11_fiq
R12 R12_fiq
R13(SP) R13_svc R13_abt R13_und R13_irq R13_fiq
R14(LR) R14_svc R14_abt R14_und R14_irq R14_fiq
程序计数器 R15(PC)
状态寄存器 CPSR
SPSR_svc SPSR_abt SPSR_und SPSR_irq SPSR_fiq

Thumb状态下的寄存器组织

Thumb状态下的寄存器组是ARM状态下的子集,高位寄存器R8~R12在Thumb状态

下不可见,在Thumb-2下可使用

 

表3                          当前程序状态寄存器CPSR - 1个,备份程序寄存器SPSR_mode(svc,irq,und,fiq,abt)-5个

N Z C V Q ```````````````````` I F T M4 M3 M2 M1 M0
31 30 29 28 27 26 ···················状态保留······················ 8 7 6 5 4 3 2 1 0

N~Q为条件码,不做赘述

............................

控制位含义如下:

I       为中断禁止控制位,I=1禁止外部IRQ中断,I=0允许IRQ中断。

F      为禁止快速中断FIQ的控制位,F=1禁止,F=0允许。

T      为ARM与Thumb指令切换,T=1执行Thumb指令,T=0执行ARM指令。若不具备Thumb指令的处理器,T=1时表示强制下一条执行的指令产生未定义的指令中断。

M4~M0为模式选择位,决定处理器处于何种模式,具体见表1

表4                                ARM处理器工作模式

工作模式 功能说明 CPSR[M4:M0]
用户模式 User 程序正常执行工作模式 10000
快速中断模式 FIQ 处理高速中断,用于高速数据传输或通道处理 10001
外部中断模式 IRQ 用于普通中断处理 10010
管理模式 SVC 操作系统的保护模式,处理软中断SWI 10011
中止模式 ABT 处理存储器故障,实现虚拟存储器和存储器保护 10111
未定义指令模式 UND 处理未定义的指令陷阱,用于支持硬件协处理器仿真 11011
系统模式 SYS 运行特权级的操作系统任务 11111

eg:对于CPSR寄存器,选择用户模式且使用快速中断FIQ,禁止IRQ中断,Thumb状态,则CPSR的值为:0x000000B0.

嗯,看完这些,就可以描述ARM异常中断的响应过程和异常处理程序的返回过程了

一:ARM异常的中断响应过程

除了复位异常立即中止当前指令外,其他情况都是处理器完成当前指令才去执行异常处理程序。

1.保存CPSR(当前程序状态寄存器)的值到将要执行异常中断对应的SPSR(备份程序寄存器)。

--SPSR有五组,分别是svc,irq,und,fiq,abt

2.设置当前状态寄存器CPSR的值

设置CPSR的M0-M4的5个位,进入相应工作模式。同时也可以设置F,I,T来禁止允许相应中断,例:设置I=0禁止IRQ中断;设置F=1进入复位模式或者FIQ模式以禁止FIQ中断。

3.将引起异常指令的下一条地址(断点地址)保存到新的异常工作模式的LR(R14_mode,程序链接寄存器)中,使得异常处理程序执行完后能正确返回原来的程序处继续执行。

例如异常中断发生,R13_mode存放堆栈指针,R14_mode存放断点地址。

4.给程序计数器PC强制赋值,转入表1所示的向量地址,以便执行相应的处理程序。

二:从异常处理程序中返回

复位异常发生后,从0x00000000开始重新执行程序,无需返回。其余异常处理完成后必须回到原来程序处执行。

1.将SPSR_mode寄存器的值复制到CPSR中,使得CPSR恢复到原先状态。

1.根据异常类型将PC值恢复成断点地址,以继续执行用户原来运行着的程序。

2.清除CPSR的中断禁止标志I和F,开放外部中断IRQ和快速中断FIQ。

程序状态字和断点地址的恢复是同时进行的,先恢复一方会产生错误。

先恢复CPSR,则保存断点地址的R14_mode不能访问。

先恢复断点地址,则异常处理程序失去对指令的控制,以至于CPSR不能恢复。

 

在应用程序的设计中,首先要进行异常向量的初始化处理,采用的方法是在异常向量表的特定位置放置一条跳转指令,跳转到异常处理程序。当ARM处理器发生异常时,程序计数器PC会被强制设置为对应得异常向量,从而跳转到异常处理程序,当异常处理完成以后返回到主程序继续执行。

 

猜你喜欢

转载自blog.csdn.net/xiangxistu/article/details/82501506
今日推荐