中斷異常處理流程_第1頁
中斷異常處理流程_第2頁
中斷異常處理流程_第3頁
中斷異常處理流程_第4頁
中斷異常處理流程_第5頁
免費預(yù)覽已結(jié)束,剩余1頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、計算機體系結(jié)構(gòu)中,異?;蛘咧袛嗍翘幚硐到y(tǒng)中突發(fā)事件的一種機制, 幾乎所有的處理器都提供這種機制。 異常主要是從處理器被動接受的角度出發(fā)的 一種描述, 指意外操作引起的異常。 而中斷則帶有向處理器主動申請的意味。 但 這兩種情況具有一定的共性, 都是請求處理器打斷正常的程序執(zhí)行流程, 進(jìn)入特 定程序的一種機制。若無特別說明,對“異?!焙汀爸袛唷倍疾蛔鲊?yán)格的區(qū)分。 本文結(jié)合經(jīng)過實際驗證的代碼對 ARM9中斷處理流程進(jìn)行分析,并設(shè)計出基于 S3C2410芯片的外部中斷處理程序。1. 異常中斷響應(yīng)和返回系統(tǒng)運行時,異??赡軙S時發(fā)生。當(dāng)一個異常出現(xiàn)以后, ARM微處理 器會執(zhí)行以下幾步操作:1) 將下

2、一條指令的地址存入相應(yīng)連接寄存器 LR,以便程序在處理異常 返回時能從正確的位置重新開始執(zhí)行。2) 將 CPSR復(fù)制到相應(yīng)的 SPSR中。3) 根據(jù)異常類型,強制設(shè)置 CPSR的運行模式位。4) 強制 PC 從相關(guān)的異常向量地址取下一條指令執(zhí)行, 從而跳轉(zhuǎn)到相應(yīng)的異常處理程序處。這些工作是由 ARM內(nèi) 核完成的 , 不需要用戶程序參與。 異常處理完畢之 后, ARM微處理器會執(zhí)行以下幾步操作從異常返回:1) 將連接寄存器 LR 的值減去相應(yīng)的偏移量后送到 PC中。2) 將 SPSR復(fù)制回 CPSR中。3) 若在進(jìn)入異常處理時設(shè)置了中斷禁止位,要在此清除。這些工作必須由用戶在中斷處理函數(shù)中實現(xiàn)。

3、為保證在 ARM處理器發(fā)生 異常時不至于處于未知狀態(tài), 在應(yīng)用程序的設(shè)計中, 首先要進(jìn)行異常處理。 采用 的方式是在異常向量表中的特定位置放置一條跳轉(zhuǎn)指令,跳轉(zhuǎn)到異常處理程序。 當(dāng) ARM處理器發(fā)生異常時,程序計數(shù)器 PC 會被強制設(shè)置為對應(yīng)的異常向量,從 而跳轉(zhuǎn)到異常處理程序。 當(dāng)異常處理完成以后, 返回到主程序繼續(xù)執(zhí)行。 可以認(rèn) 為應(yīng)用程序總是從復(fù)位異常處理程序開始執(zhí)行的, 因此復(fù)位異常處理程序不需要 返回。2. 異常處理程序設(shè)計2.1 異常響應(yīng)流程由于向量表的限制, 只能有一條指令 B完成 32MB范圍內(nèi)的跳轉(zhuǎn), 并不能 保證所有的異常處理函數(shù)都位于 32MB范圍內(nèi)。為了擴展跳轉(zhuǎn)范圍,需

4、要二次跳 轉(zhuǎn)才能把異常處理函數(shù)的地址傳送給 PC。異常處理調(diào)用關(guān)系如圖 1 所示。三星公司網(wǎng)站提供了 test2410_r11 軟件包,其中 2410init.s 有如下代碼:HandlerXXXsub sp,sp,#4 ;減少 sp ,保存跳轉(zhuǎn)地址stmfd sp!,r0 ; 將工作寄存器壓入堆棧ldr r0,=HandleXXX ;將 HandleXXX地址放入 r0ldr r0,r0 ;將中斷程序入口地址放入 r0str r0,sp,#4 ;將中斷程序入口地址壓入堆棧ldmfd sp!,r0,pc ; 將工作寄存器和中斷程序入口地址彈出到 r0 和 PC圖 1 異常處理調(diào)用并且在 RAM

