IRQ和FIQ是ARM處理器的兩種編程模式。IRQ是指中斷模式,FIR是指快速中斷模式。對於 FIQ 你必須盡快處理你的事情並離開這個模式。IRQ 可以被 FIQ 所中斷,但 IRQ 不能中斷 FIQ。為了使 FIQ 更快,所以這種模式有更多的影子寄存器。FIQ 不能調用 SWI(軟件中斷)。FIQ 還必須禁用中斷。如果一個 FIQ 例程必須重新啟用中斷,則它太慢了,並應該是 IRQ 而不是 FIQ。
對FIQ你必須進快處理中斷請求,並離開這個模式。
IRQ可以被FIQ所中斷,但FIQ不能被IRQ所中斷。在處理FIQ時必須要關閉中斷。
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。