文章1-FIQ和IRQ區別
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。
原文地址:http://www.cublog.cn/u2/83842/showart_1404725.html
文章2-ARM的FIQ為何比IRQ快:
1。FIQ的優先順序比IRQ高。
2。FIQ模式下,比IRQ模式多了幾個獨立的寄存器。
不要小看這幾個寄存器,ARM在編譯的時候,如果你FIQ中斷處理常式足夠用這幾個獨立的寄存器來運作,它就不會進行通用寄存器的壓棧,這樣也省了一些時間。
3。FIQ的中斷向量地址在0x0000001C,而IRQ的在0x00000018。(也有的在FFFF001C以及FFFF0018)
寫過完整彙編系統的都比較明白這點的差別,18隻能放一條指令,為了不與1C處的FIQ衝突,這個地方只能跳轉,而FIQ不一樣,1C以後沒有任何中斷向量表了,這樣可以直接在1C處放FIQ的中斷處理常式,由於跳轉的範圍限制,至少少了一條跳轉指令。
4。IRQ和FIQ的響應延遲有區別
IRQ的響應並不及時,從Verilog模擬來看,IRQ會延遲幾個指令周期才跳轉到中斷向量處,看起來像是在等預取的指令執行完。FIQ的響應不清楚,也許比IRQ快。
原文地址:http://blog.csdn.net/masxcy/archive/2009/06/26/4301723.aspx