新聞中心

ARM的中斷原理

作者: 時間:2016-11-11 來源:網(wǎng)絡(luò) 收藏
1.中斷概述

CPU與外設(shè)的數(shù)據(jù)傳輸方式通常有以下3種方式:查詢方式、中斷方式、DMA方式。

本文引用地址:http://butianyuan.cn/article/201611/316975.htm

所謂查詢方式是指,CPU不到查詢外設(shè)的狀態(tài),如果外設(shè)準(zhǔn)備就緒則開始進(jìn)行數(shù)據(jù)傳輸;如果外設(shè)還沒有準(zhǔn)備好,CPU將進(jìn)入循環(huán)等待狀態(tài)。很顯然這樣浪費(fèi)了大量的CPU時間,降低了CPU的利用率。

所謂中斷方式是指,當(dāng)外設(shè)準(zhǔn)備好與CPU進(jìn)行數(shù)據(jù)傳輸時,外設(shè)首先向CPU發(fā)出中斷請求,CPU接收到中斷請求并在一定條件下,暫時停止原來的程序并執(zhí)行中斷服務(wù)處理程序,執(zhí)行完畢以后再返回原來的程序繼續(xù)執(zhí)行。由此可見,采用中斷方式避免了CPU把大量的時間花費(fèi)在查詢外設(shè)狀態(tài)的操作上,從而大大提高了CPU的執(zhí)行效率。
ARM系統(tǒng) 包括兩類中斷:一類是IRQ中斷,另一類是FIQ中斷。IRQ是普通中斷,F(xiàn)IQ是快速中斷,在進(jìn)行大批量的復(fù)制、數(shù)據(jù)傳輸?shù)裙ぷ鲿r,常使用FIQ中斷。FIQ的優(yōu)先級高于IRQ。
在ARM系統(tǒng)中,支持7類異常,包括:復(fù)位、未定義指令、軟中斷、預(yù)取中止、數(shù)據(jù)中止、IRQ和FIQ,每種異常對應(yīng)于不同的處理器模式。一旦發(fā)生異常,首先要進(jìn)行模式切換,然后程序?qū)⑥D(zhuǎn)到該異常對應(yīng)的固定存儲地址執(zhí)行。這個固定的地址稱為異常向量。異常向量中保存的通常為異常處理程序的地址。ARM的異常向量如下:
異常 模式 正常地址 高向量地址
復(fù)位管理 0x00000000 0xFFFF0000
未定義指令 未定義0x00000004 0xFFFF 0004
軟中斷 管理 0x00000008 0xFFFF 0008

預(yù)取指中止 中止 0x0000000C 0xFFFF 000C
數(shù)據(jù)中止 中止 0x00000010 0xFFFF0010
IRQ IRQ 0x000000180xFFFF0018
FIQ FIQ 0x0000001C 0xFFFF 001C

由此可見,IRQ中斷和FIQ中斷都屬于ARM的異常模式。在ARM系統(tǒng)中,一旦有中斷發(fā)生,不管是外部中斷,還是內(nèi)部中斷,正在執(zhí)行的程序都會停下來。接下來通常會按照如下步驟處理中斷:

