在ARM程序的开发进程中,对间断的处理是很遍及的、也是恰当重要的。Realview MDK运用的RVCT编译器供给了__irq关键字,用此关键字润饰的函数被作为间断来函数编译,即在编译的进程中,编译器会主动增加间断处理进程中现场维护和康复的代码,减小程序的开发难度,加速软件的开发进程。
在了解__irq关键字的效果之前,先看一下ARM核对反常的处理进程。当发生反常时, ARM核复制CPSR寄存器的内容SPSR_
Ø 从SWI和Undef反常回来时运用:
MOVS PC, LR;
Ø 从FIQ、IRQ和预取停止回来时运用:
SUBS PC, LR,#4;
Ø 从数据反常回来时运用:
SUBS PC, LR,#8
在运用上述指令反常回来时,假如LR之前被压栈的话运用LDM “∧”, 例如:
LDMFD SP!, {PC}∧
退出反常处理
SWI和未定义指令反常间断是由当时履行的指令本身发生的。当SWI和未定义指令反常间断发生时,程序计数器PC的值还未更新,它指向当时指令后边第2条指令(关于ARM指令来说+8字节;关于Thumb指令来说+4字节的方位)。当SWI和未定义指令反常间断发生时,处理器将值(PC-4)保存到反常形式下的寄存器LR_mode中。这时(PC-4)即指向当时指令的下一条指令地址。因而回来操作能够经过下面的指令来完成:MOV PC,LR
该指令将寄存器LR中的值到程序计数器PC中完成程序回来,一起将SPSR_mode寄存器内容到当时程序状况寄存器CPSR中。
在指令预取时,假如方针地址是不合法的,该指令将被标记成有问题的指令。这时,流水线上该指令之前的指令持续履行。当履行到该被标记成有问题的指令时,处理器发生指令预取间断反常间断。
当发生指令预取间断反常间断时,程序要回来到该有问题的指令处,从头读取并履行该指令。因而指令预取间断反常间断程序应该回来到发生该指令预取间断反常间断的指令处,而不是回来到发生间断的指令的下一条指令。
指令预取间断反常间断是由当时履行的指令本身发生的,当指令预取间断反常间断发生时,程序计数器PC的值还未更新,它指向当时指令后边第2条指令(关于ARM指令来说,它指向当时指令地址加8个字节的w方位;关于Thumb指令来说,它指向当时指令地址加4个字节的方位)。当指令预取间断反常间断发生时,处理器将(PC-4)值保存到反常形式下的寄存器LR_mode中。这时(PC-4)即指向当时指令的下一条指令。因而回来操作能够经过下面的指令来完成:SUBS PC,LR,#4
该指令将寄存器LR中的值减4后,到程序计数器PC中,完成程序回来,一起将SPSR_mode寄存器内容到当时程序状况寄存器CPSR中。
发生数据拜访反常间断时,程序要回来到该有问题的指令处,从头拜访该数据,因而数据拜访反常间断应该回来到发生该数据拜访间断反常间断的指令处,而不是当时指令的下一条指令。
数据拜访反常间断由当时履行的指令本身发生,当数据拜访反常间断发生时,程序计数器pc的值现已更新,它指向当时指令后边第3条指令(关于ARM指令,它指向当时指令地址加12字节的方位;关于Thumb指令,它指向当时指令地址加6字节的方位)。此刻处理器将值(pc-4)保存到lr_abt中,它指向当时指令后边第2条指令,所以回来操作能够经过下面指令完成:subs pc, lr, #8
该指令将lr中的值减8后传给程序计数器pc中,完成程序回来,一起将SPSR_abt寄存器内容到当时程序状况寄存器CPSR中;
一般处理器履行完当时指令后,查询IRQ间断引脚,并检查是否答应IRQ间断,假如某个间断引脚有用,而且体系答应该间断发生,处理器将发生IRQ反常间断,当IRQ反常间断发生时,程序计数器pc的值现已更新,它指向当时指令后边第3条指令(关于ARM指令,它指向当时指令地址加12字节的方位;关于Thumb指令,它指向当时指令地址加6字节的方位),当IRQ反常间断发生时,处理器将值(pc-4)保存到IRQ反常形式下的寄存器lr_irq中,它指向当时指令之后的第2条指令,因而回来操作能够经过下面指令完成:subs pc, lr, #4
与IRQ反常间断相同,处理器履行完当时指令后,查询FIQ间断引脚,并检查是否答应FIQ间断,假如间断引脚有用,而且体系答应该间断发生,处理器将发生FIQ反常间断,当FIQ反常间断发生时,程序计数器pc的值现已更新,它指向当时指令后边第3条指令(关于ARM指令,它指向当时指令地址加12字节的方位;关于Thumb指令,它指向当时指令地址加6字节的方位),当FIQ反常间断发生时,处理器将值(pc-4)保存到IRQ反常形式下的寄存器lr_fiq中,它指向当时指令之后的第2条指令,因而回来操作能够经过下面指令完成:subs pc, lr, #4