<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > ARM的中斷原理

ARM的中斷原理

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

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

本文引用地址:http://dyxdggzs.com/article/201611/316975.htm

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

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

預取指中止 中止 0x0000000C 0xFFFF 000C
數據中止 中止 0x00000010 0xFFFF0010
IRQ IRQ 0x000000180xFFFF0018
FIQ FIQ 0x0000001C 0xFFFF 001C

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

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

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

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

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


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

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

rGPGDAT=rGPGDAT|0x300;
rTCFG0=255;

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


接下來(lái)將執行IsrIRQ中斷分發(fā)程序,具體代碼如下。
IsrIRQ
subsp,sp,#4 ;為保存PC預留堆??臻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};跳轉到新的pc處執行,即跳轉到中斷服務(wù)子程序執行


(5)執行中斷服務(wù)子程序,該子程序實(shí)現將LED1和LED2燈熄滅或點(diǎn)亮。從現象中看到LED1和LED2燈閃爍一次,就說(shuō)明定時(shí)器發(fā)生了一次中斷。具體實(shí)現見(jiàn)函數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)從中斷中返回,恢復現場(chǎng),跳轉到被中斷的主程序繼續執行,等待下一次中斷的到來(lái)。



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

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>