<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > ARM處理器s3c2410的中斷異常處理

ARM處理器s3c2410的中斷異常處理

作者: 時(shí)間:2010-01-27 來(lái)源:網(wǎng)絡(luò ) 收藏

在進(jìn)入正題之前,我想先把20T的向量表(Exception Vectors)做一個(gè)簡(jiǎn)短的介紹。

20T的向量表有兩種存放方式,一種是低端存放(從0x00000000處開(kāi)始存放),另一種是高端存放(從0xfff000000處開(kāi)始存放)。關(guān)于為什么要分兩種方式進(jìn)行存放這點(diǎn)我將在介紹MMU的文章中進(jìn)行說(shuō)明,本文采用低端模式。20T能處理有8個(gè),他們分別是:

Reset,Undefined

instruction,Software Interrupt,Abort (prefetch),Abort

(data),Reserved,IRQ,FIQ

下面是某個(gè)采用低端模式的系統源碼片段:

/*****************************************************************************

_start:

b

Handle_Reset

b HandleUndef

b HandleSWI

b

HandlePrefetchAbort

b HandleDataAbort

b

HandleNotUsed

b HandleIRQ

b

HandleFIQ

…..

..

other

codes

..

.

*****************************************************************************/

上面這部分片段一般出現在一個(gè)名叫“head.s”的匯編文件的里,“bHandle_Reset”這條語(yǔ)句就是系統上電之后運行的第一條語(yǔ)句。也就是說(shuō)這部分代碼的二進(jìn)制碼必須位于內存的最開(kāi)始部分(這正是低端存放模式),因為上電后CPU會(huì )從SDRAM的0x00000000處取第一條指令并執行。


Address

Instruct

0x00000000: b

Handle_Reset

0x00000004: b

HandleUndef

0x00000008: b

HandleSWI

0x0000000C: b

HandlePrefetchAbort

0x00000010: b

HandleDataAbort

0x00000014: b

HandleNotUsed

0x00000018: b

HandleIRQ

0x0000001C: b

HandleFIQ

上面是該程序段在系統上電后加載到內存后的分布情況,我們可以看到每條指令占用了4個(gè)字節。上電后,PC指針會(huì )跳轉到Handle_Reset處開(kāi)始運行。以后系統每當有異常出現,則CPU會(huì )根據異常號,從內存的0x00000000處開(kāi)始查表做相應的處理,比如系統觸發(fā)了一個(gè)IRQ異常,IRQ為第6號異常,則CPU將把PC指向0x00000018地址(4*6=24= 0x00000018)處運行,該地址的指令是跳轉到“異常服務(wù)例程”(HandleIRQ)處運行。以上就是我對異常向量表的一個(gè)簡(jiǎn)單介紹?,F在可以進(jìn)入我們文章的主題 “異常處理”,s3c2410的分快中斷(FIQ)和普通中斷(IRQ),我們討論的重點(diǎn)是普通中斷(IRQ)。

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)

下面我將講解每個(gè)寄存器在一個(gè)中斷處理流程中所扮演的角色

SRCPND/ SUBSRCPND這兩個(gè)寄存器在功能上是相同的,它們是中斷源引腳寄存器,在一個(gè)中斷異常處理流程中,中斷信號傳進(jìn)中斷異常處理模塊后首先遇到的就是SRCPND/ SUBSRCPND,這兩個(gè)寄存器的作用是用于標示出哪個(gè)中斷請求被觸發(fā)。SRCPND的有效位為32,SUBSRCPND 的有效位為11,它們中的每一位分別代表一個(gè)中斷源。SRCPND為主中斷源引腳寄存器,SUBSRCPND為副中斷源引腳寄存器。

這里列舉出SRCPND的各個(gè)位信息:

每個(gè)位的初始值皆為0。假設現在系統觸發(fā)了TIMER0中斷,則第10bit將被置1,代表TIMER0中斷被觸發(fā),該中斷請求即將被處理(若該中斷沒(méi)有被屏蔽的話(huà))。SUBSRCPND情況與SRCPND相同,這里就不多講了。