5、中定義了存有中斷程序入口地址表 _ISR_STARTADDRE:SSAREA RamData, DATA, READWRITE _ISR_STARTADDRESSHandleReset # 4HandleUndef # 4HandleSWIHandlePabortHandleDabort# 4HandleReserved # 4HandleIRQ# 4HandleFIQ# 4通常 HandlerXXX 位于程序入口地址 32MB 范圍內(nèi), HandleXXX 是以 _ISR_STARTADDRE為SS基地址的 RAM中地址。該代碼主要實現(xiàn)跳轉(zhuǎn)功能,把異常 處理程序地址 HandleXXX送到

6、PC中。例如產(chǎn)生 IRQ中斷時, PC會被強制設(shè)置為 0x18,執(zhí)行指令: b HandlerIRQ在 HandlerIRQ 程 序 段 內(nèi) , 處 理 器 做 一 些 必 要 的 處 理 , 就 會 將 _ISR_STARTADDRE表SS中存放的 IRQ入口地址送入 PC,然后開始執(zhí)行相關(guān)中斷程 序。由于 _ISR_STARTADDRE表SS存放在 RAM中,后面的 C語言程序可以方便地更 改相關(guān)中斷服務(wù)程序的內(nèi)容。2.2 異常分支系統(tǒng)可能存在多個 IRQ/FIQ 的中斷處理程序。 為了從向量表入口處的跳 轉(zhuǎn)最終能找到正確的中斷處理程序, 需要設(shè)計一套處理機制和方法來實現(xiàn)。 可以 在 AR

7、M的異常向量表之外, 增加一張關(guān)聯(lián)中斷控制器的向量表, 向量表中的內(nèi)容 對應(yīng)每個具體的中斷源,可以協(xié)助跳轉(zhuǎn)到不同的中斷處理程序。當(dāng)響應(yīng)外設(shè)的一個中斷請求時, 首先觸發(fā) ARM核的中斷, 進(jìn)人中斷程序, 再通過中斷控制器識別中斷源,使 PC能夠自動獲得中斷處理程序的地址。有的 芯片支持特殊的硬件分支功能, 依據(jù)中斷源自動跳轉(zhuǎn)到向量表的相應(yīng)地址, 多數(shù) 情況下是用軟件來處理異常分支。在 S3C2410體系中,中斷的調(diào)用可以看成是經(jīng)歷了 2 次“中斷向量表” 的查詢 。 2410init.s 中的 以下 代碼 完成 功 能就 是查 詢中 斷偏移寄存器 INTOFFSE,T 得到當(dāng)前中斷的中斷號, 并

8、根據(jù)中斷號再調(diào)用相關(guān)的中斷服務(wù)程序。IsrIRQsub sp,sp,#4stmfdsp!,r8-r9ldrr9,=INTOFFSETldrr9,r9ldrr8,=HandleEINT0addr8,r8,r9,lsl #2ldrr8,r8strr8,sp,#8ldmfdsp!,r8-r9,pc為了方便 C程序使用中斷,將 IsrIRQ 設(shè)為 IRQ 的中斷服務(wù)程序ldrr0,=HandleIRQldrr1,=IsrIRQstrr1,r0其中 HandleEINT0 是用戶自己開辟的一塊存儲空間的起始地址,后面按 次序存放中斷異常處理程序的地址,也可以理解為二級中斷向量表。 IsrIRQ 從 中斷