(1)保存現(xiàn)場。保存當(dāng)前的PC值到R14,保存當(dāng)前的程序運(yùn)行狀態(tài)到SPSR。
(2)模式切換。根據(jù)發(fā)生的中斷類型,進(jìn)入IRQ模式或FIQ模式。
(3)獲取中斷源。以異常向量表保存在低地址處為例,若是IRQ中斷,則PC指針跳動0x18處;若是FIQ中斷,則跳到0x1C處。IRQ和FIQ的異常向量地址處一般保存的是中斷服務(wù)子程序的地址,所以接下來PC指針跳入中斷服務(wù)子程序處理中斷。
(4)中斷處理。
(5)中斷返回,恢復(fù)現(xiàn)場。當(dāng)完成中斷服務(wù)子程序后,將SPSR中保存的程序運(yùn)行狀態(tài)恢復(fù)到CPSR中,R14中保存的被中斷程序的地址恢復(fù)到PC中,繼續(xù)執(zhí)行被中斷的程序。
2.S3C2410A的中斷控制器
ARM920T CPU的中斷可分為FIQ和IRQ。為了使CPU能夠響應(yīng)中斷,必須首先對程序狀態(tài)寄存器(PSR)中的F位和I位進(jìn)行正確設(shè)置。如果PSR的F位為1,則CPU不會響應(yīng)來自中斷控制器的FIQ中斷;如果PSR的I位為1,則CPU不會響應(yīng)來自中斷控制器的IRQ中斷。因此,為了使中斷控制器能夠接收中斷請求,必須在啟動代碼中將PSR中的F位和I位設(shè)置為0,同時還需要將中斷屏蔽寄存器(INTMSK)中的相應(yīng)位設(shè)置為0。
中斷屏蔽寄存器用于指示中斷是否禁止。設(shè)置為1表示相應(yīng)中斷禁止,為0則發(fā)生中斷時正常執(zhí)行中斷服務(wù)。如果發(fā)生中斷時相應(yīng)的屏蔽位正好為1,則中斷掛起寄存器中的相應(yīng)中斷源掛起位將置1。
S3C2410A有2個中斷掛起寄存器:中斷源掛起寄存器(SPCPND)和中斷掛起寄存器(INTPND)。這兩個掛起寄存器用于指示某個中斷請求是否處于掛起狀態(tài)。當(dāng)多個中斷源請求中斷服務(wù)時,SRCPND寄存器中的相應(yīng)位置1,仲裁過程結(jié)束后INTPND寄存器中只有1位被自動置1。
S3C2410A中的中斷控制器能夠接收來自56個中斷源的請求。見芯片手冊,由于引腳有限,因此采用了共享中斷技術(shù)。由芯片手冊可知S3C2410A共有32個中斷請求信號。中斷請求的優(yōu)先級邏輯是由7個仲裁器組成的,其中包括6個一級仲裁器和1個二級仲裁器。每個仲裁器是否使能由寄存器PRIORITY[6:0]決定。每個仲裁器可以處理4~6個中斷源,從中選出優(yōu)先級最高的。優(yōu)先級順序由寄存器PRIORITY[20:7]的相應(yīng)位決定。
要想使用S3C2410A的中斷控制器,必須對以下列出的寄存器進(jìn)行正確配置。以下寄存器中的每一位含義參閱芯片手冊。
寄存器地址 描述 復(fù)位值
SRCPND0x4A000000 中斷源掛起寄存器,當(dāng)中斷產(chǎn)生后,相應(yīng)位置1 0x0
INTMOD0x4A000004 中斷模式寄存器0=IRQ模式,1=FIQ模式 0x0
INTMSK0x4A00 0008 中斷屏蔽寄存器 0=中斷允許,1=中斷蔽0xFFFFFFF

PRIORITY0x4A00000C 中斷優(yōu)先級控制寄存器,設(shè)置中斷優(yōu)先級 0x7F
INTPND0x4A000010 中斷掛起寄存器,只是中斷請求的狀態(tài)。 0x0
0=該中斷沒有請求 1=該中斷源發(fā)出中斷請求

INTOFFSET0x4A000014 中斷偏移寄存器,只是IRQ中斷源 0x0
SUBSRCPND0x4A000018子中斷源掛起寄存器,指示中斷請求的狀態(tài)0x0
0=該中斷沒有請求 1=該中斷源發(fā)出中斷請求

INTSUBMSK0x4A00 001C定義哪個中斷源屏蔽 0=中斷服務(wù)允許,1=中斷服務(wù)屏 0x7FF
所有來自中斷源的中斷請求首先被登記到中斷源掛起寄存器中。在中斷模式寄存器,中斷請求分成兩類:FIQ和IRQ。多個IRQ中斷的仲裁過程在優(yōu)先級寄存器進(jìn)行。
中斷源掛起寄存器可以看作各種中斷有無請求的狀態(tài)標(biāo)志寄存器。相應(yīng)位置1,說明存在該中斷請求;相應(yīng)位為0,說明該中斷請求產(chǎn)生。
中斷模式寄存器主要用于配置該中斷是IRQ型中斷,還是FIQ型中斷。


