1.FIQ为什么比IRQ快
ARM的FIQ模式提供了更多的备份寄存器,r8到r14还有SPSR,而IRQ模式就没有那么多,R8、R9、R10、R11、R12对应的备份寄存器就没有,这就意味着在ARM的IRQ模式下,中断处理程序自己要保存R8到R12这几个寄存器,然后退出中断处理时程序要恢复这几个寄存器,而FIQ模式由于这几个寄存器都有备份寄存器,模式切换时CPU自动保存这些值到备份寄存器,退出FIQ模式时自动恢复,所以这个过程FIQ比IRQ快。
FIQ比IRQ有更高优先级,如果FIQ和IRQ同时产生,那么FIQ先处理。当CPU处于FIQ模式处理FIQ中断的过程中,预取指令异常,未定义指令异常,软件中断全被禁止,所有的中断被屏蔽。所以FIQ就会很快执行,不会被其他异常或者中断打断。而IRQ不一样,当ARM处理IRQ模式处理IRQ中断时,如果来了一个FIQ中断请求,那正在执行的IRQ中断处理程序会被抢断,ARM切换到FIQ模式去执行这个FIQ。
2.SWI指令实现
一、方法1:获取immed_24操作数。
为了能实现根据指令中immed_24操作数的不同,跳转到不同的处理程序,所以我们往往需要在SWI异常处理子程序中去获得immed_24操作数的实际内容。获得该操作数内容的方法是在异常处理函数中使用下面指令:
LDR R0,[LR,#-4] ;该指令将链接寄存器LR的内容减去4后所获得的值作为一个地址,然后把该地址的内容装载进R0。此时再
;使用下面指令,immed_24操作数的内容就保存到R0
BIC R0,R0,#0xFF000000 ;该指令将R0的高8位清零,并把结果保存到R0,意思就是取R0的低24位。
二、方法2:使用参数寄存器。
实际上,在SWI异常处理子程序的实现时,还可以绕开immed_24操作数的获取操作,这就是说,我们可以不去获取immed_24操作数的实际内容,也能实现SWI异常的分支处理。这就需要使用R0-R4寄存器,其中R0-R4可任意选择其中一个,一般选择R0,遵从ATPCS原则。具体方法就是,在执行SWI指令之前,给R0赋予某个数值,然后在SWI异常处理子程序中根据R0值实现不同的分支处理。