当正常的程序执行流程发生暂时的停止时,称之为异常,处理器允许多个异常同时发生,它们将会按固定的优先级进行处理。

ARM 体系结构所支持的异常类型

ARM 体系结构中的异常,与8 位/16 位体系结构的中断有很大的相似之处,但异常与中断的概念并不完全等同。

arm处理器的状态和模式(ARM处理器异常Exceptions)(1)

异常优先级

当多个异常同时发生时,ARM9 处理器将按照异常的优先级高低顺序处理,异常优先级由 高到低 的排列次序如表所示。

arm处理器的状态和模式(ARM处理器异常Exceptions)(2)

异常的响应及返回

异常发生会使得正常的程序流程被暂时停止,例如ARM9 处理器响应IRQ 异常 。

处理器进入异常处理程序前,应该保存其当前的状态,以便当异常处理程序完成后,处理器能回到原来程序的断点处继续执行。

对异常的响应

1、将下一条指令的地址存入相应链接寄存器LR ,以便程序在处理异常返回时能从正确的位置重新开始执行。

(1)若异常是从ARM 状态进入,LR 寄存器中保存的是下一条指令的地址(当前PC +4 或PC +8 ,与异常的类型有关);

(2)若异常是从Thumb 状态进入,则在LR 寄存器中保存当前PC 的偏移量,这样,异常处理程序就不需要确定异常是从何种状态进入的。

2、将CPSR 复制到相应的SPSR中。

3、根据异常类型,强制设置CPSR 的运行模式位。

4、强制PC 从相关的异常向量地址取下一条指令执行,从而跳转到相应的异常处理程序处,同时设置中断禁止位,以禁止中断发生。

注意:

如果异常发生时,处理器处于Thumb 状态,则当异常向量地址加载入PC 时,处理器自动切换到ARM

异常返回

异常处理完毕之后,ARM 微处理器会执行以下几步操作从异常返回:

⑴将链接寄存器LR 的值减去相应的偏移量后送到PC 中。

⑵将SPSR 复制回CPSR 中。

⑶若在进入异常处理时设置了中断禁止位,要在此清除。

注意:

恢复CPSR 的动作会将T 、F 和I 位自动恢复为异常发生前的值。

下表总结了进入异常处理时保存在相应R14(LR )中的PC 值,及在退出异常处理时推荐使用的指令。

arm处理器的状态和模式(ARM处理器异常Exceptions)(3)

异常的响应及返回

应用程序中的异常处理

当系统运行时,异常可能会随时发生,为保证在ARM 处理器发生异常时不至于处于未知状态,在应用程序的设计中, 首先 要进行异常处理,采用的方式是在异常向量表中的特定位置放置一条跳转指令,跳转到异常处理程序, 当ARM 处理器发生异常时 ,程序计数器PC 会被强制设置为对应的异常向量,从而跳转到异常处理程序, 当异常处理完成以后 ,返回到主程序继续执行。

下面以图示的方式演示进入和退出异常的过程

进入和退出异常的过程

进入异常

1、程序在系统模式下运行用户程序,假定当前处理器状态为 Thumb 状态、允许 IRQ 中断

置位I 位(禁止 IRQ 中断)

清零T 位(进入 ARM 状态)

设置 MOD 位,切换处理器模式至 IRQ模式

将下一条指令的地址存入IRQ 模式的 LR 寄存器

将跳转地址存入 PC ,实现跳转

2、用户程序运行时发生 IRQ 中断,硬件完成以下动作:

将CPSR寄存器内容存入IRQ模式的SPSR寄存器

置位I 位(禁止 IRQ 中断)

清零T 位(进入 ARM 状态)

设置 MOD 位,切换处理器模式至 IRQ 模式

将下一条指令的地址存入IRQ 模式的 LR 寄存器

将跳转地址存入 PC ,实现跳转

arm处理器的状态和模式(ARM处理器异常Exceptions)(4)

进入异常

退出异常

在异常处理结束后,异常处理程序完成以下动作:

将 SPSR 寄存器的值复制回CPSR 寄存器

将 LR 寄存的值减去一个常量后复制到 PC 寄存器,跳转到被中断的用户程序。

arm处理器的状态和模式(ARM处理器异常Exceptions)(5)

退出异常

,