INTMOD寄存器有效位為32位,每一位與SRCPND中各位相對應,它的作用是指定該位相應的中斷源處理模式(IRQ還是FIQ)。若某位為0,則該位相對應的中斷按IRQ模式處理,為1則以FIQ模式進(jìn)行處理,該寄存器初始化值為0x00000000,即所有中斷皆以IRQ模式進(jìn)行處理。(詳細請參考s3c2410操作手冊)。INTMSK/ INTSUBMSK 寄存器為中斷屏蔽寄存器,INTMSK為主中斷屏蔽寄存器,INTSUBMSK為副中斷屏蔽寄存器。INTMSK有效位為32,INTSUBMSK有效位為11,這兩個(gè)寄存器各個(gè)位與SRCPND和SUBSRCPND分別對應。它們的作用是決定該位相應的中斷請求是否被處理。若某位被設置為1,則該位相對應的中斷產(chǎn)生后將被忽略(CPU不處理該中斷請求),設置為0則對其進(jìn)行處理。這兩個(gè)寄存器初始化后的值是0xFFFFFFFF和0x7FF,既默認情況下所有的中斷都是被屏蔽的。

到目前為止我們總共講解了SRCPND,INTMOD,INTMSK,SUBSRCPND,INTSUBMSK五個(gè)寄存器,在繼續講解PRIORITY寄存器之前我們先來(lái)看一張圖。

先弄清楚一點(diǎn),現在要討論的是一個(gè)中斷優(yōu)先級的判斷問(wèn)題。為什么會(huì )有中斷有先級的問(wèn)題呢?我們知道CPU某個(gè)時(shí)刻只能對一個(gè)中斷源進(jìn)行中斷處理,如果現在有3個(gè)中斷同時(shí)發(fā)生了,那CPU要按什么順序處理這個(gè)3個(gè)中斷呢?這正是引入優(yōu)先級判斷的原因所在,通過(guò)優(yōu)先級判斷,CPU可以按某種順序逐個(gè)處理中斷請求。3sc2410的優(yōu)先級判斷分為兩級。

如上圖所示,SRCPND寄存器對應的32個(gè)中斷源總共被分為6個(gè)組,每個(gè)組由一個(gè)ARBITER(0~5)寄存器對其進(jìn)行管理。中斷必須先由所屬組的ARBITER(0~5)進(jìn)行第一次優(yōu)先級判斷(第一級判斷)后再發(fā)往ARBITER6進(jìn)行最終的判斷(第二級判斷)。ARBITER(0~5)這六個(gè)組的優(yōu)先級已經(jīng)固定,我們無(wú)法改變,也就是說(shuō)由ARBITER0控制的該組中斷優(yōu)先級最高(該組產(chǎn)生的中斷進(jìn)行第一級判斷后永遠會(huì )以REQ0向ARBITER6傳遞過(guò)去)其次是ARBITER1, ARBITER2, ARBITER4, ARBITER4, ARBITER5.我們能夠控制的是某個(gè)組里面各個(gè)中斷的優(yōu)先級順序。怎么控制?通過(guò)PRIORITY寄存器進(jìn)行控制:]

以下是PRIORITY寄存器各個(gè)位的參數表

從表上我們可以知道PRIORITY寄存器內部各個(gè)位被分為兩種類(lèi)型,一種是ARB_MODE,另一種為ARB_SEL, ARB_MODE類(lèi)型有5組對應ARBITER(2~6),ARB_SEL類(lèi)型有7組對應ARBITER(0~6)?,F在我將以ARBITER2為例,講解中斷組與PRIORITY寄存器中ARB_SEL, ARB_MODE之間的相互關(guān)系。

