ARM中斷處理分析
中斷的基本含義應(yīng)該是允許CPU在執(zhí)行某個(gè)代碼序列的過程中停下來執(zhí)行另外一個(gè)代碼序列,這里有兩層意思,一個(gè)是要切換到另一個(gè)場(chǎng)景,另一個(gè)是當(dāng)執(zhí)行完畢之后必須能夠恢復(fù)原來的場(chǎng)景。
本文引用地址:http://m.butianyuan.cn/article/201611/316860.htm首先討論如何才能切換到一個(gè)新的場(chǎng)景,
當(dāng)一條指令的執(zhí)行完之后,CPU會(huì)檢查有沒有中斷產(chǎn)生,如果有就halt當(dāng)前流水線。重載PC寄存器后重新啟動(dòng)流水線。
ARM7一般為3級(jí)流水線價(jià)格,分別是取指、譯碼和執(zhí)行。PC寄存器中存放的是當(dāng)前時(shí)刻(CPU機(jī)器時(shí)鐘周期)取指操作的目標(biāo)地址,即CPU即將執(zhí)行的指令的地址由PC寄存器指定,正常情況下PC指針的內(nèi)容是CPU自動(dòng)調(diào)整的——每個(gè)時(shí)鐘周期自動(dòng)+4,在發(fā)生跳轉(zhuǎn)時(shí),可以通過直接執(zhí)行修改PC值的指令來實(shí)現(xiàn)。中斷的本質(zhì)就是一次跳轉(zhuǎn),跟函數(shù)調(diào)用其實(shí)沒有什么分別(只不過增加了一些硬件支持),所以這里第一步是將PC值寫成對(duì)應(yīng)的中斷入口地址,比如IRQ就是0x18.
接下來還需要切換ARM的內(nèi)核模式到相應(yīng)的中斷模式。寫完P(guān)C值以后,下一個(gè)時(shí)鐘周期流水線就開始從0x18處取指,然后譯碼、執(zhí)行。中斷入口地址處存放的是中斷向量表,所謂中斷向量就是另一個(gè)跳轉(zhuǎn)指令,比如LDR PC, [PC,#24] ,執(zhí)行完這個(gè)跳轉(zhuǎn)之后理論上CPU就已經(jīng)從一個(gè)新的地址開始執(zhí)行了。這個(gè)過程的實(shí)現(xiàn)是軟硬件結(jié)合的結(jié)果,硬件負(fù)責(zé)第一次加載PC,而軟件負(fù)責(zé)再次修改PC值,將程序指向指定的代碼序列。
還必須考慮如何恢復(fù)原執(zhí)行場(chǎng)景,這里跟剛才一樣,一部分工作由硬件實(shí)現(xiàn),另一部分必須由軟件負(fù)責(zé)實(shí)現(xiàn)。因?yàn)榈谝淮涡薷腜C到中斷入口地址是硬件完成的,所以第一次保存中斷現(xiàn)場(chǎng)的工作也只能由硬件完成,這個(gè)工作包括將PC被修改前的值保存到LR_irq寄存器中,并將當(dāng)前PSR寄存器的值保存到SPSR_irq中。為了實(shí)現(xiàn)中斷嵌套,可能硬件還需要將當(dāng)前中斷信息壓棧(硬件棧,而不是內(nèi)存)以便當(dāng)嵌套發(fā)生時(shí)用于恢復(fù)。
當(dāng)程序執(zhí)行到ISR后,硬件的工作基本完成,軟件代碼將在當(dāng)前CPU模式下運(yùn)行,這可能會(huì)修改LR和PSR等寄存器,所以在執(zhí)行中斷處理代碼之前需要對(duì)這兩個(gè)寄存器進(jìn)行保護(hù),否則一旦被破壞以后就無法恢復(fù)。這里同樣需要保護(hù)的還包括工作寄存器等。
軟件的職責(zé)還包括清掉設(shè)備中斷標(biāo)志。
最后,當(dāng)ISR結(jié)束時(shí),軟件負(fù)責(zé)將CPU恢復(fù)到中斷前的狀態(tài),然后利用已保存的LR地址跳轉(zhuǎn)到中斷時(shí)執(zhí)行代碼的下一行代碼開始繼續(xù)執(zhí)行。
當(dāng)涉及到中斷嵌套的情況時(shí),重復(fù)上述過程,只是硬件此時(shí)不需要在改變CPU的工作模式。
當(dāng)涉及到有操作系統(tǒng)的時(shí)候,這個(gè)過程會(huì)變得稍微復(fù)雜一些。
首先在進(jìn)入中斷之前OS需要記錄當(dāng)前中斷嵌套的層數(shù),并且在中斷退出之后恢復(fù)到被中斷上下文之前做一次判斷,因?yàn)橹袛喑绦蚩赡芨淖儺?dāng)前就緒態(tài)優(yōu)先級(jí)最高的任務(wù),如果此時(shí)優(yōu)先級(jí)最高的任務(wù)不再是先前被中斷的任務(wù)時(shí),得到恢復(fù)并繼續(xù)執(zhí)行的將是該當(dāng)前優(yōu)先級(jí)最高的就緒態(tài)的任務(wù)。
這里只有在中斷嵌套層數(shù)為0時(shí)OS才會(huì)提供這樣一次機(jī)會(huì),否則將恢復(fù)到被中斷的ISR中繼續(xù)執(zhí)行中斷處理程序。
評(píng)論