當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式教程
[導(dǎo)讀]s3c2410中斷異常處理

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

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

Reset,Undefined

instruction,Software Interrupt,Abort (prefetch),Abort

(data),Reserved,IRQ,F(xiàn)IQ

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

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

_start:

b       

Handle_Reset

b        HandleUndef

b        HandleSWI

b       

HandlePrefetchAbort

b        HandleDataAbort

b       

HandleNotUsed

b        HandleIRQ

b       

HandleFIQ

…..

..

other

codes

..

.

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

上面這部分片段一般出現(xiàn)在一個(gè)名叫“head.s”的匯編文件的里,“b       

Handle_Reset”這條語(yǔ)句就是系統(tǒng)上電之后運(yùn)行的第一條語(yǔ)句。也就是說(shuō)這部分代碼的二進(jìn)制碼必須位于內(nèi)存的最開(kāi)始部分(這正是低端存放模式),因?yàn)樯想姾驝PU會(huì)從SDRAM的0x00000000處取第一條指令并執(zhí)行。


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

上面是該程序段在系統(tǒng)上電后加載到內(nèi)存后的分布情況,我們可以看到每條指令占用了4個(gè)字節(jié)。

上電后,PC指針會(huì)跳轉(zhuǎn)到Handle_Reset處開(kāi)始運(yùn)行。以后系統(tǒng)每當(dāng)有異常出現(xiàn),則CPU會(huì)根據(jù)異常號(hào),從內(nèi)存的0x00000000處開(kāi)始查表做相應(yīng)的處理,比如系統(tǒng)觸發(fā)了一個(gè)IRQ異常,IRQ為第6號(hào)異常,則CPU將把PC指向0x00000018地址(4*6=24=

0x00000018)處運(yùn)行,該地址的指令是跳轉(zhuǎn)到“中斷異常服務(wù)例程”(HandleIRQ)處運(yùn)行。以上就是我對(duì)異常向量表的一個(gè)簡(jiǎn)單介紹?,F(xiàn)在可以進(jìn)入我們文章的主題

“中斷異常處理”,s3c2410的中斷分快中斷(FIQ)和普通中斷(IRQ),我們討論的重點(diǎn)是普通中斷(IRQ)。[!--empirenews.page--]

s3c2410的中斷異常處理模塊總共由以下寄存器構(gòu)成

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è)中斷異常處理流程中,中斷信號(hào)傳進(jìn)中斷異常處理模塊后首先遇到的就是SRCPND/

SUBSRCPND,這兩個(gè)寄存器的作用是用于標(biāo)示出哪個(gè)中斷請(qǐng)求被觸發(fā)。SRCPND的有效位為32,SUBSRCPND

的有效位為11,它們中的每一位分別代表一個(gè)中斷源。SRCPND為主中斷源引腳寄存器,SUBSRCPND為副中斷源引腳寄存器。

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

 

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

INTMOD寄存器有效位為32位,每一位與SRCPND中各位相對(duì)應(yīng),它的作用是指定該位相應(yīng)的中斷源處理模式(IRQ還是FIQ)。若某位為0,則該位相對(duì)應(yīng)的中斷按IRQ模式處理,為1則以FIQ模式進(jìn)行處理,該寄存器初始化值為0x00000000,即所有中斷皆以IRQ模式進(jìn)行處理。(詳細(xì)請(qǐng)參考s3c2410操作手冊(cè))。

INTMSK/ INTSUBMSK

寄存器為中斷屏蔽寄存器

,INTMSK為主中斷屏蔽寄存器,INTSUBMSK為副中斷屏蔽寄存器。INTMSK有效位為32,INTSUBMSK有效位為11,這兩個(gè)寄存器各個(gè)位與SRCPND和SUBSRCPND分別對(duì)應(yīng)。它們的作用是決定該位相應(yīng)的中斷請(qǐng)求是否被處理。若某位被設(shè)置為1,則該位相對(duì)應(yīng)的中斷產(chǎn)生后將被忽略(CPU不處理該中斷請(qǐng)求),設(shè)置為0則對(duì)其進(jìn)行處理。這兩個(gè)寄存器初始化后的值是0xFFFFFFFF和0x7FF,既默認(rèn)情況下所有的中斷都是被屏蔽的。

