<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于ARM9芯片S3C2410異常中斷程序設(shè)計(jì)

          基于ARM9芯片S3C2410異常中斷程序設(shè)計(jì)

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

          摘要:驗(yàn)證的代碼詳細(xì)分析了ARM嵌入式系統(tǒng)的處理流程。然后闡明關(guān)鍵字“-irq”的作用,設(shè)計(jì)出處理函數(shù)。最后,通過(guò)設(shè)置控制寄存器,設(shè)計(jì)外部EINT3的初始化程序,并給出主程序流程圖。實(shí)踐證明程序運(yùn)行穩(wěn)定可靠。
          關(guān)鍵字:Cirq中斷

          引言

          計(jì)算機(jī)體系結(jié)構(gòu)中,或者中斷是處理系統(tǒng)中突發(fā)事件的一種機(jī)制,幾乎所有的處理器都提供這種機(jī)制。異常主要是從處理器被動(dòng)接受的角度出發(fā)的一種描述,指意外操作引起的異常。而中斷則帶有向處理器主動(dòng)申請(qǐng)的意味。但這兩種情況具有一定的共性,都是請(qǐng)求處理器打斷正常的程序執(zhí)行流程,進(jìn)入特定程序的一種機(jī)制。若無(wú)特別說(shuō)明,對(duì)“異?!焙汀爸袛唷倍疾蛔鲊?yán)格的區(qū)分。本文結(jié)合經(jīng)過(guò)實(shí)際驗(yàn)證的代碼對(duì)中斷處理流程進(jìn)行分析,并設(shè)計(jì)出的外部中斷處理程序。

          1.異常中斷響應(yīng)和返回

          系統(tǒng)運(yùn)行時(shí),異??赡軙?huì)隨時(shí)發(fā)生。當(dāng)一個(gè)異常出現(xiàn)以后,ARM微處理器會(huì)執(zhí)行以下幾步操作:

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

          2) 將CPSR復(fù)制到相應(yīng)的SPSR中。

          3) 根據(jù)異常類型,強(qiáng)制設(shè)置CPSR的運(yùn)行模式位。

          4) 強(qiáng)制PC從相關(guān)的異常向量地址取下一條指令執(zhí)行,從而跳轉(zhuǎn)到相應(yīng)的異常處理程序處。

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

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

          2) 將SPSR復(fù)制回CPSR中。

          3) 若在進(jìn)入異常處理時(shí)設(shè)置了中斷禁止位,要在此清除。

          這些工作必須由用戶在中斷處理函數(shù)中實(shí)現(xiàn)。為保證在ARM處理器發(fā)生異常時(shí)不至于處于未知狀態(tài),在應(yīng)用程序的設(shè)計(jì)中,首先要進(jìn)行異常處理。采用的方式是在異常向量表中的特定位置放置一條跳轉(zhuǎn)指令,跳轉(zhuǎn)到異常處理程序。當(dāng)ARM處理器發(fā)生異常時(shí),程序計(jì)數(shù)器PC會(huì)被強(qiáng)制設(shè)置為對(duì)應(yīng)的異常向量,從而跳轉(zhuǎn)到異常處理程序。當(dāng)異常處理完成以后,返回到主程序繼續(xù)執(zhí)行??梢哉J(rèn)為應(yīng)用程序總是從復(fù)位異常處理程序開(kāi)始執(zhí)行的,因此復(fù)位異常處理程序不需要返回。

          2.異常處理

          2.1 異常響應(yīng)流程

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

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

          HandlerXXX

          sub sp,sp,#4 ;減少sp,保存跳轉(zhuǎn)地址

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

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

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

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

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

          圖1異常處理調(diào)用

          并且在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范圍內(nèi),HandleXXX是以_ISR_STARTADDRESS為基地址的RAM中地址。該代碼主要實(shí)現(xiàn)跳轉(zhuǎn)功能,把異常處理程序地址HandleXXX送到PC中。例如產(chǎn)生IRQ中斷時(shí),PC會(huì)被強(qiáng)制設(shè)置為0x18,執(zhí)行指令:b HandlerIRQ

          在HandlerIRQ程序段內(nèi),處理器做一些必要的處理,就會(huì)將_ISR_STARTADDRESS表中存放的IRQ入口地址送入PC,然后開(kāi)始執(zhí)行相關(guān)中斷程序。由于_ISR_STARTADDRESS表存放在RAM中,后面的C語(yǔ)言程序可以方便地更改相關(guān)中斷服務(wù)程序的內(nèi)容。

          2.2 異常分支

          系統(tǒng)可能存在多個(gè)IRQ/FIQ的中斷處理程序。為了從向量表入口處的跳轉(zhuǎn)最終能找到正確的中斷處理程序,需要設(shè)計(jì)一套處理機(jī)制和方法來(lái)實(shí)現(xiàn)??梢栽贏RM的異常向量表之外,增加一張關(guān)聯(lián)中斷控制器的向量表,向量表中的內(nèi)容對(duì)應(yīng)每個(gè)具體的中斷源,可以協(xié)助跳轉(zhuǎn)到不同的中斷處理程序。

          當(dāng)響應(yīng)外設(shè)的一個(gè)中斷請(qǐng)求時(shí),首先觸發(fā)ARM核的中斷,進(jìn)人中斷程序,再通過(guò)中斷控制器識(shí)別中斷源,使PC能夠自動(dòng)獲得中斷處理程序的地址。有的支持特殊的硬件分支功能,依據(jù)中斷源自動(dòng)跳轉(zhuǎn)到向量表的相應(yīng)地址,多數(shù)情況下是用軟件來(lái)處理異常分支。

          體系中,中斷的調(diào)用可以看成是經(jīng)歷了2次“中斷向量表”的查詢。2410init.s中的以下代碼完成功能就是查詢中斷偏移寄存器INTOFFSET,得到當(dāng)前中斷的中斷號(hào),并根據(jù)中斷號(hào)再調(diào)用相關(guān)的中斷服務(wù)程序。

          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設(shè)為IRQ的中斷服務(wù)程序。

          ldr r0,=HandleIRQ

          ldr r1,=IsrIRQ

          str r1,[r0]

          其中HandleEINT0是用戶自己開(kāi)辟的一塊存儲(chǔ)空間的起始地址,后面按次序存放中斷異常處理程序的地址,也可以理解為二級(jí)中斷向量表。IsrIRQ從中斷控制器處獲取中斷源信息,然后再?gòu)亩?jí)中斷向量表中的對(duì)應(yīng)地址單元得到異常中斷處理程序的入口地址,完成異常響應(yīng)的跳轉(zhuǎn)。二級(jí)中斷向量表一般位于HandleFIQ的后面,也就是以_ISR_STARTADDRESS+0x20為起始地址,這里定義了S3C2410處理器所有中斷源的相關(guān)中斷處理處理程序入口。這種方法的好處是用戶程序在運(yùn)行過(guò)程中能夠動(dòng)態(tài)改變異常向量。

          2.3 中斷函數(shù)設(shè)計(jì)

          為了方便高級(jí)語(yǔ)言設(shè)計(jì)中斷處理函數(shù),標(biāo)準(zhǔn)的ARM指令編譯器提供了一個(gè)用來(lái)聲明中斷處理函數(shù)的關(guān)鍵字-irq,使用此關(guān)鍵字聲明的函數(shù)可以被編譯器識(shí)別為中斷處理函數(shù)。編譯后的代碼在處理異常事件前保存現(xiàn)場(chǎng)信息,處理異常事件后對(duì)現(xiàn)場(chǎng)信息進(jìn)行恢復(fù)。中斷函數(shù)設(shè)計(jì)如下:

          static void __irq Eint3Int(void){

          ClearPending(BIT_EINT3);

          Uart_Printf("EINT3 interrupt is occurred.");

          num_int=3;設(shè)置標(biāo)志位

          }

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

          在初始化程序,引用代碼pISR_EINT3=(U32)Eint3Int,即可定義地址_ISR_STARTADDRESS+0x2c內(nèi)容是Eint3Int的地址,外部中斷3產(chǎn)生請(qǐng)求時(shí)即可調(diào)用中斷處理函數(shù)Eint3Int。

          3.外中斷初始化

          S3C2410X的中斷控制寄存器能接收來(lái)自56個(gè)中斷源的請(qǐng)求。內(nèi)部的外圍模塊和外部管腳產(chǎn)生的多個(gè)中斷請(qǐng)求通過(guò)中斷控制器沖裁后,向20T核發(fā)出FIQ或者IRQ中斷。ARM內(nèi)核只有2個(gè)外部中斷輸入信號(hào)nIRQ和nFIQ,在具體嵌入式系統(tǒng)中,需要用中斷控制器管理多個(gè)外部中斷源,選擇其中一個(gè)中斷,通過(guò)nIRQ或nFIQ向ARM內(nèi)核發(fā)出中斷請(qǐng)求,如圖2所示。

          圖2 FIQ/IRQ中斷處理過(guò)程

          20T內(nèi)核可以識(shí)別正常中斷請(qǐng)求和快速中斷請(qǐng)求兩種類型的外部中斷,中斷的行為模式由中斷控制器來(lái)設(shè)置。S3C2410X的中斷控制器包括6類寄存器:中斷源狀態(tài)寄存器、中斷模式寄存器、中斷屏蔽寄存器、優(yōu)先級(jí)寄存器、中斷狀態(tài)寄存器,以及中斷偏移寄存器。

          在初始化程序中,需要選擇相應(yīng)管腳的功能,在此定義GPF3為EINT3模式,通過(guò)外部中斷控制寄存器EXTINT0設(shè)定EINT3是下降沿觸發(fā)方式,通過(guò)設(shè)置中斷源懸掛寄存器SRCPND、中斷懸掛寄存器INTPND和中斷屏蔽寄存器INTMSK開(kāi)啟EINT3。中斷模式寄存器和中斷優(yōu)先級(jí)寄存器采用系統(tǒng)默認(rèn)方式。具體代碼實(shí)現(xiàn)如下:

          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之間的中斷源,還需要設(shè)置外部中斷懸掛寄存器EINTPEND和外部中斷掩碼寄存器EINTMASK的相關(guān)位。

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

          若外部下降沿信號(hào)接到GPF3管腳,就可以調(diào)用Eint3Int中斷處理函數(shù)。

          5.結(jié)論

          本文作者創(chuàng)新點(diǎn)在于采用的異常處理方式靈活可靠,可以在系統(tǒng)運(yùn)行期間動(dòng)態(tài)修改中斷向量表,利用C語(yǔ)言也可實(shí)現(xiàn)中斷處理函數(shù)的動(dòng)態(tài)配置。在所設(shè)計(jì)的鍵盤處理程序中采用該方法,取得了很好地效果,該方法具有很強(qiáng)的通用性。

          參考文獻(xiàn)

          [1] 費(fèi)浙平.ARM 的嵌入式系統(tǒng)程序開(kāi)發(fā)要點(diǎn)(二).單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2003,9:80~83

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

          [3]甘泉,楊健,陳永泰.ARM處理器啟動(dòng)代碼的分析與設(shè)計(jì).2004年全國(guó)第五層嵌入式系統(tǒng)學(xué)術(shù)交流會(huì)論文集,2004:151~154

          [4]張.嵌入式系統(tǒng)硬件設(shè)計(jì)與調(diào)試.北京:機(jī)械工業(yè)出版社.2005,7:279~294



          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();