9、控制器處獲取中斷源信息, 然后再從二級中斷向量表中的對應(yīng)地址單元得到 異常中斷處理程序的入口地址, 完成異常響應(yīng)的跳轉(zhuǎn)。 二級中斷向量表一般位于 HandleFIQ 的后面,也就是以 _ISR_STARTADDRES0Sx20 為起始地址,這里定義 了 S3C2410處理器所有中斷源的相關(guān)中斷處理處理程序入口。 這種方法的好處是 用戶程序在運行過程中能夠動態(tài)改變異常向量。2.3 中斷函數(shù)設(shè)計為了方便高級語言設(shè)計中斷處理函數(shù),標(biāo)準(zhǔn)的 ARM指令編譯器提供了一 個用來聲明中斷處理函數(shù)的關(guān)鍵字 -irq ,使用此關(guān)鍵字聲明的函數(shù)可以被編譯器 識別為中斷處理函數(shù)。 編譯后的代碼在處理異常事件前保存現(xiàn)場

10、信息, 處理異常 事件后對現(xiàn)場信息進(jìn)行恢復(fù)。中斷函數(shù)設(shè)計如下:static void _irq Eint3Int(void)ClearPending(BIT_EINT3);Uart_Printf(EINT3 interrupt is occurred.n);num_int=3; 設(shè)置標(biāo)志位定義中斷處理程序入口地址: #define pISR_EINT3 (*(unsigned *)(_ISR_STARTADDRESS+0x2c)在初始化程序,引用代碼 pISR_EINT3=(U32)Eint3Int ,即可定義地址 _ISR_STARTADDRESS+0x內(nèi)2容c 是 Eint3Int 的地址

11、,外部中斷 3 產(chǎn)生請求時即可 調(diào)用中斷處理函數(shù) Eint3Int 。3. 外中斷初始化程序設(shè)計S3C2410X 的中斷控制寄存器能接收來自 56 個中斷源的請求。內(nèi)部的外 圍模塊和外部管腳產(chǎn)生的多個中斷請求通過中斷控制器沖裁后, 向 ARM920T核發(fā) 出 FIQ或者 IRQ 中斷。 ARM內(nèi)核只有 2個外部中斷輸入信號 nIRQ和 nFIQ,在具 體嵌入式系統(tǒng)中,需要用中斷控制器管理多個外部中斷源,選擇其中一個中斷, 通過 nIRQ 或 nFIQ向 ARM內(nèi)核發(fā)出中斷請求,如圖 2 所示。圖 2 FIQ IRQ 中斷處理過程ARM920T 內(nèi)核可以識別正常中斷請求和快速中斷請求兩種類型的外

12、部中 斷,中斷的行為模式由中斷控制器來設(shè)置。 S3C2410X的中斷控制器包括 6 類寄 存器:中斷源狀態(tài)寄存器、中斷模式寄存器、中斷屏蔽寄存器、優(yōu)先級寄存器、 中斷狀態(tài)寄存器,以及中斷偏移寄存器。在初始化程序中,需要選擇相應(yīng)管腳的功能,在此定義GPF3為 EINT3模式,通過外部中斷控制寄存器 EXTINT0設(shè)定 EINT3是下降沿觸發(fā)方式, 通過設(shè) 置中斷源懸掛寄存器 SRCPN、D中斷懸掛寄存器 INTPND和中斷屏蔽寄存器 INTMSK 開啟 EINT3。中斷模式寄存器和中斷優(yōu)先級寄存器采用系統(tǒng)默認(rèn)方式。具體代碼 實現(xiàn)如下:void Eint_Init(void) rGPFCON = (rGPFCON & 0x3f0c)|(17);rEXTINT0 = (rEXTINT0 & (0x712) | 0x212;pISR_EINT3=(U32)Eint3Int;rSRCPND = BIT_EINT3;rINTPND = BIT_EINT3;rINTMSK=( BIT_EINT3);圖 3 主程序流程圖如果采用 EINT4EINT23之間的中斷源, 還需要設(shè)置外部中斷懸掛寄存 器 EINTPEND和外部中斷掩碼寄存器 EIN

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論