异常中断_1

来源:互联网 发布:域名搜索引擎 编辑:程序博客网 时间:2024/06/11 08:06
1.产生异常时,处理器采取如下动作。


步骤1:将要处理的当前程序状态寄存器(CPSR)复制到程序状态备份寄存器(SPSR),以保存当前模式、中断屏蔽和条件标志等。这个SPSR使指即将进入的状态的SPSR。
步骤2:转至ARM状态(仅限于能处理Thumb代码的处理器)。
步骤3:改变相应的CPRS模式位以便:改变相应的模式及该模式下相应编组寄存器中的映射。禁用中断。发生中断时,禁用IRQ。发生FIQ时和在复位时,禁用FIQ。
步骤4:设置 lr_mode 到返回地址,见返回地址和返回指令中所定义。
步骤5:将程序计数器设置至异常向量地址。
对于不能处理Thumb代码的ARM处理器,这将强行跳转至相应的异常处理程序。对于能处理Thumb代码的处理器,步骤2中由Thumb状态转至ARM状态保证了安装在该向量地址(跳转或与PC相关的载入)的ARM指令能够正确读取、解码和执行。
2.从异常处理程序的返回。


从异常返回的方法取决于该异常处理程序使用或不使用堆操作。要返回到异常发生处继续执行,异常处理程序必须:
从spsr_mode恢复CPSR。
使用保存在lr_mode中的返回地址恢复程序计数器(PC)。
步骤1:可以通过使用数据处理指令实现从异常返回。
通过执行数据处理指令完成从异常的返回,这些数据处理指令要保证两点:设置S标志;目的寄存器为程序计数器。
所需的返回指令取决于异常的类型。有关如何从每种异常返回的问题将在后面的章节介绍。
备注:不必从复位处理程序返回,因为复位处理程序直接执行主代码。
步骤2:使用出栈指令(加载指令)完成从异常返回。
处理异常时,如果异常处理程序入口代码使用了堆来存储必须保留的寄存器,可通过使用带“^”的加载指令来从异常返回。例如使用:
LDMFD sp!,{r0-r12,pc}^
如果它将如下内容存储在堆中:
调用处理程序时使用的所有寄存器。
为产生与下面说明的数据处理指令相同的效果而修改链接寄存器。
“^”修饰符指定将SPSR的内容复制到CPSR中。仅在特权模式下使用。
3.从SWI和未定义指令处理程序返回。


SWI和未定义指令异常是由指令本身造成的,因此,处理异常时,程序计数器未被更新。处理器将(PC – 4)保存在lr_ mode中。因而使lr_mode指向SWI指令或是未定义指令后的下一条要执行的指令。要从lr中恢复程序计数器,则使用如下指令即可实现从异常返回:
MOVS pc, lr
将返回地址保存在栈中并在返回时将其弹出的处理程序入口和出口代码如下:
STMFD sp!,{reglist,lr}
;...
LDMFD sp!,{reglist,pc}^
对于在Thumb状态下发生的异常,处理程序返回指令(MOVS pc,lr)将程序计数器指向下一条要执行指令的地址。这是在(PC – 2),因此处理器存储在lr_mode中的值为 (PC – 2)。
4.从IRQ/FIQ异常中断处理程序返回。
指令地址  对应于 PC

A         PC-8      执行此指令完成后(!)查询 IRQ 及 FIQ,如果有中断请求则产生中断. 

A+4       PC-4
A+8       PC         ;lr!(此时 PC 的值已经更新,指向 A+12.将当前 PC-4,即 A+8 )。
保存到 LR.返回时,要接着执行 A+4(LR-4)处的指令,所以返回指令为
SUBS PC, LR,#4(PC=A+4=LR-4)
对于普中断和快中断异常,中断必须在一条指令执行完以后被检测到,如正在
执行指令时发生了中断,不等指令执行完是不会处理该中断的,发生异常时 pc 已经
更新(A+12); lr = pc – 4即 A+8 返回后,应执行被
中断而没有执行的指令(上面的 A+4),所以返回时,pc = lr-4
5 从指令预取终止异常中断处理程序返回
指令地址
A     PC-8     执行本指令时发生中断,  
A+4   PC-4     处理器将 A+4(PC-4)保存到 LR.    ;lr!
A+8   PC
 
返回时,发生指令预取中止的指令 A(PC-8)处重新执行,所以返回指令为
SUBS PC, LR,#4(PC=A=LR-4)
白话解释:对于预取指令中止异常,发生预取指令异常时,是在执行时发生的异常,pc 
未更新,即 pc = A+8;lr = pc – 4(这时处理器决定的,无法更改!)即 A+4 。
由于这类异常返回后应重新执行异常的那个指令(A),所以返回时,pc = lr-4


6 从数据访问终止异常中断处理程序返回
指令地址
A          PC-8    本指令访问有问题的数据,产生中断时,PC 的值已经更新   
A+4        PC-4    中断发生时 PC=A+12,处理器将 A+8(PC-4)保存到 LR.
A+8        PC        ;lr!
 
返回时,要返回到 A 处继续执行,所以指令为 SUBS PC,  LR,#8.(PC=A=LR-8)
白话解释:对于数据访问中止异常,发生数据访问中止异常时,是在执行时访问数据错误
导致的异常,pc 已经更新,即 pc = A+12
    lr = pc – 4(这时处理器决定的,无法更改!)即 A+8 。

0 0