其他内容不再赘述,现在粘贴三张需要的表
表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会被强制设置为对应得异常向量,从而跳转到异常处理程序,当异常处理完成以后返回到主程序继续执行。