3.中斷編程實例
介紹一個通過定時器1中斷控制CPU板上的LED1和LED2實現(xiàn)輪流閃爍的實例,需要完成的主要工作如下:
(1)對定時器1初始化,并設(shè)定定時器的中斷時間為1s,據(jù)代碼參見Timer1_init()函數(shù)。
void Timer1_init(void){

rGPCON=rGPGCON&0xfff0ffff|0x00050000; //配置GPG口為輸出口

rGPGDAT=rGPGDAT|0x300;
rTCFG0=255;

rTCFG1=0
rTCNTB1=48828; //在pclk=50MHz下,1s的記數(shù)值rTCNTB1=50000000/4/256=48828
rTCMPB1=0x00;
rTCON=(1
rTCON=(1
}
(2)為了使CPU響應(yīng)中斷,在中斷服務(wù)子程序執(zhí)行之前,必須打開ARM920T的CPSR中的I位,以及相應(yīng)的中斷屏蔽寄存器中的位。打開相應(yīng)的中斷屏蔽寄存器的位,是在Timer1INT_Init()函數(shù)中實現(xiàn),具體代碼如下。
void Timer1INT_Init(void){
//定時器接口使能
if((rINTPND&BIT_TIMER1)){
rSRCPND|=BIT_TIMER1;
}
pISR_TIMER1=(int)Timer1_ISR;
//寫入定時器1中斷服務(wù)子程序的入口地址
rINTMSK&=~(BIT_TIMER1);
//開中斷
}
(3)等待定時器中斷,通過一個死循環(huán)如“while(1);”實現(xiàn)等待過程。
(4)根據(jù)設(shè)置的定時時間,產(chǎn)生定時器中斷。中斷發(fā)生后,首先進(jìn)行現(xiàn)場保護(hù),然后轉(zhuǎn)入中斷的入口代碼處執(zhí)行。該部分代碼通常使用匯編語言編寫。在執(zhí)行中斷服務(wù)程序之前,要確保HandleIRQ地址處保存中斷分發(fā)程序IsrIRQ的入口地址,代碼如下:
ldrr0,=HandleIRQ
ldrr1,=IsrIRQ
strr1,[r0]


接下來將執(zhí)行IsrIRQ中斷分發(fā)程序,具體代碼如下。
IsrIRQ
subsp,sp,#4 ;為保存PC預(yù)留堆??臻g
stmfdsp!,{r8-r9}
ldrr9,=INTOFFSET
ldrr9,[r9] ;加載INTOFFSET寄存器值到r9
ldrr8,=HandleEINT0;加載中斷向量表的基地址到r8
addr8,r8,r9,lsl#2;獲得中斷向量
ldrr8,[r8] ;加載中斷服務(wù)程序的入口地址到r8
strr8,[sp,#8] ;保存sp,將其作為新的pc值
ldmfd sp!,{r8-r9,pc};跳轉(zhuǎn)到新的pc處執(zhí)行,即跳轉(zhuǎn)到中斷服務(wù)子程序執(zhí)行


(5)執(zhí)行中斷服務(wù)子程序,該子程序?qū)崿F(xiàn)將LED1和LED2燈熄滅或點亮。從現(xiàn)象中看到LED1和LED2燈閃爍一次,就說明定時器發(fā)生了一次中斷。具體實現(xiàn)見函數(shù)Timer1_ISR().
int flag;
void_ _irq Timer1_ISR(void){
if(flag==0){
rGPGDAT=rGPGDAT&0xeff|0x200;
flag=1;
}else{
rGPGDAT=rGPGDAT&0xdff|0x100;
flag=0;
}
rSRCPND|=BIT_TIMER1;
rINTPND|=BIT_TIMER1;
}
(6)從中斷中返回,恢復(fù)現(xiàn)場,跳轉(zhuǎn)到被中斷的主程序繼續(xù)執(zhí)行,等待下一次中斷的到來。



關(guān)鍵詞: ARM中斷原

評論


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

關(guān)閉