中断向量地址 异常中断类型 异常中断模式 优先级(6 级最低)
0x0 复位 特权模式(SVC) 1
0x4 未定义的指令 未定义的指令中止模式 6
0x8 软件中断 特权模式 6
0x10 数据访问中止 中止模式 2
0x14 保留 未使用 未使用
0x18 外部中断请求 外部中断模式 4
0x1c 快速中断请求 快速中断模式 3
6.1.4 进入异常中断
ARM 处理器对异常中断的响应过程如下:
(1) 保存处理器当前状态、中断屏蔽位以及各条件标志位。这是通过将当前程序状态寄
存器 CPSR 的内容保存到将要执行的异常中断对应的SPSR 寄存器中实现的。各异
常中断有自己的物理 SPSR 寄存器。
(2 ) 设置当前程序状态寄存器CPSR 中相应的位。包括设置CPSR 中的位,使处理器进
入相应的执行模式;设置 CPSR 中的位,禁止IRQ 中断,当进入FIQ 模式时,禁
止FIQ 中断。
(3) 将寄存器lr_mode 设置成返回地址。
(4 ) 将程序计数器值(PC ),设置成该异常中断的中断向量地址,从而跳转到相应的异
常中断处理程序执行。
下面我们将分别介绍各种异常中断响应时ARM 系统执行的指令。
1.响应复位异常中断
当处理器的复位引脚有效时,处理器中止当前指令。当处理器的复位引脚变成无效时,
处理器开始执行下面的操作。
R14_svc=UNPREDICTABLE value
SPSR_svs=UNPREDICTABLE value
CPSR[4:0]=0b10011
CPSR[5]=0
CPSR[6]=1
CPSR[7]=1
If high vectors configured then
PC=0Xffff0000
Else
PC=0x00000000
2. 响应未定义指令异常中断
处理器响应未定义指令异常中断时的处理过程如下面的伪指令所示。
R14_und=address of next interaction after the undefined instruction
SPSR_und=CPSR
CPSR[4:0]=0b11011
CPSR[5]=0
CPSR[7]=1
if high vectors configured then
PC=0Xffff0004
Else
PC=0x00000004
3. 响应 SWI 异常中断
处理器响应 SWI 异常中断时的处理过程如下面的伪代码所示。
R14_svc=address of next instruction after the SWI instruction
SPSR_svc=CPSR
CPSR[4:0]=0b10011
CPSR[5]=0
If high vectors configured then
PC=0Xffff0000
Else
PC=0x00000000
4. 响应指令预取中止异常中断
处理响应指令预取中止异常中断时的处理过程如下面的伪代码所示。
R14_aht=address of the aborted instruction + 4
SPSR_abt=CPSR
CPSR[4:0]=0b10111
CPSR[5]=0
CPSR[6]=1
CPSR[7]=1
If high vectors configured then
PC=0Xffff001C
Else
PC=0x0000001c
6.1.5 退出异常中断
ARM 系统处理完中断后从异常中断处理程序中返回包括下面的步骤。
● 恢复被中断的程序的处理状态,即将 SPSR_mode 寄存器内容复制到当前程序状态
寄存器 CPSR中。
● 返回到发生异常中断的指令的下一条指令处执行。即将 lr_mode 寄存器的内容复
制程序计数器 PC 中。
因为整个应用系统时从复位异常中断处理程序执行的,所以复位异常中断处理程序不需要返
回。
实际上,当异常中断发生时,程序程序计数器 PC 所致的位置对于各种不同的异常中断是
不同的。同样,返回地址对于各种不同的异常中断也是不同的。
下面我们分别介绍各种异常中断处理程序的返回方法。
1.SWI 和未定义指令异常中断处理程序的返回
SWI 和未定义指令异常中断是由当前执行的指令自身产生的,当 SWI 和未定义指令异常中断
产生时,程序及顺气 PC的值还未更新,它指向当前指令后面第 2 指令(对于 ARM指令来说,
它指向当前指令地址加 8 个字节的位置;对于 Thumb 指令来说,它指向当前指令地址加 4
个字节的位置)。当 SWI 和未定义指令异常中断发生时,处理器将值(PC-4)保存到异常模
式下的寄存器 lr_mode中。这时(PC-4)即指向当前的下一条指令。因此返回操作可以通过
下面的指令来实现:
MOV PC,LR
该指令将寄存器 LR 中的值复制到程序计数器 PC 中,实现程序返回,同时将 SPSR_mode
寄存器内容复制到当前程序状态寄存器 CPSR 中。
当异常中断处理程序中使用了数据栈时,可以通过下面的指令在进入异常中断处理程序时
保存被中断程序的执行现场,在退出异常中断处理程序时恢复被中断程序执行现场。异常中
断处理程序中使用的数据栈由用户提供。
STMFD SP! ,(reglist lr)
; ...
LDMFD SP! ,reglist pc)^
在上述指令中,reglist 是异常中断处理程序使用的寄存器立表。标识符^指示将