到目前為止我們總共講解了SRCPND,INTMOD,INTMSK,SUBSRCPND,INTSUBMSK

五個(gè)寄存器,在繼續(xù)講解PRIORITY寄存器之前我們先來(lái)看一張圖。

 

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

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

ARBITER2, ARBITER4, ARBITER4,

ARBITER5.我們能夠控制的是某個(gè)組里面各個(gè)中斷的優(yōu)先級(jí)順序。怎么控制?通過(guò)PRIORITY寄存器進(jìn)行控制:]

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

 

從表上我們可以知道PRIORITY寄存器內(nèi)部各個(gè)位被分為兩種類型,一種是ARB_MODE,另一種為ARB_SEL,

ARB_MODE類型有5組對(duì)應(yīng)ARBITER(2~6),ARB_SEL類型有7組對(duì)應(yīng)ARBITER(0~6)?,F(xiàn)在我將以ARBITER2為例,講解中斷組與PRIORITY寄存器中ARB_SEL,

ARB_MODE之間的相互關(guān)系。

首先我們看到ARBITER2寄存器管理的該組中斷里包括了6個(gè)中斷,分別是INT_TIMER0,INT_TIMER1,INT_TIMER2,INT_TIMER3,INT_TIMER4,INT_UART2,她們的默認(rèn)中斷請(qǐng)求號(hào)分別為REQ0,REQ1,REQ2,REQ3,REQ4,REQ5。我們先看PRIORITY寄存器中的ARB_SEL2,該參數(shù)由兩個(gè)位組成,初始值為00。從該表可以看出00定義了一個(gè)順序

0-1-2-3-4-5

,這個(gè)順序就是這組中斷組的優(yōu)先級(jí)排列,這個(gè)順序指明了以中斷請(qǐng)求號(hào)為0(REQ0)的INT_TIMER0具有最高的中斷優(yōu)先級(jí),其次是INT_TIMER1,INT_TIMER2…。假設(shè)現(xiàn)在ARB_SEL2的值被我們?cè)O(shè)置為01。則一個(gè)新的優(yōu)先級(jí)次序?qū)⒈皇褂茫?1對(duì)應(yīng)的優(yōu)先級(jí)次序?yàn)?-2-3-4-1-5,從中可以看出優(yōu)先級(jí)最高和最低的中斷請(qǐng)求和之前沒(méi)有變化,但本來(lái)處于第2優(yōu)先級(jí)的INT_TIMER1中斷現(xiàn)在變成了第5優(yōu)先級(jí)。從ARB_SEL2被設(shè)置為00,01,10,11各個(gè)值所出現(xiàn)的情況我們可以看出,除最高和最低的優(yōu)先級(jí)不變以外,其他各個(gè)中斷的優(yōu)先級(jí)其實(shí)是在做一個(gè)旋轉(zhuǎn)排列(rotate)。為了達(dá)到對(duì)各個(gè)中斷平等對(duì)待這一目標(biāo),我們可以讓優(yōu)先級(jí)次序在每個(gè)中斷請(qǐng)求被處理完之后自動(dòng)進(jìn)行一次旋轉(zhuǎn),如何自動(dòng)讓它旋轉(zhuǎn)呢?我們可以通過(guò)ARB_MODE2達(dá)到這個(gè)目的,該參數(shù)只有1個(gè)bit,置1代表開(kāi)啟對(duì)應(yīng)中斷組的優(yōu)先級(jí)次序旋轉(zhuǎn),0則為關(guān)閉。事實(shí)上當(dāng)該位置為1之后,每處里完某個(gè)組的一個(gè)中斷后,該組的ARB_SEL便遞增在1(達(dá)到11后恢復(fù)為00)。

