看看FIQ和IRQ

简介: 看看FIQ和IRQ


来一起跟着前辈学习一下什么事FIQ和IRQ

1、FIQ和IRQ的区别?

FIQ和IRQ是两种不同类型的中断,ARM为了支持这两种不同的中断,提供了对应的叫做FIQ和IRQ处理器模式(ARM有7种处理模式)。(这,我觉得应该是支持不同的场景比较合适。)

一般的中断控制器里我们可以配置与控制器相连的某个中断输入是FIQ还是IRQ,所以一个中断是可以指定为FIQ或者IRQ的,为了合理,要求系统更快响应,自身处理所耗时间也很短的中断设置为FIQ,否则就设置了IRQ。(脑子里还记得我们当时说的为什么FIQ会运行这么快?以及什么场景下会用到FIQ?)

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

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

2、为什么FIQ比IRQ快?

简单的对比的话就是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先处理。

(这句话在ARMv8上是不太适用的,看过《代码改变世界》博主的一篇文章指出了ARM的官方文档说的优先级相同。)

在symbian系统里,当CPU处于FIQ模式处理FIQ 中断的过程中,预取指令异常,未定义指令异常,软件中断全被禁止,所有的中断被屏蔽。

所以FIQ就会很快执行,不会被其他异常或者中断打断,所以它又比 IRQ快了。

而IRQ不一样,当ARM处在IRQ模式处理IRQ中断时,如果来了一个FIQ中断请求,那正在执行的IRQ中断处理程序会被抢断,ARM切换到FIQ模式去执行这个FIQ,所以FIQ比IRQ快多了。

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

小结

  • 1、为什么FIQ会运行这么快?
  • 2、以及什么场景下会用到FIQ?
目录
相关文章
|
存储 传感器 编解码
STM32外设系列—BH1750
本文详细介绍了BH1750的特点,原理图,IIC通信协议。给出了BH1750程序设计,能够实时获取周围环境光照强度。最后,给出了两种拓展应用,并说明了实现思路。
1331 0
STM32外设系列—BH1750
stm32 GPIO 中断的使用
stm32 GPIO 中断的使用
1340 0
Interrupt
Thread#interrupt()的作用其实也不是中断线程,而是通知线程应该中断了 Thread#interrupted()检查当前中断标识(即查看当前中断信号是true还是false),并清除中断信号 Thread#isInterrupted()检查当前中断标识
3874 0

热门文章

最新文章