ARM 之FIQ(快速中斷) IRQ(中斷)
IRQ,F(xiàn)IQ定義: 這就是個(gè)普通中斷,當(dāng)我們程序定義了該中斷,并且在程序運(yùn)行的時(shí)候產(chǎn)生了IRQ中斷,則此時(shí)的芯片是這樣運(yùn)行的------中斷處理器吧利用IRQ請求線來高速ARM,ARM就知道有個(gè)IRQ中斷來了,然后ARM切換到IRQ模式運(yùn)行。類似的如果該中斷設(shè)置為FIQ,那么當(dāng)該中斷產(chǎn)生的時(shí)候,中斷處理器通過FIQ請求線告訴ARM,ARM就知道有個(gè)FIQ中斷來了,然后切換到FIQ模式運(yùn)行。
那么問題來啦,為何要有這兩個(gè)中斷,或者說為何分成這兩種中斷,?、原因很簡單,速度不同,F(xiàn)IQ 也就是快速中斷的速度快,那么問題又來了,為何就FIQ速度快???
原因:1:ARM的FIQ模式提供了更多的banked寄存器,r8到r14還有SPSR,而IRQ模式就沒有那么多,R8,R9,R10,R11,R12對應(yīng)的banked的寄存器就沒有,這就意味著在ARM的IRQ模式下,中斷處理程序自己要保存R8到R12這幾個(gè)寄存器,然后退出中斷處理時(shí)程序要恢復(fù)這幾個(gè)寄存器,而FIQ模式由于這幾個(gè)寄存器都有banked寄存器,模式切換時(shí)CPU自動(dòng)保存這些值到banked寄存器,退出FIQ模式時(shí)自動(dòng)恢復(fù),所以這個(gè)過程FIQ比IRQ快.不要小看這幾個(gè)寄存器,ARM在編譯的時(shí)候,如果你FIQ中斷處理程序足夠用這幾個(gè)獨(dú)立的寄存器來運(yùn)作,它就不會(huì)進(jìn)行通用寄存器的壓棧,這樣也省了一些時(shí)間。
2:FIQ比IRQ有更高優(yōu)先級(jí),如果FIQ和IRQ同時(shí)產(chǎn)生,那么FIQ先處理。
3:在symbian系統(tǒng)里,當(dāng)CPU處于FIQ模式處理FIQ中斷的過程中,預(yù)取指令異常,未定義指令異常,軟件中斷全被禁止,所有的中斷被屏蔽。所以FIQ就會(huì)很快執(zhí)行,不會(huì)被其他異?;蛘咧袛啻驍?,所以它又比IRQ快了。而IRQ不一樣,當(dāng)ARM處理IRQ模式處理IRQ中斷時(shí),如果來了一個(gè)FIQ中斷請求,那正在執(zhí)行的IRQ中斷處理程序會(huì)被搶斷,ARM切換到FIQ模式去執(zhí)行這個(gè)FIQ,所以FIQ比IRQ快多了。
4:另外FIQ的入口地址是0x1c,IRQ的入口地址是0x18。寫過完整匯編系統(tǒng)的都比較明白這點(diǎn)的差別,18只能放一條指令,為了不與1C處的FIQ沖突,這個(gè)地方只能跳轉(zhuǎn),而FIQ不一樣,1C以后沒有任何中斷向量表了,這樣可以直接在1C處放FIQ的中斷處理程序,由于跳轉(zhuǎn)的范圍限制,至少少了一條跳轉(zhuǎn)指令。