現(xiàn)在我們另ARB_MODE2=1,ARB_SEL2=00

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

呼。。。好累。。。終于說(shuō)完了麻煩的優(yōu)先級(jí)-_-…

繼續(xù)。。。

INTPND

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

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

 [!--empirenews.page--]

正如你所見(jiàn)的,INTPND寄存器與SRCPND長(zhǎng)得一模一樣,但他們?cè)谥袛喈惓L幚碇袇s扮演著不同的角色,如果說(shuō)SRCPND是中斷信號(hào)進(jìn)入中斷處理模塊后所經(jīng)過(guò)的第一個(gè)場(chǎng)所的話,那么INTPND

則是中斷信號(hào)在中斷處理模塊里經(jīng)歷的最后一個(gè)寄存器。它的每個(gè)位對(duì)應(yīng)一個(gè)中斷請(qǐng)求,若該位被置1,則表示相應(yīng)的中斷請(qǐng)求被觸發(fā),描述到這里你可能會(huì)發(fā)現(xiàn)它不僅和SRCPND長(zhǎng)得一模一樣,就連功能都一樣,其實(shí)不然,他們?cè)诠δ苌嫌兄卮蟮膮^(qū)別。SRCPND是中斷源引腳寄存器,某個(gè)位被置1表示相應(yīng)的中斷被觸發(fā),但我們知道在同一時(shí)刻內(nèi)系統(tǒng)可以觸發(fā)若干個(gè)中斷,只要中斷被觸發(fā)了,SRCPND的相應(yīng)位便被置1,也就是說(shuō)SRCPND

在同一時(shí)刻可以有若干位同時(shí)被置1,然而INTPND則不同,他在某一時(shí)刻只能有1個(gè)位被置1,INTPND

某個(gè)位被置1(該位對(duì)應(yīng)的中斷在所有已觸發(fā)的中斷里具有最高優(yōu)先級(jí)且該中斷沒(méi)有被屏蔽),則表示CPU即將或已經(jīng)在對(duì)該位相應(yīng)的中斷進(jìn)行處理。于是我們可以有一個(gè)總結(jié):SRCPND說(shuō)明了有什么中斷被觸發(fā)了,INTPND說(shuō)明了CPU即將或已經(jīng)在對(duì)某一個(gè)中斷進(jìn)行處理。

特別注意:每當(dāng)某一個(gè)中斷被處理完之后,我們必須手動(dòng)地把SRCPND/SUBSRCPND ,

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

SRCPND=0x00000002            

//位0被置為0

INTPND =0x00000001            

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

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

 

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

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

 

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

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

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

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

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

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

INT_TIMER0,

INT_TIMER2和INT_UART0三個(gè)中斷被同時(shí)觸發(fā),此時(shí)三個(gè)中斷信號(hào)流向SRCPND寄存器,使該寄存器中的第10位,12位,28位被置為1,中斷信號(hào)繼續(xù)向前流經(jīng)INTMASK

寄存器,這三個(gè)中斷都沒(méi)有被屏蔽,于是信號(hào)進(jìn)一步流經(jīng)INTMODE寄存器,這三個(gè)中斷皆為IRQ類型,故中斷信號(hào)繼續(xù)向前流向PRIORITY寄存器,經(jīng)過(guò)優(yōu)先級(jí)判斷,INT_TIMER0中斷信號(hào)使INTPND

寄存器的第10位置1(INT_TIMER0優(yōu)先級(jí)最高),此時(shí)INTOFFSET

寄存器的值為10,CPU轉(zhuǎn)向相應(yīng)的中斷服務(wù)例程進(jìn)行處理。處理完畢后,我們的程序?qū)NTPND和SRCPND的第10置為0,至此INT_TIMER0中斷處理完畢。此時(shí)SRCPND

的第12位,28位仍為1(這兩個(gè)中斷請(qǐng)求未被處理),故他們會(huì)繼續(xù)被CPU已剛才描述的方式進(jìn)行處理。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