首先我們看到ARBITER2寄存器管理的該組中斷里包括了6個(gè)中斷,分別是INT_TIMER0,INT_TIMER1,INT_TIMER2,INT_TIMER3,INT_TIMER4,INT_UART2,她們的默認中斷請求號分別為REQ0,REQ1,REQ2,REQ3,REQ4,REQ5。我們先看PRIORITY寄存器中的ARB_SEL2,該參數由兩個(gè)位組成,初始值為00。從該表可以看出00定義了一個(gè)順序0-1-2-3-4-5,這個(gè)順序就是這組中斷組的優(yōu)先級排列,這個(gè)順序指明了以中斷請求號為0(REQ0)的INT_TIMER0具有最高的中斷優(yōu)先級,其次是INT_TIMER1,INT_TIMER2…。假設現在A(yíng)RB_SEL2的值被我們設置為01。則一個(gè)新的優(yōu)先級次序將被使用,01對應的優(yōu)先級次序為0-2-3-4-1-5,從中可以看出優(yōu)先級最高和最低的中斷請求和之前沒(méi)有變化,但本來(lái)處于第2優(yōu)先級的INT_TIMER1中斷現在變成了第5優(yōu)先級。從ARB_SEL2被設置為00,01,10,11各個(gè)值所出現的情況我們可以看出,除最高和最低的優(yōu)先級不變以外,其他各個(gè)中斷的優(yōu)先級其實(shí)是在做一個(gè)旋轉排列(rotate)。為了達到對各個(gè)中斷平等對待這一目標,我們可以讓優(yōu)先級次序在每個(gè)中斷請求被處理完之后自動(dòng)進(jìn)行一次旋轉,如何自動(dòng)讓它旋轉呢?我們可以通過(guò)ARB_MODE2達到這個(gè)目的,該參數只有1個(gè)bit,置1代表開(kāi)啟對應中斷組的優(yōu)先級次序旋轉,0則為關(guān)閉。事實(shí)上當該位置為1之后,每處里完某個(gè)組的一個(gè)中斷后,該組的ARB_SEL便遞增在1(達到11后恢復為00)。

現在我們另ARB_MODE2=1,ARB_SEL2=00則當前ARBITER2的優(yōu)先級順序為0-1-2-3-4-5,假設現在該組的1號中斷請求INT_TIMER1和2號中斷請求INT_TIMER2被同時(shí)觸發(fā),CPU根據優(yōu)先級判斷后決定先把INT_TIMER1中斷向ARBITER6進(jìn)行發(fā)送(在A(yíng)RBITER6做第最終優(yōu)先級判斷),接著(zhù)再向ARBITER6發(fā)送INT_TIMER2中斷。請注意,在INT_TIMER1被處理完畢后,該組中段的優(yōu)先級次序被自動(dòng)做了一次旋轉,旋轉后ARBITER2的優(yōu)先級順序變?yōu)?-2-3-4-1-5。假設之后某個(gè)時(shí)刻該組的INT_TIMER1和INT_TIMER2又被同時(shí)觸發(fā),則此時(shí)CPU優(yōu)先處理的會(huì )是INT_TIMER2。若我們另ARB_MODE2=0,則改組的中斷優(yōu)先級次序在任何情況下都不做任何改變,除非我們人為地重新設置了ARB_SEL2的值。

INTPND寄存器可能是整個(gè)中斷處理過(guò)程中我們要特別注意的一個(gè)寄存器了,他的操作比較特別,怎么特別?請聽(tīng)我慢慢道來(lái).

先看一下該寄存器各位詳細功能列表

正如你所見(jiàn)的,INTPND寄存器與SRCPND長(cháng)得一模一樣,但他們在中斷異常處理中卻扮演著(zhù)不同的角色,如果說(shuō)SRCPND是中斷信號進(jìn)入中斷處理模塊后所經(jīng)過(guò)的第一個(gè)場(chǎng)所的話(huà),那么INTPND則是中斷信號在中斷處理模塊里經(jīng)歷的最后一個(gè)寄存器。它的每個(gè)位對應一個(gè)中斷請求,若該位被置1,則表示相應的中斷請求被觸發(fā),描述到這里你可能會(huì )發(fā)現它不僅和SRCPND長(cháng)得一模一樣,就連功能都一樣,其實(shí)不然,他們在功能上有著(zhù)重大的區別。SRCPND是中斷源引腳寄存器,某個(gè)位被置1表示相應的中斷被觸發(fā),但我們知道在同一時(shí)刻內系統可以觸發(fā)若干個(gè)中斷,只要中斷被觸發(fā)了,SRCPND的相應位便被置1,也就是說(shuō)SRCPND在同一時(shí)刻可以有若干位同時(shí)被置1,然而INTPND則不同,他在某一時(shí)刻只能有1個(gè)位被置1,INTPND某個(gè)位被置1(該位對應的中斷在所有已觸發(fā)的中斷里具有最高優(yōu)先級且該中斷沒(méi)有被屏蔽),則表示CPU即將或已經(jīng)在對該位相應的中斷進(jìn)行處理。于是我們可以有一個(gè)總結:SRCPND說(shuō)明了有什么中斷被觸發(fā)了,INTPND說(shuō)明了CPU即將或已經(jīng)在對某一個(gè)中斷進(jìn)行處理。

