新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于ARM9芯片S3C2410異常中斷程序設計

        基于ARM9芯片S3C2410異常中斷程序設計

        作者: 時間:2008-01-16 來源:網絡 收藏

        摘要:驗證的代碼詳細分析了ARM嵌入式系統的處理流程。然后闡明關鍵字“-irq”的作用,設計出處理函數。最后,通過設置控制寄存器,設計外部EINT3的初始化程序,并給出主程序流程圖。實踐證明程序運行穩定可靠。
        關鍵字:Cirq中斷

        引言

        計算機體系結構中,或者中斷是處理系統中突發事件的一種機制,幾乎所有的處理器都提供這種機制。異常主要是從處理器被動接受的角度出發的一種描述,指意外操作引起的異常。而中斷則帶有向處理器主動申請的意味。但這兩種情況具有一定的共性,都是請求處理器打斷正常的程序執行流程,進入特定程序的一種機制。若無特別說明,對“異常”和“中斷”都不作嚴格的區分。本文結合經過實際驗證的代碼對中斷處理流程進行分析,并設計出的外部中斷處理程序。

        1.異常中斷響應和返回

        系統運行時,異常可能會隨時發生。當一個異常出現以后,ARM微處理器會執行以下幾步操作:

        1) 將下一條指令的地址存入相應連接寄存器LR,以便程序在處理異常返回時能從正確的位置重新開始執行。

        2) 將CPSR復制到相應的SPSR中。

        3) 根據異常類型,強制設置CPSR的運行模式位。

        4) 強制PC從相關的異常向量地址取下一條指令執行,從而跳轉到相應的異常處理程序處。

        這些工作是由ARM 內核完成的,不需要用戶程序參與。異常處理完畢之后,ARM微處理器會執行以下幾步操作從異常返回:

        1) 將連接寄存器LR的值減去相應的偏移量后送到PC中。

        2) 將SPSR復制回CPSR中。

        3) 若在進入異常處理時設置了中斷禁止位,要在此清除。

        這些工作必須由用戶在中斷處理函數中實現。為保證在ARM處理器發生異常時不至于處于未知狀態,在應用程序的設計中,首先要進行異常處理。采用的方式是在異常向量表中的特定位置放置一條跳轉指令,跳轉到異常處理程序。當ARM處理器發生異常時,程序計數器PC會被強制設置為對應的異常向量,從而跳轉到異常處理程序。當異常處理完成以后,返回到主程序繼續執行。可以認為應用程序總是從復位異常處理程序開始執行的,因此復位異常處理程序不需要返回。

        2.異常處理

        2.1 異常響應流程

        由于向量表的限制,只能有一條指令B完成32MB范圍內的跳轉,并不能保證所有的異常處理函數都位于32MB范圍內。為了擴展跳轉范圍,需要二次跳轉才能把異常處理函數的地址傳送給PC。異常處理調用關系如圖1所示。

        三星公司網站提供了test2410_r11軟件包,其中2410init.s有如下代碼:

        HandlerXXX

        sub sp,sp,#4 ;減少sp,保存跳轉地址

        stmfd sp!,{r0} ;將工作寄存器壓入堆棧

        ldr r0,=HandleXXX ;將HandleXXX地址放入r0

        ldr r0,[r0] ;將中斷程序入口地址放入r0

        str r0,[sp,#4] ;將中斷程序入口地址壓入堆棧

        ldmfd sp!,{r0,pc} ;將工作寄存器和中斷程序入口地址彈出到r0和PC

        圖1異常處理調用

        并且在RAM中定義了存有中斷程序入口地址表_ISR_STARTADDRESS:

        AREA RamData, DATA, READWRITE

        ^ _ISR_STARTADDRESS

        HandleReset # 4

        HandleUndef # 4

        HandleSWI # 4

        HandlePabort # 4

        HandleDabort # 4

        HandleReserved # 4

        HandleIRQ # 4

        HandleFIQ # 4

        通常HandlerXXX位于程序入口地址32MB范圍內,HandleXXX是以_ISR_STARTADDRESS為基地址的RAM中地址。該代碼主要實現跳轉功能,把異常處理程序地址HandleXXX送到PC中。例如產生IRQ中斷時,PC會被強制設置為0x18,執行指令:b HandlerIRQ

        在HandlerIRQ程序段內,處理器做一些必要的處理,就會將_ISR_STARTADDRESS表中存放的IRQ入口地址送入PC,然后開始執行相關中斷程序。由于_ISR_STARTADDRESS表存放在RAM中,后面的C語言程序可以方便地更改相關中斷服務程序的內容。

        2.2 異常分支

        系統可能存在多個IRQ/FIQ的中斷處理程序。為了從向量表入口處的跳轉最終能找到正確的中斷處理程序,需要設計一套處理機制和方法來實現。可以在ARM的異常向量表之外,增加一張關聯中斷控制器的向量表,向量表中的內容對應每個具體的中斷源,可以協助跳轉到不同的中斷處理程序。

        當響應外設的一個中斷請求時,首先觸發ARM核的中斷,進人中斷程序,再通過中斷控制器識別中斷源,使PC能夠自動獲得中斷處理程序的地址。有的支持特殊的硬件分支功能,依據中斷源自動跳轉到向量表的相應地址,多數情況下是用軟件來處理異常分支。

        體系中,中斷的調用可以看成是經歷了2次“中斷向量表”的查詢。2410init.s中的以下代碼完成功能就是查詢中斷偏移寄存器INTOFFSET,得到當前中斷的中斷號,并根據中斷號再調用相關的中斷服務程序。

        IsrIRQ

        sub sp,sp,#4

        stmfd sp!,{r8-r9}

        ldr r9,=INTOFFSET

        ldr r9,[r9]

        ldr r8,=HandleEINT0

        add r8,r8,r9,lsl #2

        ldr r8,[r8]

        str r8,[sp,#8]

        ldmfd sp!,{r8-r9,pc}

        為了方便C程序使用中斷,將IsrIRQ設為IRQ的中斷服務程序。

        ldr r0,=HandleIRQ

        ldr r1,=IsrIRQ

        str r1,[r0]

        其中HandleEINT0是用戶自己開辟的一塊存儲空間的起始地址,后面按次序存放中斷異常處理程序的地址,也可以理解為二級中斷向量表。IsrIRQ從中斷控制器處獲取中斷源信息,然后再從二級中斷向量表中的對應地址單元得到異常中斷處理程序的入口地址,完成異常響應的跳轉。二級中斷向量表一般位于HandleFIQ的后面,也就是以_ISR_STARTADDRESS+0x20為起始地址,這里定義了S3C2410處理器所有中斷源的相關中斷處理處理程序入口。這種方法的好處是用戶程序在運行過程中能夠動態改變異常向量。

        2.3 中斷函數設計

        為了方便高級語言設計中斷處理函數,標準的ARM指令編譯器提供了一個用來聲明中斷處理函數的關鍵字-irq,使用此關鍵字聲明的函數可以被編譯器識別為中斷處理函數。編譯后的代碼在處理異常事件前保存現場信息,處理異常事件后對現場信息進行恢復。中斷函數設計如下:

        static void __irq Eint3Int(void){

        ClearPending(BIT_EINT3);

        Uart_Printf("EINT3 interrupt is occurred.");

        num_int=3;設置標志位

        }

        定義中斷處理程序入口地址:#define pISR_EINT3 (*(unsigned *)(_ISR_STARTADDRESS+0x2c))

        在初始化程序,引用代碼pISR_EINT3=(U32)Eint3Int,即可定義地址_ISR_STARTADDRESS+0x2c內容是Eint3Int的地址,外部中斷3產生請求時即可調用中斷處理函數Eint3Int。

        3.外中斷初始化

        S3C2410X的中斷控制寄存器能接收來自56個中斷源的請求。內部的外圍模塊和外部管腳產生的多個中斷請求通過中斷控制器沖裁后,向20T核發出FIQ或者IRQ中斷。ARM內核只有2個外部中斷輸入信號nIRQ和nFIQ,在具體嵌入式系統中,需要用中斷控制器管理多個外部中斷源,選擇其中一個中斷,通過nIRQ或nFIQ向ARM內核發出中斷請求,如圖2所示。

        圖2 FIQ/IRQ中斷處理過程

        20T內核可以識別正常中斷請求和快速中斷請求兩種類型的外部中斷,中斷的行為模式由中斷控制器來設置。S3C2410X的中斷控制器包括6類寄存器:中斷源狀態寄存器、中斷模式寄存器、中斷屏蔽寄存器、優先級寄存器、中斷狀態寄存器,以及中斷偏移寄存器。

        在初始化程序中,需要選擇相應管腳的功能,在此定義GPF3為EINT3模式,通過外部中斷控制寄存器EXTINT0設定EINT3是下降沿觸發方式,通過設置中斷源懸掛寄存器SRCPND、中斷懸掛寄存器INTPND和中斷屏蔽寄存器INTMSK開啟EINT3。中斷模式寄存器和中斷優先級寄存器采用系統默認方式。具體代碼實現如下:

        void Eint_Init(void){

        rGPFCON = (rGPFCON 0x3f0c)|(17);

        rEXTINT0 = (rEXTINT0 ~(0x712)) | 0x212;

        pISR_EINT3=(U32)Eint3Int;

        圖3 主程序流程圖

        rSRCPND = BIT_EINT3;

        rINTPND = BIT_EINT3;

        rINTMSK=~( BIT_EINT3);

        }

        如果采用EINT4~EINT23之間的中斷源,還需要設置外部中斷懸掛寄存器EINTPEND和外部中斷掩碼寄存器EINTMASK的相關位。

        在C語言的Main()程序中調用Eint_Init()函數,即可完成中斷處理的初始化操作。操作流程如圖3所示。

        若外部下降沿信號接到GPF3管腳,就可以調用Eint3Int中斷處理函數。

        5.結論

        本文作者創新點在于采用的異常處理方式靈活可靠,可以在系統運行期間動態修改中斷向量表,利用C語言也可實現中斷處理函數的動態配置。在所設計的鍵盤處理程序中采用該方法,取得了很好地效果,該方法具有很強的通用性。

        參考文獻

        [1] 費浙平.ARM 的嵌入式系統程序開發要點(二).單片機與嵌入式系統應用,2003,9:80~83

        [2] 王波.ARM的三種中斷調試方法的探討.微計算機信息(嵌入式與SOC),2006,22:130~131

        [3]甘泉,楊健,陳永泰.ARM處理器啟動代碼的分析與設計.2004年全國第五層嵌入式系統學術交流會論文集,2004:151~154

        [4]張.嵌入式系統硬件設計與調試.北京:機械工業出版社.2005,7:279~294



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 维西| 斗六市| 龙口市| 三亚市| 东乡族自治县| 阿鲁科尔沁旗| 昌乐县| 牡丹江市| 清水河县| 甘孜县| 房山区| 平阴县| 贺兰县| 临猗县| 河南省| 武功县| 遂溪县| 三明市| 积石山| 陆良县| 利津县| 安多县| 进贤县| 永新县| 彝良县| 诸暨市| 大英县| 林口县| 石棉县| 昌宁县| 拜泉县| 仙桃市| 六盘水市| 青田县| 漳浦县| 建德市| 江西省| 漳州市| 康平县| 兴安盟| 探索|