請問irq中斷過程是怎樣的?
問題:irq中斷過程
回答:標準中斷步驟(irq):
1. aic已經正確程式設計,aic_svr也已經寫入正確的中斷服務程式的入口位址。且中斷已經使能
2. 位址0x18(irq的中斷向量位址)的指令為
ldr pc,[pc,#&f20]
當nirq到來,且cpsr的i位為0時,步驟如下:
① cpsr被拷貝到spsr_irq,當前程式計數器pc的值被儲存到irq鏈結暫存器(r14_irq),同時pc(r15)自身也被賦予了新值0x18。在接下來的時鐘裡(處理器向0x1c取指令),arm核使r14_ irq減4
②arm核心進入irq模式
③當指令ldr pc,[pc,#&f20]得到執行(arm為流水線結構,當前pc之前還有兩條指令)後,pc被賦予了aic_ivr的內容。讀取aic_ivr具有如下作用:
·將當前中斷設定為被掛起的最高優先順序中斷,並把它作為最高優先順序的中斷;當前中斷級別則設定為此中斷的優先順序。
·將nirq的訊號撤消(即使系統沒有用到向量功能,也必須去讀aic_ivr,以便將nirq撤消)。
·如果中斷為邊沿觸發,則讀取aic_ivr會自動將中斷清除
·將當前的中斷的優先順序推入堆疊
·返回當前中斷的aic_svr的值。
④上述步驟將程式跳到了對應的中斷服務程式。接下來的第一步是儲存鏈結暫存器lr(r14_irq)和spsr(spsr_irq)。如果需要在中斷返回時,把lr的值直接賦給程式計數器,則lr首先要減去4 才能儲存。否則在中斷返回時,lr要首先減去4之後才能拷貝給pc。
⑤清零cpsr的位i就可以使其他中斷不被遮蔽,再施加的nirq可以被核心接受。只要發生的中斷的優先順序高於當前中斷的優先順序,巢狀中斷就會發生。
⑥接著中斷例程可以儲存相應的暫存器以保護現場。如果此時有高優先順序中斷發生,則處理器將重複執行從步驟①開始的動作。要注意的是,如果中斷是電平敏感的,那麼在中斷結束前要清除中斷源。
⑦在退出中斷前要首先置位cpsr的位i,以便遮蔽其他中斷,保證多個中斷有序地完成。
⑧在結束中斷之前還必須執行一次對aic_eoicr的寫操作,向aic表明中斷已經完成。存放於堆疊的前乙個當前中斷優先順序將被彈出並作為當前中斷優先順序。如果此時系統又有乙個掛起的中斷,其優先順序比剛才結束的中斷的優先順序低(或相等)、但又高於從堆疊彈出來的中斷的優先順序,則將重新施加nirq;但是,中斷步驟不會立即開始,因為此時cpsr的i位是置位的。
⑨spsr(spsr_irq)被恢復。最後是鏈結暫存器lr恢復到pc。程式返回到中斷發生前之處。 spsr也恢復為cpsr,中斷遮蔽狀態恢復為spsr所指明的狀態。
注:spsr的位i是很重要的。如果在spsr恢復之後為置位狀態,則表明arm核正要遮蔽中斷,在執行遮蔽指令時被中斷。因此,spsr恢復後,遮蔽指令得以完成,亦即i被置位,
因而irq 被遮蔽。
核心中斷過程
為什麼需要中斷?1 外設的處理速度一般慢於cpu 2 cpu不能一直等外部事件 所以裝置必須有一種方法來通知cpu它的工作進度,這就是中斷。在linux驅動程式中,為裝置實現乙個中斷 步驟 1 向核心註冊中斷 2 實現中斷處理函式 cpu如何識別中斷 在intel x86中可以支援256中向量中斷,...
ATMEL精妙的IRQ中斷處理過程
a 從棧位址開始,棧頂為at91sam7s64的16k片內ram盡頭0x00204000 irq stack size 3 8 4 fiq stack size 0x004 abt stack size 0x004 und stack size 0x004 svc stack size 0x800 ...
核心IRQ中斷向量
首先看一下vector irq的定義,此每處理器陣列變數,儲存每個處理器上中斷向量所對應的中斷號,其以中斷向量值為索引。系統中定義了256個中斷向量。相關 如下 typedef int vector irq t nr vectors define per cpu vector irq t,vecto...