蔣天發(fā),劉永奎
(中南民族大學(xué)計(jì)算機(jī)科學(xué)學(xué)院,武漢430074)
隨著嵌入式技術(shù)的發(fā)展,嵌入式系統(tǒng)的應(yīng)用越來越廣泛.嵌入式系統(tǒng)是指以應(yīng)用為中心,以計(jì)算機(jī)技術(shù)為基礎(chǔ),軟硬件可裁剪,適應(yīng)應(yīng)用系統(tǒng)對(duì)功能、可靠性、成本、體積和功耗嚴(yán)格要求的專用計(jì)算機(jī)系統(tǒng)[1].中斷在嵌入式系統(tǒng)中起著十分重要的作用,一個(gè)功能完備的中斷系統(tǒng),能極大地提高計(jì)算機(jī)處理事件的能力,提高效率,增強(qiáng)實(shí)時(shí)性.中斷技術(shù)的采用,擴(kuò)展了計(jì)算機(jī)的應(yīng)用以及各應(yīng)用領(lǐng)域的自動(dòng)化和智能化.
中斷是一個(gè)非常重要的概念,用來通知處理器發(fā)生了某種事情.處理器響應(yīng)中斷后,即會(huì)進(jìn)入相應(yīng)中斷處理程序進(jìn)行處理.為了能使中斷處理完后正確返回到被中斷的原程序斷點(diǎn)處繼續(xù)往下執(zhí)行,必須將斷點(diǎn)處的現(xiàn)場(chǎng)(如程序指針PC的當(dāng)前值,寄存器等內(nèi)容)壓入堆棧保護(hù).待執(zhí)行完中斷處理程序,恢復(fù)現(xiàn)場(chǎng)(將原壓入堆棧的內(nèi)容出棧恢復(fù)),返回原斷點(diǎn)繼續(xù)執(zhí)行原程序[2].這一過程,保證了原程序執(zhí)行的連續(xù)性.
在ARM 體系結(jié)構(gòu)中,異常中斷用來處理軟件中斷,未定義指令陷阱及系統(tǒng)復(fù)位功能和外部事件,這些“不正?!笔录急粍潥w“異?!?表1為中斷向量表,它給出了ARM 體系中的幾種異常中斷[3].復(fù)位一般發(fā)生在系統(tǒng)加電或系統(tǒng)復(fù)位時(shí);當(dāng)ARM 處理器或者是系統(tǒng)中的協(xié)處理器認(rèn)為當(dāng)前指令未定義時(shí),產(chǎn)生未定義指令異常中斷;軟件中斷是由用戶定義的中斷指令;當(dāng)處理器預(yù)取的指令地址不存在或者該地址不允許當(dāng)前指令訪問,而該預(yù)取指令被執(zhí)行時(shí),產(chǎn)生指令預(yù)取中止異常;當(dāng)數(shù)據(jù)訪問指令的目標(biāo)地址不存在或該地址不允許當(dāng)前指令訪問時(shí),產(chǎn)生數(shù)據(jù)訪問中止異常;當(dāng)處理器外部中斷請(qǐng)求引腳有效,且CPSR寄存器的I位控制位被清零時(shí),產(chǎn)生外部中斷請(qǐng)求(IRQ);當(dāng)處理器外部中斷請(qǐng)求引腳有效,且CPSR寄存器的F位控制位被清零時(shí),產(chǎn)生快速中斷請(qǐng)求(F IQ).
表1 中斷向量表Tab.1 Interrup tion vecto r tab le
異??偸窃贏RM 狀態(tài)中進(jìn)行處理.當(dāng)處理器處于Thum b狀態(tài)時(shí)發(fā)生了異常,在異常向量地址裝入PC時(shí),會(huì)自動(dòng)切換到ARM 狀態(tài).F IQ和數(shù)據(jù)中止異常同時(shí)發(fā)生時(shí),ARM 7TDM I內(nèi)核首先進(jìn)入數(shù)據(jù)中止處理程序,然后立即跳轉(zhuǎn)到F IQ向量.在F IQ處理結(jié)束后返回到數(shù)據(jù)中止處理程序.數(shù)據(jù)中止的優(yōu)先級(jí)必須高于F IQ以確保數(shù)據(jù)轉(zhuǎn)移錯(cuò)誤不會(huì)被漏過.
LPC2294有4個(gè)低有效的外部中斷輸入管腳:E IN T 0、E IN T 1、E IN T 2、E IN T 3. 通過軟件設(shè)置引腳選擇寄存器(P IN ESLEx),可以將多個(gè)引腳同時(shí)作為同一個(gè)外部中斷的輸入引腳.E IN T 0~E IN T 3外部中斷的邏輯電路接收所有與之相連引腳的狀態(tài)和信號(hào).
根據(jù)其方式位和極性位的不同,外部中斷邏輯處理如下.
低電平觸發(fā)方式:作為E IN T功能的全部引腳的狀態(tài)相與后作為輸入信號(hào);
高電平觸發(fā)方式:作為E IN T功能的全部引腳的狀態(tài)相或后作為輸入信號(hào);
邊沿觸發(fā)方式:只使用GP IO端口號(hào)最低的那個(gè)引腳,并且與極性設(shè)置無關(guān).
圖1 外部中斷內(nèi)部結(jié)構(gòu)圖Fig.1 In ternal structu re diagram o f ex ternal in terrup tion
L PC 2294具有2個(gè)中斷輸入,分別為IRQ中斷和F IQ中斷.但是芯片內(nèi)部有多個(gè)中斷源,最多可以有32個(gè)中斷輸入請(qǐng)求.向量中斷控制器(V IC)的作用就是允許哪些中斷源可以產(chǎn)生中斷、可以產(chǎn)生哪類中斷、產(chǎn)生中斷后執(zhí)行哪段服務(wù)程序[4].
中斷輸入請(qǐng)求可以在V IC中被設(shè)置為以下3類.
快速中斷請(qǐng)求(F IQ):具有最高優(yōu)先級(jí),如果分配給F IQ的請(qǐng)求多于1個(gè),V IC將中斷請(qǐng)求“相或”后向ARM 處理器產(chǎn)生F IQ信號(hào).F IQ服務(wù)程序從V IC中讀出一個(gè)字來識(shí)別產(chǎn)生中斷請(qǐng)求的F IQ中斷源是哪一個(gè).當(dāng)只有一個(gè)中斷被分配為F IQ時(shí)可實(shí)現(xiàn)最短的F IQ等待時(shí)間,因?yàn)镕 IQ服務(wù)程序只要簡(jiǎn)單地啟動(dòng)器件處理就可以了.
向量IRQ中斷:具有中等優(yōu)先級(jí);該級(jí)別可分配32個(gè)中斷請(qǐng)求中的16個(gè).32個(gè)請(qǐng)求中的任意一個(gè)都可分配到16個(gè)向量IRQ slo t中的任意一個(gè),其中slo t0具有最高優(yōu)先級(jí),而slo t15則為最低優(yōu)先級(jí).
非向量IRQ中斷:具有最低優(yōu)先級(jí).
通過中斷選擇寄存器(V IC In tSelect)來選擇產(chǎn)生中斷的類型,寄存器中每一位控制著一個(gè)中斷源(如WDT),每個(gè)外圍設(shè)備都有一條中斷線連接到向量中斷控制器,但有些可能擁有幾個(gè)內(nèi)部中斷標(biāo)志,單個(gè)中斷標(biāo)志也有可能代表一個(gè)以上的中斷.向某位寫入1時(shí),對(duì)應(yīng)中斷源產(chǎn)生的中斷為F IQ中斷,寫入0時(shí)為IRQ中斷[5].
V IC最多支持16個(gè)向量IRQ中斷,這些中斷被分為16個(gè)優(yōu)先級(jí),并且為每個(gè)優(yōu)先級(jí)指定一個(gè)服務(wù)程序入口地址.任何IRQ中斷產(chǎn)生之后,微控制器跳轉(zhuǎn)到地址0x18執(zhí)行代碼,該地址處的指令為:
LDR PC,[PC,#-0xff0]
在執(zhí)行該指令時(shí),PC指向當(dāng)前指令后的第2條指令,即地址0x20.該指令將內(nèi)存地址:
0x20-0xFF0=0xFFFFF030
處的內(nèi)容存入PC,該地址正是V ICV ectA dd r寄存器的地址.所以一條ARM 指令即可實(shí)現(xiàn)程序向中斷服務(wù)程序的跳轉(zhuǎn).這正是向量IRQ中斷具有較快的中斷響應(yīng)的主要原因.
任何中斷源都可以設(shè)置為非向量IRQ中斷,它與向量IRQ中斷的區(qū)別在于不能為每個(gè)非向量IRQ中斷源設(shè)置服務(wù)程序地址,而是所有的非向量IRQ中斷都共用一個(gè)相同的服務(wù)程序入口地址.
圖2 硬件原理圖Fig.2 Hardw are diagram
鍵盤是通過按鍵的按下與松開2種狀態(tài)來改變輸入管腳的輸入電平,從而產(chǎn)生按鍵信號(hào),然后根據(jù)具體管腳的電平狀態(tài)來確定是哪個(gè)鍵被按下.
當(dāng)按鍵按下以后,一般存在一定的抖動(dòng),其抖動(dòng)的時(shí)間取決于按鍵的機(jī)械特性,一般抖動(dòng)期為幾毫秒,因此需要做去抖動(dòng)處理.
鍵盤的基本結(jié)構(gòu)如圖2所示.
LPC2294共有144個(gè)引腳,每邊36個(gè),圖2只標(biāo)出了在鍵盤中斷中用到的幾個(gè)引腳.
具體實(shí)現(xiàn)的程序可以分為以下3個(gè)函數(shù).
(1)中斷使能函數(shù).
(2)I/O口初始化函數(shù)vo id IO-In it4().
(3)中斷函數(shù)vo id--irq IO- In terrup t4(vo id).
if(k!=0){//上面幾行程序用來按鍵消抖,兩次讀I/O口,延遲//18m s后,仍為低電平,說明有鍵按下
以上程序已通過調(diào)試,按鍵能夠很好地使用,按鍵具體要實(shí)現(xiàn)什么功能,可以在此基礎(chǔ)上進(jìn)行擴(kuò)展.
如果在片內(nèi)RAM 中調(diào)試程序,并使用了中斷,那么必須將中斷向量重新映射到F lash地址0x0.這是因?yàn)樗械漠惓O蛄慷嘉挥诘刂?x0及以上,可以通過將寄存器M EMM A P配置為RAM 模式來實(shí)現(xiàn)這一點(diǎn).
把某個(gè)引腳設(shè)置為外部中斷功能后,該引腳為輸入模式,由于沒有內(nèi)部上拉電阻,所以必須外接一個(gè)上拉電阻,確保引腳不被懸空.
在中斷服務(wù)程序執(zhí)行完畢后,對(duì)外設(shè)中斷標(biāo)志的清零將會(huì)對(duì)V IC寄存器(V ICRaw In tr、V ICF IQ Status和V IC IRQ Status)當(dāng)中的對(duì)應(yīng)位產(chǎn)生影響.另外,為了能夠服務(wù)下次中斷,必須在中斷返回之前對(duì)V ICV ectA dd r寄存器執(zhí)行寫操作,該寫操作將清零內(nèi)部中斷優(yōu)先級(jí)硬件當(dāng)中對(duì)應(yīng)的中斷標(biāo)志.
[1] 周立功.ARM 嵌入式系統(tǒng)基礎(chǔ)教程[M].北京:北京航空航天大學(xué)出版社,2005:1-3.
[2] 李順章,吳國(guó)東,趙河明.微機(jī)原理與接口技術(shù)[M].北京:機(jī)械工業(yè)出版社,2006:155-158.
[3] 杜春雷.ARM 體系結(jié)構(gòu)與編程[M].北京:清華大學(xué)出版社,2003:17-19.
[4] Ph ilip s Sem iconducto rs.LPC2292/2294 userm anual[EB/OL].[2004-03-01].h ttp://www.zlgm cu.com/NXP/index.h tm
[5] ARM L im ited.Prim eCellV ecto red In terrup tContro ller(PL 190)[EB/OL]. Technical Reference M anual,[2004-05-17].h ttp://infocen ter.arm.com/help/index.jsp?top ic=/com.arm.doc.rss/docsrss.xm l.