特別注意:每當某一個(gè)中斷被處理完之后,我們必須手動(dòng)地把SRCPND/SUBSRCPND , INTPND三個(gè)寄存器中與該中斷相應的位由1設置為0,剛才我說(shuō)INTPND的操作很特別,它的特別之處就在于對當我們要把該寄存器中某個(gè)值為1的位設置為0時(shí),我們不是往該位置0,而是往該位置1。假設SRCPND=0x00000003,INTPND=0x00000001,該值說(shuō)明當前0號中斷和1號中斷被觸發(fā),但當前正在被處理的是0號中斷,處理完畢后我們應該這樣設置INTPND和SRCPND:

SRCPND=0x00000002

//位0被置為0

INTPND =0x00000001

//位0被置為0(方法是往該位寫(xiě)入1)

INTOFFSET寄存器的功能則很簡(jiǎn)單,它的作用只是用于表明哪個(gè)中斷正在被處理。下面是該寄存器各位詳細功能列表

若當前INT_TIMER0被觸發(fā)了,則該寄存器的值為10,以此類(lèi)推。

現在我把整個(gè)中斷流程用一個(gè)圖加以說(shuō)明

以上這個(gè)圖清楚地說(shuō)明了一個(gè)中斷異常處理流程。

下面我用INT_TIMER0,INT_TIMER2和INT_UART0三個(gè)中斷完整地介紹一次中斷異常處理。首先我們得做幾個(gè)假設:

假設1:這三個(gè)中斷的屏蔽被取消。

假設2:PRIORITY寄存器中ARB_MODE2,ARB_MODE5皆為0,既不進(jìn)行優(yōu)先級的自動(dòng)旋轉排序,任何時(shí)候ARBITER2,ARBITER5控制的中斷組優(yōu)先級次序分別為0-1-2-3-4-5和1-2-3-4。

假設3:這三個(gè)中斷皆為IRQ類(lèi)型。

假設4:這三個(gè)中斷同時(shí)被觸發(fā)。

INT_TIMER0, INT_TIMER2和INT_UART0三個(gè)中斷被同時(shí)觸發(fā),此時(shí)三個(gè)中斷信號流向SRCPND寄存器,使該寄存器中的第10位,12位,28位被置為1,中斷信號繼續向前流經(jīng)INTMASK寄存器,這三個(gè)中斷都沒(méi)有被屏蔽,于是信號進(jìn)一步流經(jīng)INTMODE寄存器,這三個(gè)中斷皆為IRQ類(lèi)型,故中斷信號繼續向前流向PRIORITY寄存器,經(jīng)過(guò)優(yōu)先級判斷,INT_TIMER0中斷信號使INTPND 寄存器的第10位置1(INT_TIMER0優(yōu)先級最高),此時(shí)INTOFFSET 寄存器的值為10,CPU轉向相應的中斷服務(wù)例程進(jìn)行處理。處理完畢后,我們的程序將INTPND和SRCPND的第10置為0,至此INT_TIMER0中斷處理完畢。此時(shí)SRCPND 的第12位,28位仍為1(這兩個(gè)中斷請求未被處理),故他們會(huì )繼續被CPU已剛才描述的方式進(jìn)行處理。



關(guān)鍵詞: ARM9 S3C2410 中斷 異常

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>