ARM微处理器的异常处理
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
在一个正常的程序流程执行过程中,由内部或外部源产生的一个事件使正常的程序产生暂时的停止时,称之为异常。异常是由内部或外部源产生并引起处理器处理一个事件,例如一个外部的中断请求。在处理异常之前,当前处理器的状态必须保留,当异常处理完成之后,恢复保留的当前处理器状态,继续执行当前程序。多个异常同时发生时,处理器将会按固定的优先级进行处理。
ARM体系结构中的异常,与单片机的中断有相似之处,但异常与中断的概念并不完全等同,例如外部中断或试图执行未定义指令都会引起异常。
ARM体系结构支持7种类型的异常,异常类型、异常处理模式和优先级如下表所示。异常出现后,强制从异常类型对应的固定存储器地址开始执行程序。这些固定的地址称为异常向量(Exception Vectors)。
异常类型 | 异常 | 进入模式 | 地址(异常向量) | 优先级 |
复位 | 复位 | 管理模式 | 0x0000,0000 | 1(最高) |
未定义指令 | 未定义指令 | 未定义模式 | 0x0000,0004 | 6(最低) |
软件中断 | 软件中断 | 管理模式 | 0x0000,0008 | 6(最低) |
指令预取中止 | 中止(预取指令) | 中止模式 | 0x<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />0000,000C | 5 |
数据中止 | 中止(数据) | 中止模式 | 0x0000,0010 | 2 |
IRQ(外部中断请求) | IRQ | IRQ | 0x0000,0018 | 4 |
FIQ(快速中断请求) | FIQ | FIQ | 0x0000,001C | 3 |
(1)复位
当处理器的复位电平有效时,产生复位异常,ARM处理器立刻停止执行当前指令。复位后,ARM处理器在禁止中断的管理模式下,程序跳转到复位异常处理程序处执行(从地址0x00000000或0xFFFF0000开始执行指令)。
(2)未定义指令异常
当ARM处理器或协处理器遇到不能处理的指令时,产生未定义指令异常。当ARM处理器执行协处理器指令时,它必须等待任一外部协处理器应答后,才能真正执行这条指令。若协处理器没有响应,就会出现未定义指令异常。若试图执行未定义的指令,也会出现未定义指令异常。未定义指令异常可用于在没有物理协处理器(硬件)的系统上,对协处理器进行软件仿真,或在软件仿真时进行指令扩展。
(3)软件中断异常(SoftWare Interrupt,SWI)
软件中断异常由执行SWI指令产生,可使用该异常机制实现系统功能调用,用于用户模式下的程序调用特权操作指令,以请求特定的管理(操作系统)函数。
(4)指令预取中止
若处理器预取指令的地址不存在,或该地址不允许当前指令访问,存储器会向处理器发出存储器中止(Abort)信号,但当预取的指令被执行时,才会产生指令预取中止异常。
(5)数据中止(数据访问存储器中止)
若处理器数据访问指令的地址不存在,或该地址不允许当前指令访问时,产生数据中止异常。存储器系统发出存储器中止信号。响应数据访问(加载或存储)激活中止,标记数据为无效。在后面的任何指令或异常改变CPU状态之前,数据中止异常发生。
(6)外部中断请求(IRQ)异常
当处理器的外部中断请求引脚有效,且CPSR中的I位为0时,产生IRQ异常。系统的外设可通过该异常请求中断服务。IRQ异常的优先级比FIQ异常的低。当进入FIQ处理时,会屏蔽掉IRQ异常。
(7)快速中断请求(FIQ)异常
当处理器的快速中断请求引脚有效,且CPSR中的F位为0时,产生FIQ异常。FIQ支持数据传送和通道处理,并有足够的私有寄存器。
异常的响应过程,当一个异常出现以后,ARM微处理器会执行以下几步操作:
① 将下一条指令的地址存入相应连接寄存器LR,以便程序在处理异常返回时能从正确的位置重新开始执行。若异常是从ARM状态进入,LR寄存器中保存的是下一条指令的地址(当前PC+4或PC+8,与异常的类型有关);若异常是从Thumb状态进入,则在LR寄存器中保存当前PC的偏移量。
② 将CPSR状态传送到相应的SPSR中。
③ 根据异常类型,强制设置CPSR的运行模式位。
④ 强制PC从相关的异常向量地址取下一条指令执行,跳转到相应的异常处理程序。还可以设置中断禁止位,以禁止中断发生。
如果异常发生时,处理器处于Thumb状态,则当异常向量地址加载入PC时,处理器自动切换到ARM状态。
异常处理完毕之后,ARM微处理器会执行以下几步操作从异常返回:
① 将连接寄存器LR的值减去相应的偏移量后送到PC中。
② 将SPSR内容送回CPSR中。
③ 若在进入异常处理时设置了中断禁止位,要在此清除。
可以认为应用程序总是从复位异常处理程序开始执行的,因此复位异常处理程序不需要返回。
文章评论(0条评论)
登录后参与讨论