3.8 ARM微处理器的异常
异常(Exception)是指任何打断处理器正常执行,并且迫使处理器进入一个有特权的特殊指令执行的事件。
异常可分为两类:同步异常和异步异常。
(1)同步异常
由内部事件引起的异常称为同步异常,包括以下3个方面:在某些处理器体系结构中,对于确定的数据尺寸必须从内存的偶数地址进行读和写操作;从一个奇数内存地址的读或写操作将引起存储器存储一个错误事件并且引起一个异常;造成被零除的算术运算引发一个异常。
(2)异步异常
由外部事件引起的异常称为异步异常,一般这些外部事件与硬件信号相关,又称中断,包括以下两个方面:复位异常,按下嵌入式板上的复位按钮,触发一个异步的异常,如串口、网口等通信模块;接收数据包产生异常。
3.8.1 ARM体系结构所支持的异常类型
异常可分为4类:中断、陷阱、故障和终止,参见表3-9。
表3-9 异常类型
(1)中断
中断过程如图3-20所示。
(2)陷阱
陷阱是有意的异常,通常在用户程序和内核之间提供系统调用。
陷阱过程如图3-21所示。
图3-20 中断过程
图3-21 陷阱过程
(3)故障
故障是由错误情况引起的,它可以被故障处理程序修正。
故障过程如图3-22所示。
(4)终止
终止是不可恢复的致命错误造成的结果,如DRAM或SRAM位损坏时发生的奇偶错误。
终止过程如图3-23所示。
图3-22 故障过程
图3-23 终止过程
3.8.2 异常矢量表
ARM支持7种类型的异常处理,参见表3-10。异常出现后处理器强制从异常类型所对应的固定存储器地址开始执行程序,这些存储器地址称为异常矢量。
表3-10 异常矢量表
1)复位:处理器上一旦有复位信号输入,ARM处理器立刻停止执行当前指令,复位后,ARM处理器在禁止中断的管理模式下,从地址0x00000000或0xFFFF0000开始执行程序。
2)未定义指令异常:当ARM处理器执行协处理器指令时,它必须等待任一个外部协处理器响应后,才能真正执行这条指令。若协处理器没有响应,就会出现未定义指令异常。另外,试图执行未定义的指令,也会出现未定义指令异常。
3)软件中断异常:软件中断异常指令SWI进入管理模式,以请求特定的管理函数。
4)预取中止:存储器系统发出存储器中止信号,响应取指激活的中止标识所取的指令无效,若处理器试图执行无效指令,则产生预取中止异常;若指令未执行,则不发生预取中止。
5)数据中止:存储器系统发出存储器中止信号,响应数据访问激活中止标识的数据无效。
6)IRQ:通过处理器上的IRQ输入引脚,由外部产生IRQ异常。IRQ异常的优先级比FIQ异常的低。当进入FIQ处理时,会屏蔽掉IRQ异常。
7)FIQ:通过处理器上的FIQ输入引脚,由外部产生FIQ异常。
3.8.3 异常优先级
在某时刻可能会同时出现多个异常,ARM处理器则按优先级的高低顺序处理。异常的优先级参见表3-11。从表中可知,复位异常的优先级最高,未定义异常和软件中断异常的优先级最低。
表3-11 异常的优先级
3.8.4 应用程序中的异常处理
应用程序中的异常处理包括异常的进入和异常的退出两个重要的部分。
(1)异常的进入
当处理一个异常时,ARM完成以下动作:
1)将下一条指令的地址保存在相应的LR寄存器中。如果异常是从ARM状态进入,则保存在LR中的是下一条指令的地址;如果异常是从Thumb状态进入,则保存在LR中的是当前PC的偏移量。
2)将CPSR复制到相应的SPSR中。
3)迫使CPSR模式位M[4:0]的值设置成对应的异常模式值。
4)迫使PC从相关的异常矢量取下一条指令。
5)可以设置中断禁止位来阻止其他无法处理的异常嵌套。如果在异常发生时处理器是在Thumb状态下,那么当用中断矢量地址加载PC时,自动切换进入RAM状态。
(2)异常的退出
在完成异常处理后,ARM完成以下动作:
1)将LR寄存器的值减去相应的偏移量,送到PC中。
2)将SPSR复制回CPSR中。
3)清除中断禁止位标志。
表3-12总结了进入异常处理时保存在相应的R14寄存器中的PC值,以及在退出异常处理时推荐使用的指令。
表3-12 R14寄存器中的PC值
ARM微处理器对异常的响应过程用伪码可以描述如下:
R14_=Return Link SPSR_= CPSR CPSR[4:0] = Exception Mode Number CPSR[5] = 0;当运行于 ARM 工作状态时 If == Reset or FIQ then;当响应 FIQ 异常时,禁止新的 FIQ 异↘ CPSR[6] = 1 PSR[7] = 1 PC = Exception Vector Address
3.8.5 各类异常的具体描述
当异常出现时,异常模式分组的R14和SPSR用于保存状态,即
R14_<exception mode> = return link SPSR_<exception_mode> = CPSR CPSR[4:0] = exception mode number CPSR[5] =0;在ARM状态执行 if <exception mode> == Reset or FIQ then CPSR[6] = 1;禁止快速中断 CPSR[7] = 1;禁止正常中断 PC = exception vector address
当处理异常返回时,将SPSR传送到CPSR,R14传送到PC。这可用两种方法自动完成,即使用带S位的数据处理指令,将PC作为目的寄存器;使用带恢复CPSR的多加载指令。
(1)复位
当处理器的复位电平有效时,产生复位异常,ARM处理器立刻停止执行当前指令。复位后,ARM处理器在禁止中断的管理模式下,程序跳转到复位异常处理程序处执行。
处理器上一旦有复位输入,ARM处理器立刻停止执行当前指令。复位完成下列操作:
R14_svc=UNPREDICTABLE value SPSR_svc=UNPREDICTABLE value CPSR[4:0]=0b10011;进入管理模式 CPSR[5]=0;在ARM状态下执行 CPSR[6]=1;禁止快速中断 CPSR[7]=1;禁止正常中断 If high vectors configured then PC=0xFFFF0000 Else PC=0x00000000
复位后,ARM处理器在禁止中断的管理模式下,从地址0x00000000或OxFFFF0000开始执行指令。
(2)未定义指令异常
当ARM处理器或协处理器遇到不能处理的指令时,产生未定义指令异常。当ARM处理器执行协处理器指令时,它必须等待任一个外部协处理器响应后,才能真正执行这条指令。若协处理器没有响应,就会出现未定义指令异常。
当ARM7处理器遇到一条自己和系统内任何协处理器都无法处理的指令时,ARM7内核执行未定义指令陷阱。软件可使用这一机制通过模拟未定义的协处理器指令来扩展ARM指令集。
当未定义指令异常出现时,执行下列操作:
R14_und=address of next instruction after the undefined instruction SPSR_und=CPSR CPSR[4:0]=0b11011;进入未定义模式 CPSR[5]=0;在ARM状态执行 CPSR[7]=1;禁止正常中断 If high vectors configured then PC=0xFFFF0004 Else PC=0x00000004
在仿真未定义指令后,使用下列指令返回,即
MOVS PC,R14
上面的指令恢复PC和CPSR,并返回到未定义指令后的下一条指令。
(3)软件中断(SWI)异常
软件中断异常由执行SWI指令产生,可使用该异常机制实现系统功能调用,用于用户模式下的程序调用特权操作指令,以请求特定的管理函数。
当执行SWI时,完成下列操作:
R14_svc=address of next instruction after the SWI instruction SPSR_svc=CPSR CPSR[4:0]=0b10011;进入管理模式 CPSR[5]=0;在ARM状态执行 CPSR[7]=1;禁止正常中断 If high vectors configured then PC=0xFFFF0008 Else PC=0x00000008
完成SWI操作后,使用下列指令恢复PC和CPSR,并返回到SWI指令后的下一条指令,即
MOVS PC,R14_svc
这个动作恢复了PC并返回到SWI后的指令,SWI处理程序读取操作码以提取SWI函数编号。
软件中断指令调用如图3-24所示。
图3-24 软件中断指令调用
(4)预取中止异常
若处理器预取指令的地址不存在,或该地址不允许当前指令访问时,存储器会向处理器发出存储器中止信号,但当预取的指令被执行时,才会产生指令预取中止异常。
当发生预取中止时,ARM内核将预取的指令标识为无效,但在指令到达流水线的执行阶段时才进入异常。如果指令在流水线中因为发生分支而没有被执行,中止将不会发生。
当试图执行一条中止的指令时,将执行下列操作:
R14_abt=address of the aborted instruction + 4 SPSR_abt=CPSR CPSR[4:0]=0b10111;进入中止模式 CPSR[5]=0;在ARM状态执行 CPSR[7]=1;禁止正常中断 If high vectors configured then PC=0xFFFF000C Else PC=0x0000000C
确定中止原因后,使用下面指令从中止模式返回,即
SUBS PC,R14,#4
上面的指令恢复PC和CPSR,并返回到中止的指令。
(5)数据中止异常
若处理器数据访问指令的地址不存在,或该地址不允许当前指令访问时,产生数据中止异常,存储器系统发出存储器中止信号。响应数据访问激活中止,标识数据为无效。在后面的任何指令或异常改变CPU状态之前,数据中止异常发生。
在下面的任何指令或异常改变CPU状态之前,数据中止异常发生。执行下列操作:
R14_abt=address of the aborted instruction + 8 SPSR_abt=CPSR CPSR[4:0]=0b10111;进入中止模式 CPSR[5]=0;在ARM状态执行 CPSR[7]=1;禁止正常中断 If high vectors configured then PC=0xFFFF0010 Else PC=0x00000010
确定中止原因后,使用下列指令从中止模式返回,即
SUBS PC,R14,#8
上面的指令恢复PC和CPSR,并返回重新执行中止的指令。若中止的指令不需要重新执行,则使用下面的指令:
SUBS PC,R14,#4
(6)中断请求(IRQ)异常
处理器的外部中断请求引脚有效,且CPSR中的I位为零时,产生IRQ异常。系统的外设可通过该异常请求中断服务。IRQ异常的优先级比FIQ低。当进入FIQ处理时,会屏蔽掉IRQ异常。
IRQ的优先级低于FIQ。对于FIQ序列它是被屏蔽的。任何时候在一个特权模式下,都可通过置位CPSR中的I位来禁止IRQ。
通过处理器上的IRQ输入引脚,由外部产生IRQ异常。IRQ异常的优先级比FIQ低。当进入FIQ处理时,会屏蔽掉IRQ异常。
若CPSR的I位置为1,则禁止IRQ中断。若I位清零,则ARM在指令执行完之前检查IRQ输入。
只能在特权模式下改变I位,当检测到IRQ时,执行下列操作:
R14_irq=address of the aborted instruction + 4 SPSR_irq=CPSR CPSR[4:0]=0b10010;进入IRQ模式 CPSR[5]=0;在ARM状态执行 CPSR[7]=1;禁止正常中断 If high vectors configured then PC=0xFFFF0018 Else PC=0x00000018
使用下面的指令从中断服务返回,即
SUBS PC,R14,#4
上面的指令恢复PC和CPSR,并继续执行被中断的程序。
IRQ操作流程如图3-25所示。
(7)快速中断请求(FIQ)异常
FIQ 适用于对一个突发事件的快速响应保护的需要。通过处理器上的FIQ输入引脚,由外部产生FIQ异常。当处理器的快速中断请求引脚有效,且CPSR中的F位为零时,产生FIQ异常。FIQ支持数据传送和通道处理,并有足够的私有寄存器。
当CPSR的F位置1时,禁止快速中断。若F位清零,则ARM在执行指令时检查FIQ输入。只能在特权模式下改变F位,当检测到FIQ时,执行下列操作,即
R14_fiq=address of the aborted instruction + 4 SPSR_fiq=CPSR CPSR[4:0]=0b10001 ;进入FIQ模式 CPSR[5]=0;在ARM状态执行 CPSR[6]=1;禁止快速中断 CPSR[7]=1;禁止正常中断 If high vectors configured then PC=0xFFFF001C Else PC=0x0000001C
使用下面的指令从中断服务返回,即
SUBS PC,R14,#4
该指令恢复PC和CPSR,并继续执行被中断的程序。FIQ矢量放在最后,允许FIQ异常处理程序直接放在地址0x0000001C或0xFFFF001C开始的位置,而不需要由矢量的分支指令执行跳转到异常处理程序。
FIQ操作流程如图3-26所示。
图3-25 IRQ操作流程
图3-26 FIQ操作流程