ARM處理器異常中斷處理概述
當異常中斷發生時,系統執行完當前指令後,將跳轉到相應的異常中斷處理程序處執行。當異常中斷處理程序執行完成後,程序返回到發生中斷的指令的下一條指令處執行。在進入異常中斷處理程序時,要保存被中斷的程序的執行現場。從異常中斷處理程序退出時,要恢復被中斷的程序的執行現場。ARM體系中通常在存儲地址的低端固化了一個32字節的硬件中斷向量表,用來指定各異常中斷及其處理程序的對應關系。當一個異常出現以後,ARM微處理器會執行以下幾步操作:
1)保存處理器當前狀態、中斷屏蔽位以及各條件標志位;
2)設置當前程序狀態寄存器CPSR中相應的位;
3)將寄存器lr_mode設置成返回地址;
4)將程序計數器(PC)值設置成該異常中斷的中斷向量地址,從而跳轉到相應的異常中斷處理程序處執行。
在接收到中斷請求以後, ARM處理器內核會自動執行以上四步,程序計數器PC總是跳轉到相應的固定地址。從異常中斷處理程序中返回包括下面兩個基本操作:
1)恢復被屏蔽的程序的處理器狀態;
2)返回到發生異常中斷的指令的下一條指令處繼續執行。
當異常中斷發生時,程序計數器PC所指的位置對於各種不同的異常中斷是不同的,同樣,返回地址對於各種不同的異常中斷也是不同的。例外的是,復位異常中斷處理程序不需要返回,因為整個應用系統是從復位異常中斷處理程序開始執行的。
S3C2440的中斷寄存器:
1.中斷分兩大類:內部中斷和外部中斷。
2.外部中斷。24個外部中斷占用GPF0-GPF7(EINT0-EINT7),GPG0-GPG15(EINT8-EINT23)。用這些腳做中斷輸入,則必須配置引腳為中斷,並且不要上拉。具體參考datesheet數據手冊。
寄存器:EXTINT0-EXTINT2:三個寄存器設定EINT0-EINT23的觸發方式。
EINTFLT0-EINTFLT3:控制濾波時鐘和濾波寬度。
EINTPEND:這個是中斷掛起寄存器,清除時要寫1,後面還有幾個是寫1清除。當一個外部中斷(EINT4-EINT23)發生後,那麼相應的位會被置1。為什麼沒有EINT0-EINT3,呵呵,看看SRCPND就知道了,裡面沒有EINT4-EINT23的位子,所以有了EINTPEND。
EINTMASK:這個簡單,是屏蔽中斷用的,也就是說位為1時,此次中斷無效。
3.內部中斷。內部中斷有8個寄存器,下面逐一來看。
寄存器:SUBSRCPND:當一個中斷發生後,那麼相應的位會被置1,表示一個中斷發生了。
INTSUBMSK:與上一個是一伙的,中斷屏蔽寄存器,具體屏蔽什麼,自己看手冊去吧。
INTMOD:中斷的方式。一個中斷可以是普通中斷,也可以是快中斷,在這裡設置,但只能有一個快中斷。
PRIORITY :優先級寄存器,不說了。
SRCPND :當一個中斷發生後,那麼相應的位會被置1,表示一個或一類中斷發生了。
INTMSK :中斷屏蔽寄存器。
INTPND :中斷發生後,SRCPND中會有bit置1,可能好幾個(因為同時可能發生幾個中斷),這些中斷會由優先級仲裁器選出一個最緊迫的,然後吧把INTPND中相應位置1,所以同一時間只有一位是1。也就是說前面的寄存器置1 是表示發生了,只有INTPND置1,CPU才會處理。(這句話相當重要,cpu在某一時刻可能有很多中斷產生,也就是說subsrcpnd或者srcpnd會有很多bit被置位,但是cpu只能處理一個中斷,所以通過中斷優先級的設置,可以得到一個優先級最高的中斷,cpu對他進行處理,打個比方,就好像世界杯,小組賽中,每個小組都有一個隊出現,但是最終的冠軍只能是一個隊,就好比,最後得到cpu處理的只有一個中斷,道理一樣!!!)
INTOFFSET :用來表示INTPND中哪一位置1了,好讓你查詢,普通中斷跳轉時查詢用。清除INTPND、SRCPND時自動清除。
4、各寄存器之間的關系: