**arm的中斷體系結(jié)構(gòu)
2013-06-28 18:36:11
分類: 嵌入式 CPU一上電就處于 ARM 狀態(tài),。 如果對于arm的CPU的工作模式和狀態(tài)有疑惑: ** ARM處理器的寄存器,ARM與Thumb狀態(tài),,7中運(yùn)行模式 如果對arm剛上電的工作模式和狀態(tài)有疑惑:**arm 上電或復(fù)位時(shí)的狀態(tài),,模式 ARM異常中斷處理概述 1、中斷的概念 中斷是一個(gè)過程,,是CPU在執(zhí)行當(dāng)前程序的過程中因硬件或軟件的原因插入了另一段程序運(yùn)行的過程,。 因硬件原因引起的中斷過程的出現(xiàn)是不可預(yù)測的,即隨機(jī)的,,而軟中斷是事先安排的,。 2、中斷源的概念 我們把可以引起中斷的信號源稱之為中斷源,。 arm920T中有60個(gè)中斷源: (1)外部子中斷源20個(gè): (2)擁有15個(gè)內(nèi)部子中斷源的: (4)攝像頭接口: 3,、中斷優(yōu)先級的概念 ARM處理器中有7種類型的異常,按優(yōu)先級從高到低的排列如下: 復(fù)位異常(Reset),、 數(shù)據(jù)異常(Data Abort),、 快速中斷異常(FIQ)、 外部中斷異常(IRQ),、 預(yù)取異常(Prefetch Abort),、 軟件中斷(SWI)、 未定義指令異常(Undefined instruction),。 ARM異常的優(yōu)先級 ARM體系異常種類細(xì)說: 1.復(fù)位異常 當(dāng)處理器的復(fù)位引腳有效時(shí),,系統(tǒng)產(chǎn)生復(fù)位異常中斷,程序跳轉(zhuǎn)到復(fù)位異常中斷處理程序處執(zhí)行,。 復(fù)位異常中斷通常用在下面兩種情況下,。 *系統(tǒng)上電。 *系統(tǒng)復(fù)位,。 當(dāng)復(fù)位異常時(shí),,系統(tǒng)執(zhí)行下列偽操作: R14_svc = UNPREDICTABLE value //任意值 SPSR_svc = UNPREDICTABLE value //任意值 CPSR[4∶0] = 0b10011 /*進(jìn)入管理模式*/ CPSR[5] = 0 /*處理器進(jìn)入ARM狀態(tài)*/ CPSR[6] = 1 /*禁止快速中斷*/ CPSR[7] = 1 /*禁止外設(shè)中斷*/ If high vectors configured then PC = 0xffff0000 Else PC = 0x00000000 復(fù)位異常中斷處理程序的主要功能: *設(shè)置異常中斷向量表。 *初始化數(shù)據(jù)棧和寄存器,。 *初始化存儲系統(tǒng),,如系統(tǒng)中的MMU等。 *初始化關(guān)鍵的I/O設(shè)備,。 *使能中斷,。 *處理器切換到合適的模式。 *初始化C變量,,跳轉(zhuǎn)到應(yīng)用程序執(zhí)行,。 2.未定義指令異常 當(dāng)ARM處理器執(zhí)行協(xié)處理器指令時(shí),,它必須等待一個(gè)外部協(xié)處理器應(yīng)答后,,才能真正執(zhí)行這條指令,。 若協(xié)處理器沒有響應(yīng),,則發(fā)生未定義指令異常。 3.軟中斷SWI 軟中斷異常發(fā)生時(shí),,處理器進(jìn)入特權(quán)模式,,執(zhí)行一些特權(quán)模式下的操作系統(tǒng)功能。 4.預(yù)取指令異常 預(yù)取指令異常是由系統(tǒng)存儲器報(bào)告的,。當(dāng)處理器試圖去取一條被標(biāo)記為預(yù)取無效的指令時(shí),, 發(fā)生預(yù)取異常。 5.?dāng)?shù)據(jù)訪問中止異常 數(shù)據(jù)訪問中止異常是由存儲器發(fā)出數(shù)據(jù)中止信號,,它由存儲器訪問指令Load/Store產(chǎn)生,。 當(dāng)數(shù)據(jù)訪問指令的目標(biāo)地址不存在或者該地址不允許當(dāng)前指令訪問時(shí),處理器產(chǎn)生數(shù)據(jù)訪問中止異常,。 6.外部中斷IRQ 當(dāng)處理器的外部中斷請求引腳有效,,而且CPSR寄存器的I控制位被清除時(shí),,處理器產(chǎn)生外部中斷IRQ異常,。 系統(tǒng)中各外部設(shè)備通常通過該異常中斷請求處理器服務(wù)。 7.快速中斷FIQ 當(dāng)處理器的快速中斷請求引腳有效且CPSR寄存器的F控制位被清除時(shí),,處理器產(chǎn)生快速中斷請求FIQ異常,。 當(dāng)異常發(fā)生時(shí),處理器會把PC設(shè)置為一個(gè)特定的存儲器地址,。 這一地址放在被稱為向量表(vector table)的特定地址范圍內(nèi),。 向量表的入口是一些跳轉(zhuǎn)指令,跳轉(zhuǎn)到專門處理某個(gè)異?;蛑袛嗟淖映绦?。 ARM Generic Interrupt Controller : ARM GIC : arm 通用中斷控制器 如果對 通用中斷控制器有疑惑的,請看:***arm 通用中斷控制器 中斷的狀態(tài): Inactive(不激活) 沒有被激活或掛起的中斷 Pending(掛起) 這個(gè)中斷可以被硬件識別或是由軟件產(chǎn)生的,,正處於等待處理器處理,。 Active(激活) 這個(gè)中斷被處理器從通用中斷控制器中的中斷源中識別了出來,并且正在處理這個(gè)中斷,,且沒有處理完成。 Active and pending(激活和掛起) 處理器正在處理某個(gè)中斷,,且通用中斷控制器有一個(gè)掛起的中斷,, 這兩個(gè)中斷是屬于同一個(gè)中斷源的 中斷流程: 進(jìn)入異常 在異常發(fā)生后,,ARM內(nèi)核會作以下工作: 1.在LR中保存下一條指令的地址(即返回地址) 2.將CPSR復(fù)制到適當(dāng)?shù)腟PSR中,; 3.將CPSR模式位強(qiáng)制設(shè)置為與異常類型相對應(yīng)的值,; 4.原來無論是ARM狀態(tài)或THUMB狀態(tài),都進(jìn)入ARM狀態(tài),; 5.屏蔽快速中斷和外部中斷,。 6.強(qiáng)制PC從相關(guān)的異常向量處取指。 進(jìn)入異常過程: 1. 程序在系統(tǒng)模式下運(yùn)行用戶程序,,假定當(dāng)前處理器狀態(tài)為Thumb狀態(tài),、允許IRQ中斷; 2. 用戶程序運(yùn)行時(shí)發(fā)生IRQ中斷,,硬件完成以下動作: *置位I位(禁止IRQ中斷) *清零T位(進(jìn)入ARM狀態(tài)) *設(shè)置MOD位,,切換處理器模式至IRQ模式 *將下一條指令的地址存入IRQ模式的LR寄存器 *將CPSR寄存器內(nèi)容存入IRQ模式的SPSR寄存器 *將跳轉(zhuǎn)地址存入PC,實(shí)現(xiàn)跳轉(zhuǎn) 中斷響應(yīng)步驟: 1,、保護(hù)斷點(diǎn),, 2、尋找中斷入口,,根據(jù)不同的中斷源所產(chǎn)生的中斷,,查找不同的入口地址。 3,、執(zhí)行中斷處理程序,。 4、中斷返回 具體實(shí)現(xiàn)如下: 1.判斷處理器狀態(tài) 當(dāng)異常發(fā)生時(shí),,處理器自動切換到ARM狀態(tài),,所以在異常處理函數(shù)中要判斷 在異常發(fā)生前處理器是ARM狀態(tài)還是Thumb狀態(tài)。這可以通過檢測SPSR的T位來判斷,。 2.向量表 每一個(gè)異常發(fā)生時(shí)總是從異常向量表開始跳轉(zhuǎn),。最簡單的一種情況是向量表里面的 每一條指令直接跳向?qū)?yīng)的異常處理函數(shù)。 異常處理向量表如下: 利用跳轉(zhuǎn)指令B建立異常向量表 ENTRY ;匯編程序開始 b reset ;跳入reset處理程序 b HandleUndef ;跳到未定義處理程序 b HandSWI ;跳到軟中斷處理程序 b HandPrefetchAbt ;跳到預(yù)取指令處理程序 b HandDataAbt ;跳回?cái)?shù)據(jù)訪問中止處理程序 b HandNoUsed ,;保留 b HandleIRQ ;跳入中斷處理程序 b HandleFIQ ;跳回快速中斷處理標(biāo)簽 注意:跳轉(zhuǎn)指令B的跳轉(zhuǎn)范圍為±32MB,,但很多情況下不能保證所有的異常處理函數(shù)都定位在向量的32MB范圍內(nèi),, 需要更大范圍的跳轉(zhuǎn),而且由于向量表空間的限制,,只能由一條指令完成,。 具體實(shí)現(xiàn)方法有下面兩種。 (1)MOV PC,,#imme_value 這種辦法將目標(biāo)地址直接賦值給PC,。但這種方法受格式限制不能處理任意立即數(shù)。 這個(gè)立即數(shù)由一個(gè)8位數(shù)值循環(huán)右移偶數(shù)位得到,。 (2)LDR PC,,[PC+offset] 把目標(biāo)地址先存儲在某一個(gè)合適的地址空間,然后把這個(gè)存儲器單元的32位數(shù)據(jù)傳送給PC來實(shí)現(xiàn)跳轉(zhuǎn),。 這種方法對目標(biāo)地址值沒有要求,。但是存儲目標(biāo)地址的存儲器單元必須在當(dāng)前指令的±4KB空間范圍內(nèi)。 退出異常 當(dāng)異常結(jié)束時(shí),,異常處理程序必須: 1.將LR中的值減去偏移量后存入PC,,偏移量根據(jù)異常的類型而有所不同; 2.將SPSR的值復(fù)制回CPSR,; 3.清零在入口置位的中斷禁止標(biāo)志,。 注:恢復(fù)CPSR的動作會將T,、F和I位自動恢復(fù)為異常發(fā)生前的值,。 退出異常過程 在異常處理結(jié)束后,異常處理程序完成以下動作: *將SPSR寄存器的值復(fù)制回CPSR寄存器,; *將LR寄存的值減去一個(gè)常量后復(fù)制到PC寄存器,,跳轉(zhuǎn)到被中斷的用戶程序。 從異常處理程序中返回 當(dāng)一個(gè)ARM異常處理返回時(shí),,一共有3件事情需要處理 *通用寄存器的恢復(fù) *狀態(tài)寄存器的恢復(fù) *PC指針的恢復(fù) 具體操作如下: 1.恢復(fù)被中斷程序的處理器狀態(tài) PC和CPSR的恢復(fù)可以通過一條指令來實(shí)現(xiàn),,下面是3個(gè)例子。 MOVS PC,,LR SUBS PC,,LR,#4 LDMFD SP!,,{PC}^ 這幾條指令是普通的數(shù)據(jù)處理指令,,特殊之處在于它們把程序計(jì)數(shù)器寄存器PC作為目標(biāo)寄存器, 并且?guī)Я颂厥獾暮缶Y“S“或“^”,。其中“S“或“^”的作用就是使指令在執(zhí)行時(shí),, 同時(shí)完成從SPSR到CPSR的拷貝,達(dá)到恢復(fù)狀態(tài)寄存器的目的,。 2.異常的返回地址 注意:異常返回時(shí),,另一個(gè)非常重要的問題就是返回地址的確定,。前面提到過, 處理器進(jìn)入異常時(shí)會有一個(gè)保存LR的動作,,但是該保持值并不一定是正確中斷的返回地址,。 以一個(gè)簡單的指令執(zhí)行流水狀態(tài)圖來對此加以說明,如圖所示,, 3級流水線示例: 總結(jié)IRQ中斷處理過程 中斷寄存器: 1,,中斷控制器中有5個(gè)中斷控制寄存器: (1),源掛起寄存器,,SOURCE PENDING (SRCPND) REGISTER 中斷控制寄存器INTCON共有32位,,每一位對應(yīng)著一個(gè)中斷源, 當(dāng)中斷源發(fā)出中斷請求的時(shí)候,,就會置位源掛起寄存器的相應(yīng)位,。反之,中斷的掛起寄存器的值為0,。 該寄存器中的每一位對應(yīng)特定的中斷源,, 當(dāng)該位的值為: 0,表示這個(gè)中斷源中沒有中斷被請求,。 1,,表示該中斷源中有中斷被請求 1.1,子源掛起寄存器(SUB SOURCE PENDING (SUBSRCPND) REGISTER ) (2),,中斷模式寄存器,,INTERRUPT MODE (INTMOD) REGISTER 中斷模式寄存器INTMOD共有32位,每一位對應(yīng)著一個(gè)中斷源,, 當(dāng)中斷源的模式位設(shè)置為1時(shí),,對應(yīng)的中斷會由ARM920T內(nèi)核以FIQ模式來處理。 相反,,當(dāng)模式位設(shè)置為0時(shí),,中斷會以IRQ模式來處理。默認(rèn)為IRQ模式,。 注意:如果中斷模式為FIQ模式,,INTPND和INTOFFSET寄存器是無效的, 也就是說,,這兩個(gè)寄存器只在IRQ模式下有效,。 該寄存器中的每一位對應(yīng)特定的中斷源, 當(dāng)該位的值為: 0,,表示這個(gè)中斷源中的中斷為IRQ模式,。 1,表示該中斷源中的中斷為FIQ模式 。 (3),,中斷屏蔽寄存器,,INTERRUPT MASK (INTMSK) REGISTER 這個(gè)寄存器有32位,分別對應(yīng)一個(gè)中斷源,。 當(dāng)中斷源的屏蔽位設(shè)置為1時(shí),,CPU不響應(yīng)該中斷源的中斷請求, 反之,,等于0時(shí)CPU能響應(yīng)該中斷源的中斷請求,。 該寄存器中的每一位對應(yīng)特定的中斷源, 當(dāng)該位的值為: 0,,表示這個(gè)中斷源沒有被屏蔽,,其中的中斷可以被響應(yīng)。 1,,表示該中斷源被屏蔽,,該中斷源中的中斷不可以被響應(yīng) 。 3.1,,子中斷屏蔽寄存器(INTERRUPT SUB MASK (INTSUBMSK) REGISTER ) (4),,中斷優(yōu)先權(quán)寄存器,PRIORITY REGISTER (PRIORITY) CPU某個(gè)時(shí)刻只能對一個(gè)中斷源進(jìn)行中斷處理,, 如果現(xiàn)在有3個(gè)中斷同時(shí)發(fā)生了,,那CPU要按什么順序處理這個(gè)3個(gè)中斷呢? 這正是引入優(yōu)先級判斷的原因所在,,通過優(yōu)先級判斷,,CPU可以按某種順序逐個(gè)處理中斷請求。 arm920t 的優(yōu)先級判斷分為兩級,。 ①ARBITER6所控制的REQ0,1,2,3,4,5實(shí)際上對應(yīng)ARBITER0,1,2,3,4,5
②REQ0在任何情況下具有最高優(yōu)先級,,REQ5具有最低優(yōu)先級; 1,,當(dāng) ARB_MODEx = 0: ARB_SELx 仲裁組中的中斷的優(yōu)先級不會被自動改變,, 如:ARB_SEL0 bit[8:7] = 00 優(yōu)先級次序:REQ1>REQ2>REQ3>REQ4(即:EINT0>EINT1>EINT2>EINT3); bit[8:7] = 01 優(yōu)先級次序:REQ2>REQ3>REQ4<REQ1(即:EINT1>EINT2>EINT3<EINT0),;
ARB_SEL1 bit[10:9] = 00 優(yōu)先級次序:REQ0> REQ1>REQ2>REQ3>REQ4>REQ5 (即:EINT8_23>INT_CAM>Nbatt_FLT>INT_TICK>INT_WDT/AC97<EINT4_7); 其他的ARB_SELx同理 2,,當(dāng) ARB_MODEx = 1: ARB_SELx 仲裁組中的中斷被觸發(fā)后,,組中的中斷的優(yōu)先級會被自動改變。 1,,REQ0和REQ5因?yàn)閮?yōu)先級固定而不參與輪轉(zhuǎn) 2,,當(dāng) REQ1 中斷被處理之后,該中斷仲裁組中的中斷優(yōu)先級 ARB_SELx 會變?yōu)?01b,。 3,,當(dāng) REQ2 中斷被處理之后,該中斷仲裁組中的中斷優(yōu)先級 ARB_SELx 會變?yōu)?10b,。 4,,當(dāng) REQ3 中斷被處理之后,該中斷仲裁組中的中斷優(yōu)先級 ARB_SELx 會變?yōu)?11b,。 5,,當(dāng) REQ4 中斷被處理之后,該中斷仲裁組中的中斷優(yōu)先級 ARB_SELx 會變?yōu)?00b,。 如:ARB_SEL0 bit[8:7] = 00 優(yōu)先級次序:REQ1>REQ2>REQ3>REQ4(即:EINT0>EINT1>EINT2>EINT3),; 假設(shè) REG2 (即 EINT1)中斷被觸發(fā)后,當(dāng)cpu處理完REG2(EINT1)的中斷處理函數(shù)之后,,ARB_SEL0 中的值為 bit[8:7] = 10, 優(yōu)先級次序:REQ3>REQ4<REQ1>REQ2(即:EINT2>EINT3<EINT0>EINT1),; 其他的 ARB_SELx 同理。 (5),,中斷掛起寄存器,,INTERRUPT PENDING (INTPND) REGISTER 中斷掛起寄存器INTPND共有32位,每一位對應(yīng)著一個(gè)中斷源,, 當(dāng)中斷請求被響應(yīng)的時(shí)候,,相應(yīng)的位會被設(shè)置為1。 在某一時(shí)刻只有一個(gè)位能為1,,因此在中斷服務(wù)子程序中可以通過判斷INTPND來判斷哪個(gè)中斷正在被響應(yīng),, 在中斷處理函數(shù)退出前,需要清除源掛起寄存器中對應(yīng)的位,,以及 中斷掛起寄存器中對應(yīng)的位,。 5.1,IRQ偏移寄存器(INTERRUPT OFFSET (INTOFFSET) REGISTER ) 中斷偏移寄存器給出INTPND寄存器中哪個(gè)是IRQ模式的中斷請求。 INTOFFSET的值對應(yīng)INTPND中的中斷掛起位,,取值范圍為: 2,,外部中斷寄存器 1,外部中斷控制寄存器(EXTINTn) arm920t有24個(gè)外部中斷有幾種中斷觸發(fā)方式,EXTINTn配置外部中斷的觸發(fā)類型是電平觸發(fā),、邊沿觸發(fā)及觸發(fā)的極性,。 8 個(gè)外部中斷可以由多種信號觸發(fā)方式所請求。EXTINT 寄存器為外部中斷配制信號觸發(fā)方式為電平觸發(fā)或邊沿觸發(fā),, 同時(shí)還配制信號觸發(fā)極性,。 為了確認(rèn)電平中斷,由于噪聲濾波必須保持 EXTINTn引腳上有效邏輯電平至少 40ns EXTINT0: EXTINT1: EXTINT2: 1.1,外部中斷濾波寄存器(EINTFLTn (External Interrupt Filter Register n) ) 為了確認(rèn)電平中斷,,由于噪聲濾波必須保持 EXTINTn引腳上有效邏輯電平至少 40ns,。 2,外部中斷屏蔽寄存器(EINTMASK) EXTMASK[23:4]分別對應(yīng)外部中斷23~4,等于1,,對應(yīng)的中斷被屏蔽,;等于0,允許外部中斷,。EXTMASK[3:0]保留,。 3,外部中斷掛起寄存器 (EINTPEND ) 中斷掛起寄存器INTPND共有32位,前4位保留(因?yàn)镋INT0—EINT3對應(yīng)的掛起位在寄存器INTPND中),, 4~23位對應(yīng)著一個(gè)中斷源,,當(dāng)中斷請求被響應(yīng)的時(shí)候,相應(yīng)的位會被設(shè)置為1,。 在中斷服務(wù)子程序中可以通過判斷EINTPND來判斷哪個(gè)中斷在提起申請,。 arm920t中斷相關(guān)各寄存器關(guān)系: 測試實(shí)例: 點(diǎn)擊(此處)折疊或打開
如果對cpsr_c 有疑惑的請看:*arm中的 CPSR_c是什么 如果對cpsr 有疑惑的請看:* CPSR 和 SPSR 如果對arm上電或復(fù)位,,cpu的狀態(tài)和模式,請看: **arm 上電或復(fù)位時(shí)的狀態(tài),,模式 如果對 stmdb,ldmia 指令有疑惑的請看:**arm匯編指令之?dāng)?shù)據(jù)塊傳輸(LDM,STM)詳見 如果對arm中的r0 - r15 的作用有疑惑的請看:*arm中R0-R15寄存器的作用 中斷初始化: 點(diǎn)擊(此處)折疊或打開
中斷處理函數(shù): 點(diǎn)擊(此處)折疊或打開
源碼附件:int.rar |
|