异常中断处理概述
1. ARM中异常中断处理概述
1) 在正常程序执行过程中,每执行一条ARM指令,程序计数器寄存器PC的值加4个字节;每执行一条Thumb指令,程序计数器寄存器PC的值加两个字节.整个过程是顺序执行.
2) 通过跳转指令,程序可以跳转到特定的地址标号处执行,或者跳转到特定的子程序处执行;
B指令用于执行跳转操作;
BL指令在执行跳转操作的同时,保存子程序的返回地址;
BX指令在执行跳转操作的同时,根据目标地址的最低位可以将程序状态切换到Thumb状态;
BLX指令执行3个操作:跳转到目标地址处执行,保存子程序的返回地址(R15保存在R14中),根据目标地址的最低位可以将程序状态切换到Thumb状态.
3) 当异常中断发生时,系统执行完当前指令后,将跳转到相应的异常中断处理程序处执行.在当异常中断处理程序执行完成后,程序返回到发生中断的指令的下一条指令处执行.
4) 在进入异常中断处理程序时,要保存被中断的程序的执行现场,在从异常中断处理程序退出时,要恢复被中断的程序的执行现场.本章讨论ARM体系中的异常中断机制.
2. ARM体系中异常中断种类.
ARM体系中的异常中断如下表所示:
ARM体系中的异常中断
异常中断名称 | 含义 |
复位(RESET) | 当处理器的复位引脚有效时,系统产生复位异常中断,程序跳转到复位异常中断处理程序处执行.复位异常中断通常用在下面两种情况: 系统加电时 系统复位时 跳转到复位中断向量处执行,称为软复位 |
数据访问中止(Data Abort) | 如果数据访问指令的目标地址不存在,或者该地址不允许当前指令访问,处理器产生数据访问中止异常中断 |
快速中断请求(FIQ) | 当处理器的外部快速中断请求引脚有效,而且CPSR寄存器的F控制位被清除时,处理器产生外部中断请求(FIQ)异常中断 |
外部中断请求(IRQ) | 当处理器的外部中断请求引脚有效,而且CPSR寄存器的I控制位被清除时,处理器产生外部中断请求(IRQ)异常中断.系统中各外设通常通过该异常中断请求处理器服务 |
预取指令中止(Prefech Abort) | 如果处理器预取的指令的地址不存在,或者该地址不允许当前指令访问,当该被预取的指令执行时,处理器产生指令预取中止异常中断 |
软件中断(software interrupt SWI) | 这是一个有用化定义的中断指令.可用于用户模式下的程序调用特权操作指令.在实时了操作系统(RTOS)中可以通过该机制实现系统功能调用 |
未定义的指令(undefined instruction) | 当ARM处理器或者是系统中的协处理器认为当前指令未定义时,产生未定义的指令异常中断.可以通过该异常中断机制仿真浮点向量运算 |
3. 异常中断向量表及异常中断优先级
中断向量表中指定了各异常中断及其处理程序的对应关系.它通常存放在存储地址的低端.在ARM体系中,异常中断向量表的大小为32字节.其中,每个异常中断占据4个字节大小,保留了4个字节空间.
每个异常中断对应的中断向量表的4个字节的空间中存放了一个跳转指令或者一个向PC寄存器中赋值的数据访问指令.通过这两种指令,程序将跳转到相应的异常中断处理程序处执行.
当几个异常中断同时发生时,就必须按照一定的次序来处理这些异常中断.在ARM中通过给各异常中断富裕一定的优先级来实现这种处理次序.当然有些异常中断是不坑能同时发生的,如指令预取中止异常中断和软件中断(SWI)异常中断是有同一条指令的执行触发的,他们是不可能同时发生的.处理器执行某个特定的异常中断的过程中,称为处理器处于特定的中断模式.各异常中断的中断向量地址以及中断的处理优先级如表2所示.
各异常中断的中短向量地址以及中断的处理优先级
中断向量地址 | 异常中断类型 | 异常中断模式 | 优先级(6最低) |
0x0 | 复位 | 特权模式(SVC) | 1 |
0x4 | 未定义的指令 | 未定义指令中止模式(Undef) | 6 |
0x8 | 软件中断(SWI) | 特权模式(SVC) | 6 |
0x0c | 指令预取中止 | 中止模式 | 5 |
0x10 | 数据访问中止 | 中止模式 | 2 |
0x14 | 保留 | 未使用 | 未使用 |
0x18 | 外部中断请求(IRQ) | 外部中断(IRQ)模式 | 4 |
0x1c | 快速中断请求(FIQ) | 快速中断(FIQ)模式 | 3 |
4. 异常中断使用的寄存器
各异常中断对应着一定的处理器模式.应用程序通常运行在用户模式下.ARM中的处理器模式如表3所示.
ARM中的处理器模式
处理器模式 | 描述 |
用户模式 | 正常程序执行的模式 |
快速中断模式 | 用于高速数据传输和通道处理 |
外部中断模式 | 用于通常的中断处理 |
特权模式 | 供操作系统使用的一种保护模式 |
中止模式 | 用于虚拟存储及存储保护 |
未定义指令模式 | 用于支持通过软件仿真硬件的协处理器 |
系统模式 | 用于运行特权级的操作系统任务 |
各种不同的处理器模式可能有对应于该处理器模式的物理寄存器组,如表4所示,其中,R13_svc表示特权模式下的R13寄存器,R13_abt表示中止模式下的R13寄存器,其余的各寄存器名称含义类推.
表4 各处理器模式的物理寄存器组
用户模式 | 系统模式 | 特权模式 | 中止模式 | 未定义指令模式 | 外部中断模式 | 快速中断模式 |
R0 | R0 | R0 | R0 | R0 | R0 | R0 |
R1 | R1 | R1 | R1 | R1 | R1 | R1 |
R2 | R2 | R2 | R2 | R2 | R2 | R2 |
R3 | R3 | R3 | R3 | R3 | R3 | R3 |
R4 | R4 | R4 | R4 | R4 | R4 | R4 |
R5 | R5 | R5 | R5 | R5 | R5 | R5 |
R6 | R6 | R6 | R6 | R6 | R6 | R6 |
R7 | R7 | R7 | R7 | R7 | R7 | R7 |
R8 | R8 | R8 | R8 | R8 | R8 | R8_fiq |
R9 | R9 | R9 | R9 | R9 | R9 | R9_fiq |
R10 | R10 | R10 | R10 | R10 | R10 | R10_fiq |
R11 | R11 | R11 | R11 | R11 | R11 | R11_fiq |
R12 | R12 | R12 | R12 | R12 | R12 | R12_fiq |
R13 | R13 | R13_svc | R13_abt | R13_und | R13_iiq | R13_fiq |
R14 | R14 | R14_svc | R14_abt | R14_und | R14_iiq | R14_fiq |
PC | PC | PC | PC | PC | PC | PC |
CPSR | CPSR | CPSR | CPSR | CPSR | CPSR | CPSR |
|
| SPSR_svc | SPSR_abt | SPSR_und | SPSR_iiq | SPSR_fiq |
如果异常中断处理程序中使用它自己的物理寄存器之外的其它寄存器,异常中断处理程序必须保存和恢复这些寄存器.
在表4中各物理寄存器的名称(如R13_svc等)在ARM汇编语言中并没有被预定义.用户使用这些寄存器时,必须使用伪操作RN来定义这些名称.如可以通过下面操作定义寄存器名称R13_svc:
R13_svc RN R13
一. 进入和退出异常中断的过程
1. ARM处理器对异常中断的相应过程
ARM处理器对异常中断的响应过程如下:
a. 保存处理器当前状态,中断屏蔽位以及各条件标志位.只是通过将当前程序状态寄存器CPSR的内容保存到将要执行的异常总段对应的SPSR寄存器中实现的.各异常中断有自己的物理SPSR寄存器.
b. 设置当前程序CPSR中相应的位.包括设置CPSR中的位,使处理器进入相应的执行模式;设置CPSR中的位,禁止IRQ:当进入FIQ模式时,禁止FIQ中断.
c. 将寄存器LR_mode(R14)设置成返回地址,R14从R15中得到PC的备份.
d. 将程序计数器值PC设置成该异常中断的中断向量地址,从而跳转到相应的异常中断处理程序处执行.
上述的处理器对异常中断的相应过程可以用如下的伪代码描述.
e. 响应复位异常中断.
当处理器的复位引脚有效时,处理器中止当前指令.当处理器的复位引脚变成无效时,处理器开始执行下面的操作.
R14_svc = UNPREDICTABLE value
SPSR_svc = UNPREDICTABLE value
CPSR[4:0] = 0b10011 //进入特权模式
CPSR[5] = 0 //切换到ARM状态
CPSR[6] = 1 //禁止FIQ异常中断
CPSR[7] = 1 //禁止IRQ中断
If high vectors configured then
PC = 0xffff0000
Else
PC = 0x00000000
f. 响应未定义指令异常中断
处理器相应未定义指令异常中断时的处理过程如下面的伪代码所示.
R14_und = address of next instruction after the undefined instruction
SPSR_und = CPSR
CPSR[4:0] = 0b11011 //进入未定义指令异常中断模式
CPSR[5] = 0 //切换到ARM状态
CPSR[6] = 1 //禁止FIQ异常中断
CPSR[7] = 1 //禁止IRQ中断
If high vectors configured then
PC = 0xffff0004
Else
PC = 0x00000004
g. 响应SWI异常中断
处理器相应SWI异常中断时的处理过程如下面的伪代码所示.
R14_svc = address of next instruction after the SWI instruction
SPSR_svc = CPSR
CPSR[4:0] = 0b10011 //进入特权模式
CPSR[5] = 0 //切换到ARM状态
CPSR[6] = 1 //禁止FIQ异常中断
CPSR[7] = 1 //禁止IRQ中断
If high vectors configured then
PC = 0xffff0008
Else
PC = 0x00000008
h. 响应指令预取中止异常中断.
处理器相应指令预取中止异常会总段时的处理过程如下面的伪代码所示.
R14_abt = address of the aborted instruction + 4
SPSR_abt = CPSR
CPSR[4:0] = 0b10111 //进入指令预取中止模式
CPSR[5] = 0 //切换到ARM状态
CPSR[6] = 1 //禁止FIQ异常中断
CPSR[7] = 1 //禁止IRQ中断
If high vectors configured then
PC = 0xffff000c
Else
PC = 0x0000000c
i. 响应数据访问中止异常中断
处理器相应数据访问中止异常中断时的处理过程如下面的伪代码所示.
R14_abt = address of the aborted instruction + 8
SPSR_abt = CPSR
CPSR[4:0] = 0b10111 //进入数据访问中止模式
CPSR[5] = 0 //切换到ARM状态
CPSR[6] = 1 //禁止FIQ异常中断
CPSR[7] = 1 //禁止IRQ中断
If high vectors configured then
PC = 0xffff0010
Else
PC = 0x00000010
j. 响应IRQ异常中断
处理器相应IRQ异常总段时的处理过程如下面的伪代码所示.
R14_irq = address of next instruction to be executed + 4
SPSR_irq = CPSR
CPSR[4:0] = 0b10010 //进入IRQ异常中断模式
CPSR[5] = 0 //切换到ARM状态
CPSR[6] = 0 //打开FIQ异常中断
CPSR[7] = 1 //禁止IRQ中断
If high vectors configured then
PC = 0xffff0018
Else
PC = 0x00000018
k. 响应FIQ异常中断
处理器相应FIQ异常中断时的处理过程如下面的伪代码所示.
2. 从异常中断处理程序种返回
基本操作:
1) 恢复被中断的程序的处理器状态,即将SPSR_mode寄存器内容复制到当前程序状态寄存器CPSR中。
2) 返回到发生异常中断的指令的下一条指令处执行,即将LR_mode寄存器的内容复制程序计数器PC中。
1) 复位异常中断
不需要返回。整个应用系统是从复位异常中断处理程序开始执行的,因而它不需要返回。
2) SWI和未定义指令异常中断处理程序的返回
SWI和未定义指令异常中断是由当前执行的指令自身产生的,
PC指向了第三条指令,但PC的值还没有更新,还为第二条指令的地址值
所以返回时,直接MOV PC,LR即可
3) IRQ和FIQ异常中断处理程序的返回
通常处理器执行完当前指令后,查询IRQ中断引脚及FIQ中断引脚,并且查看系统是否允许IRQ中断及FIQ中断。如果由中断引脚有效,并且系统允许该中断产生,处理器将产生IRQ异常中断或FIQ异常中断。
PC指向了第三条指令,并且也得到更新
所以返回时,SUBS PC, LR, #4
4) 指令预取中止异常中断处理程序的返回
当发生指令预取中止异常中断时,程序要返回到该有问题的指令处,重新读取并执行该指令。因此指令预取中止异常中断程序应该返回到产生该指令预取中止异常中断的指令处,而不是像前面两种情况下返回到发生中断的指令的下一条指令。
PC指向第三条指令,还未更新,所以PC的值仍为第二条指令的地址
返回时,SUBS PC, LR, #4
5) 数据访问中止异常中断处理程序的返回
其也要返回发生错误的地址处
但,发生中断时,PC指向第三条指令,且已更新
所以,返回时,SUBS PC, LR, #8
CPSR 寄存器(和保存它的 SPSR 寄存器)中的位分配如下:
31 30 29 28 --- 7 6 - 4 3 2 1 0
N Z C V I F M4 M3 M2 M1 M0
0 0 0 0 0 User26 模式// mode
0 0 0 0 1 FIQ26 模式
0 0 0 1 0 IRQ26 模式
0 0 0 1 1 SVC26 模式
1 0 0 0 0 User 模式
1 0 0 0 1 FIQ 模式
1 0 0 1 0 IRQ 模式
1 0 0 1 1 SVC 模式
1 0 1 1 1 ABT 模式
1 1 0 1 1 UND 模式