ARM9 中斷管理

2021-06-20 10:52:00 字數 2827 閱讀 2470

s3c2410的中斷異常處理模組總共由以下暫存器構成

srcpnd(source pending register)

intmod(interrupt mode register)

intmsk(interrupt mask register)

priority( priority register)

intpnd(interrupt pending register)

intoffset(interrupt offset register)

subsrcpnd (interrupt sub source pending)

intsubmsk  (interrupt sub mask register)

下面我將講解每個暫存器在乙個中斷處理流程中所扮演的角色

srcpnd/ subsrcpnd這兩個暫存器在功能上是相同的,它們是中斷源引腳暫存器,在乙個中斷異常處理流程中,中斷訊號傳進中斷異常處理模組後首先遇到的就是srcpnd/ subsrcpnd,這兩個暫存器的作用是用於標示出哪個中斷請求被觸發。srcpnd的有效位為32,subsrcpnd 的有效位為11,它們中的每一位分別代表乙個中斷源。srcpnd為主中斷源引腳暫存器,subsrcpnd為副中斷源引腳暫存器。

每個位的初始值皆為0。假設現在系統觸發了timer0中斷,則第10bit將被置1,代表timer0中斷被觸發,該中斷請求即將被處理(若該中斷沒有被遮蔽的話)。subsrcpnd情況與srcpnd相同,這裡就不多講了。

intmod暫存器有效位為32位,每一位與srcpnd中各位相對應,它的作用是指定該位相應的中斷源處理模式(irq還是fiq)。若某位為0,則該位相對應的中斷按irq模式處理,為1則以fiq模式進行處理,該暫存器初始化值為0x00000000,即所有中斷皆以irq模式進行處理。(詳細請參考s3c2410操作手冊)。

intmsk/ intsubmsk 暫存器為中斷遮蔽暫存器 ,intmsk為主中斷遮蔽暫存器,intsubmsk為副中斷遮蔽暫存器。intmsk有效位為32,intsubmsk有效位為11,這兩個暫存器各個位與srcpnd和subsrcpnd分別對應。它們的作用是決定該位相應的中斷請求是否被處理。若某位被設定為1,則該位相對應的中斷產生後將被忽略(cpu不處理該中斷請求),設定為0則對其進行處理。這兩個暫存器初始化後的值是0xffffffff和0x7ff,既缺省情況下所有的中斷都是被遮蔽的。

到目前為止我們總共講解了srcpnd,intmod,intmsk,subsrcpnd,intsubmsk

intpnd 暫存器可能是整個中斷處理過程中我們要特別注意的乙個暫存器了,他的操作比較特別,怎麼特別?請聽我慢慢道來

正如你所見的,intpnd 暫存器與srcpnd長得一模一樣,但他們在中斷異常處理中卻扮演著不同的角色,如果說srcpnd是中斷訊號進入中斷處理模組後所經過的第乙個場所的話,那麼intpnd 則是中斷訊號在中斷處理模組裡經歷的最後乙個暫存器。它的每個位對應乙個中斷請求,若該位被置1,則表示相應的中斷請求被觸發,描述到這裡你可能會發現它不僅和srcpnd長得一模一樣,就連功能都一樣,其實不然,他們在功能上有著重大的區別。srcpnd是中斷源引腳暫存器,某個位被置1表示相應的中斷被觸發,但我們知道在同一時刻內系統可以觸發若干個中斷,只要中斷被觸發了,srcpnd的相應位便被置1,也就是說srcpnd 在同一時刻可以有若干位同時被置1,然而intpnd則不同,他在某一時刻只能有1個位被置1,intpnd 某個位被置1(該位對應的中斷在所有已觸發的中斷裡具有最高優先順序且該中斷沒有被遮蔽),則表示cpu即將或已經在對該位相應的中斷進行處理。於是我們可以有乙個總結:srcpnd說明了有什麼中斷被觸發了,intpnd說明了cpu即將或已經在對某乙個中斷進行處理。

特別注意:每當某乙個中斷被處理完之後,我們必須手動地把srcpnd/subsrcpnd , intpnd三個暫存器中與該中斷相應的位由1設定為0,剛才我說intpnd的操作很特別,它的特別之處就在於對當我們要把該暫存器中某個值為1的位設定為0時,我們不是往該位置0,而是往該位置1。假設srcpnd=0x00000003,intpnd=0x00000001,該值說明當前0號中斷和1號中斷被觸發,但當前正在被處理的是0號中斷,處理完畢後我們應該這樣設定intpnd和srcpnd:

srcpnd=0x00000002          //位0被置為0

intpnd =0x00000001          //位0被置為0(方法是往該位寫入1)

intoffset暫存器的功能則很簡單,它的作用只是用於表明哪個中斷正在被處理。

下面我用int_timer0, int_timer2和int_uart0三個中斷完整地介紹一次中斷異常處理。首先我們得做幾個假設:

假設1:這三個中斷的遮蔽被取消。

假設2:priority暫存器中arb_mode2,arb_mode5皆為0,既不進行優先順序的自動旋轉排序,任何時候

arbiter2,arbiter5控制的中斷組優先順序次序分別為0-1-2-3-4-5和1-2-3-4。

假設3:這三個中斷皆為irq型別。

假設4:這三個中斷同時被觸發。

int_timer0, int_timer2和int_uart0三個中斷被同時觸發,此時三個中斷訊號流向srcpnd暫存器,使該暫存器中的第10位,12位,28位被置為1,中斷訊號繼續向前流經intmask 暫存器,這三個中斷都沒有被遮蔽,於是訊號進一步流經intmode暫存器,這三個中斷皆為irq型別,故中斷訊號繼續向前流向priority暫存器,經過優先順序判斷,int_timer0中斷訊號使intpnd 暫存器的第10位置1(int_timer0優先順序最高),此時intoffset 暫存器的值為10,cpu轉向相應的中斷服務例程進行處理。處理完畢後,我們的程式將intpnd和srcpnd的第10置為0,至此int_timer0中斷處理完畢。此時srcpnd 的第12位,28位仍為1(這兩個中斷請求未被處理),故他們會繼續被cpu已剛才描述的方式進行處理

ARM9 中斷學習

中斷的概念 指 cpu 在正常執行程式時,由於內部或外部事件引起 cpu 暫時中止執行現行程式,轉 去執行請求 cpu 為其服務的那個外設或事件的服務程式,待該服務程式執行完後又返 回到被中止的程式這樣乙個過程。中斷的優先順序 為使系統能及時響應並處理發生的所有中斷,系統根據引起中斷事件的重要性和緊...

ARM9學習筆記之 MMU

我記得有一次我去應聘arm linux軟體工程師。結果被問到arm中的虛擬記憶體是怎麼管理的。由於我只對x86平台下的mmu了解,所以我被問倒了。原來我所學的只是皮毛。還有很多東西值得我去深入。要做arm linux下的驅動,熟悉虛擬記憶體應該是必須的。arm9中的虛擬記憶體是怎麼實現的呢?以下是我...

ARM9學習筆記之 彙編

arm系列晶元與pc系列 可能我說法不太準確 晶元在指令設計上就有本質的區別。arm中每條指令是精簡指令集要麼是32位,要麼是16位。而pc的指令是複雜指令集,一條指令可以由多個位元組組成。1.關於函式呼叫方法 在arm彙編中,函式呼叫非常靈活。1 bl指令 bl initmem 呼叫 initme...