嵌入式系统技术应用与开发
上QQ阅读APP看书,第一时间看更新

2.3.1 ARM体系支持的异常类型

1.IRQ

外部中断请求(IRQ)异常是由nIRQ输入低电平引发的普通中断。IRQ相对FIQ来说是优先级低,当一个FIQ序列进入时它将被屏蔽。IRQ也可以通过设置CPRS中的“I”标志来禁止,同样也不能够在用户模式中这样做(只能在特权模式下这样做)。

无论IRQ发生在ARM状态或者Thumb状态下,都可以采用以下语句来退出中断处理:

2.FIQ

快速中断请求(FIQ)异常通常是用来支持数据传输和通道操作的,在ARM状态下,它具有充足的私有寄存器,用来减少寄存器存取的需要(从而减少进入中断前的“上下文切换”的工作)。

FIQ是由外部设备通过拉低nFIQ引脚触发的。通过对ISYNC输入引脚的控制nFIQ可以区别同步或异步的传输情况。当ISYNC为低电平,nFIQ和nIRQ将被认为是异步的,中断之前产生同步周期延长会影响处理器的流程。不管是ARM状态还是Thumb状态下的异常,FIQ处理程序都可以通过执行以下的语句来退出中断处理:

通过设置CPSR的F标记位可以禁止FIQ中断(但是要注意到在用户模式下是不可行的)。如果F标记位已经清除,ARM920T在每个指令的最后检测来自FIQ中断同步器的低电输出。

3.异常中止

异常中止表示当前存储访问不能完成。通过外部的中止(abort)输入信号来告知内核。ARM920T在每次的存储操作中检测该异常是否发生。异常中止分两种类型:预取指异常中断(指令预取时产生)和数据异常中断(数据访问时产生)。

如果产生预取指中止,所取得的指令将会被标志为无效,但是异常不会立即发生,要直到取指令到达了管道的头部才会发生。如果这些指令不执行——例如在管道内发生了分支跳转,那么异常就不会发生了。

如果产生数据异常中止,则根据指令类型进行操作:

1)简单数据传输指令(LDM,STR)写回改变的基址[变址]寄存器:异常中断处理器必须清楚这些。

2)取消交换指令尽管它还没执行。

3)数据块传输指令(LDM,STM)完成。如果设置为写回,基址已经校正。如果指令超出了数据的写基址(传输目录中有它的基址),就应该防止写超出。在中止异常将发生时,所有寄存器的覆盖写入都是禁止的。这意味着特别是R15(经常是最后一个改变的寄存器)的值将在中止的LDM指令中保留下来。

中止机制使得页面虚拟存储器机制得以实现。在采用虚拟存储器的系统中,处理器可以产生任意的地址。当某个地址的数据无效,存储器管理单元(MMU)将产生一个中止。这样中止的处理程序就必须找出异常中断的原因,使要求的数据可用,并重试被中止的指令。应用程序也既不需要了解实际可用存储空间的大小,也不需要了解异常中断对它的影响。

在完成了异常中断的处理后,通过以下语句退出中断处理(与是ARM状态还是Thumb状态无关):

通过执行该语句,就恢复了PC和CPSR,并重试被中断的指令。

4.软件中断

SWI(软件中断指令)用来进入超级用户模式,通常用于请求特殊的超级用户功能。SWI的处理程序通过执行以下语句,退出异常处理(ARM状态或Thumb状态):

通过执行该语句,就恢复了PC和CPRS,并返回到SWI后面的指令上。注意:前面提到的nFIQ、nIRQ、ISYNC、LOCK、BIGEND和ABORT引脚只存在于ARM的CPU内核上。

5.未定义指令

当ARM遇到一个它不能执行的指令,将产生一个未定义指令陷阱。这个机制是软件仿真器用来扩展Thumb和ARM指令集的。

在完成对未知指令的处理后,陷阱处理程序执行以下的语句退出异常处理(无论是ARM状态还是Thumb状态):

通过执行该语句,恢复了CPSR,并返回执行未定义指令的下一条指令。

ARM体系结构所支持的异常及具体含义如表2-4所示。

表2-4 ARM体系结构所支持的异常