1. 程式人生 > >3.ARM異常中斷處理及程式設計

3.ARM異常中斷處理及程式設計

ARM異常中斷處理概述:
ARM異常中斷處理包括響應中斷、處理中斷、中斷返回等操作。
所以說當ARM異常中斷產生的時候,CPU在執行完當前指令後,PC跳轉到要執行的中斷處理程式處執行,執行完後再返回開始執行的下一條指令繼續順序執行原來的指令。

這裡我們需要注意:程式是怎麼執行完中斷服務程式後再返回原來的指令處繼續向下執行的?
Ans:這是因為CPU在進入相應中斷處理程式時會儲存被中斷的程式的現場,然後從中斷處理程式退出時再恢復被中斷的程式的執行現場。這就是我們常常聽到的保護現場和恢復現場。
Question:當異常出現後,Soc做什麼?所謂的保護現場和恢復現場又是在保護什麼,恢復什麼?
Ans:
1. 儲存處理器當前狀態、中斷遮蔽位以及各條件標誌位(也就是儲存中斷髮生時的CPSR暫存器值,以及一些共用暫存器的值)
2. 再設定當前程式狀態暫存器CPSR相應的位以及中斷執行模式時的棧。
3. 將中斷前的下一條要執行指令的地址儲存到LR中
4. 然後將程式計數器(PC)值設定成該異常中斷的中斷向量地址(這個地址裡存的有該異常中斷向量對應的中斷處理程式的首地址),從而跳轉到相應的異常中斷處理程式處執行。接到中斷請求後,ARM處理器會自動完成上面的步驟。然後執行完中斷處理程式後恢復開始儲存的中斷髮生時的一些狀態和暫存器的值以及要執行的下一條指令地址。

從上面我們可以大概知道,其實每個異常中斷對應的中斷向量表中的4個位元組的空間存放的是一條跳轉指令或向PC暫存器賦值的資料訪問指令,以讓CPU跳轉到相應的中斷處理程式開始執行。


注:由於每一種模式下,它們所使用的暫存器都會有不同之處,所以沒有沒有固定的說儲存哪些暫存器的值,我們根據的原則就是如果異常中斷進入的模式和中斷前正常執行程式時的模式有公用的暫存器則需要儲存原來的值,以免中斷執行模式破壞了原來暫存器中的值。(具體各種模式下所使用的暫存器我之前的在學彙編時的文章裡有)

總結:
我們簡單先把異常處理過程分成兩個階段:
1. 第一個階段是我們上面說的從響應中斷到PC跳轉到異常向量表
2. 第二個階段就是我們真正的進入異常中斷處理程式irq_handler後的事情



第一階段:
這一階段的完成,依賴於CPU設計時提供的異常向量表機制。主要是完成從異常發生到響應異常,然後儲存/恢復現場,通過異常向量表跳轉到真正的
異常中斷處理程式中。

第二階段:
這個階段主要就是完成識別多箇中斷源究竟哪一個發生了中斷,然後呼叫相應的中斷處理程式來處理這個中斷。
* S3C2440處理過程:

1. S3C2440中怎麼找到具體哪個中斷?在S3C2440中的中斷控制器有一個32bit暫存器,暫存器的每一個位對應一箇中斷源(為了支援更多中斷源,2440又設計了一個子中斷機制。也就是在剛剛說的這個暫存器(我們可以稱為一級暫存器)中有些位是多箇中斷源共用的,對於共用的可以繼續檢視子中斷暫存器來確定具體發生的是哪一個中斷。)
2. 怎麼找到對應的isr問題?首先給每個中斷做了個編號,進入isr_handler之後先通過查閱中斷源暫存器和子中斷暫存器確定中斷的編號,然後用這個編號去isr陣列(isr陣列是中斷初始化實現設定好的,就是把各個中斷的isr函式名組成一個數組,然後用中斷對應的編號作為索引來查詢這個陣列)中查詢得到isr地址,繼而開始執行相應的中斷處理程式。


* S5PV210處理過程:
1. S5PV210中怎麼找到具體那個中斷?因為S5PV210支援的中斷源很多,所以有四個32bit暫存器來表示中斷源(理論上是128箇中斷源,其實沒有,因為有些位是空的)。S5PV210不像S3C2440那樣,它沒有子中斷暫存器,每一箇中斷源都是並列的。當中斷髮生時,在irq_handler中一次去查詢這4箇中斷源暫存器來確定中斷源,既可以找到相應的中斷編號。
2. 怎麼找到對應的isr問題?由於S5PV210支援的中斷源很多,如果向S3C2440那樣一個個的尋找就太耗時間了。所以210是通過一些暫存器來解決每個中斷源對應的isr的尋找問題,也就是當發生相應中斷時,硬體會自動的將相應的isr推入一定的暫存器中,我們軟體只要去這個暫存器中執行函式就好了。具體看下一篇S5PV210中斷相關的暫存器講解。