FIQ和IRQ区别

来源:互联网 发布:我帅不帅 知乎 编辑:程序博客网 时间:2024/05/16 12:43
FIQ和IRQ是两种不同类型的中断,ARM为了支持这两种不同的中断,提供了对应的叫做FIQ和IRQ处理器模式(ARM有7种处理模式)。

一般的中断控制器里我们可以配置与控制器相连的某个中断输入是FIQ还是IRQ,所以一个中断是可以指定为FIQ或者IRQ的,为了合理,要求系统更快响应,自身处理所耗时间也很短的中断设置为FIQ,否则就设置了IRQ。

如果该中断设置为了IRQ,那么当该中断产生的时候,中断处理器通过IRQ请求线告诉ARM,ARM就知道有个IRQ中断来了,然后ARM切换到IRQ模式运行。类似的如果该中断设置为FIQ,那么当该中断产生的时候,中断处理器通过FIQ请求线告诉ARM,ARM就知道有个FIQ中断来了,然后切换到FIQ模式运行。

简单的对比的话就是FIQ比IRQ快,为什么快呢?

ARM的FIQ模式提供了更多的banked寄存器,r8到r14还有SPSR,而IRQ模式就没有那么多,R8,R9,R10,R11,R12对应的banked的寄存器就没有,这就意味着在ARM的IRQ模式下,中断处理程序自己要保存R8到R12这几个寄存器,然后退出中断处理时程序要恢复这几个寄存器,而FIQ模式由于这几个寄存器都有banked寄存器,模式切换时CPU自动保存这些值到banked寄存器,退出FIQ模式时自动恢复,所以这个过程FIQ比IRQ快.

FIQ比IRQ有更高优先级,如果FIQ和IRQ同时产生,那么FIQ先处理。

在symbian系统里,当CPU处于FIQ模式处理FIQ中断的过程中,预取指令异常,未定义指令异常,软件中断全被禁止,所有的中断被屏蔽。所以FIQ就会很快执行,不会被其他异常或者中断打断,所以它又比IRQ快了。而IRQ不一样,当ARM处理IRQ模式处理IRQ中断时,如果来了一个FIQ中断请求,那正在执行的IRQ中断处理程序会被抢断,ARM切换到FIQ模式去执行这个FIQ,所以FIQ比IRQ快多了。

另外FIQ的入口地址是0x1c,IRQ的入口地址是0x18。

注意:

banked register(影子寄存器)是ARM体系的CPU的一个特色,ARM CPU有7种工作模式,比如中断产生了,CPU就转换为irq或者fiq模式,ARM的寄存器比如R13,R14在各个模式下(除了system模式)都有一个叫R13,R14的寄存器,它们是独立的. 这样的同名寄存器就叫banked寄存器。 就是说有6个R13,名字相同,其实是不同的寄存器, 在某种模式下就只能看到这个模式下的R13。 举个例子程序运行当中突然中断产生了,开始在中断环境(模式)下执行中断处理函数,这时的R13是指向IRQ模式下的R13,不在是中断前的那个R13了。
ARM里banked的寄存器有,R8到R12(两个), R13,R14(各6个), SPSR(5个)。

我们知道,ARM有16个通用寄存器,这16个通用寄存器在指令中使用4个bit来标识,但是在不同的模式下,同样的4个bit 指向不同的物理寄存器,这些不同的物理寄存器就被称之为影子寄存器。不同的通用寄存器的影子寄存器个数也不相同,有的没有,有的只有1个,有的多达5个。要记住一点:所有的影子寄存器都是一个实际存在的物理寄存器。

ARM有6种工作模式,在不同的工作模式之间进行切换时,必须对R14等几个寄存器内的值进行保护,ARM采用banked register的机制有效的避免了在不同的状态下对这些寄存器进行现场保护,压栈和出栈操作不需要了,只需要直接在相应的工作模式下选用相应的寄存器。

0 0
原创粉丝点击