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

          新聞中心

          ARM的中斷原理

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

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

          本文引用地址:http://www.ex-cimer.com/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時(shí)間,降低了CPU的利用率。

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

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

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

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

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


          3.中斷編程實(shí)例
          介紹一個(gè)通過定時(shí)器1中斷控制CPU板上的LED1和LED2實(shí)現(xiàn)輪流閃爍的實(shí)例,需要完成的主要工作如下:
          (1)對(duì)定時(shí)器1初始化,并設(shè)定定時(shí)器的中斷時(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ù)中實(shí)現(xiàn),具體代碼如下。
          void Timer1INT_Init(void){
          //定時(shí)器接口使能
          if((rINTPND&BIT_TIMER1)){
          rSRCPND|=BIT_TIMER1;
          }
          pISR_TIMER1=(int)Timer1_ISR;
          //寫入定時(shí)器1中斷服務(wù)子程序的入口地址
          rINTMSK&=~(BIT_TIMER1);
          //開中斷
          }
          (3)等待定時(shí)器中斷,通過一個(gè)死循環(huán)如“while(1);”實(shí)現(xiàn)等待過程。
          (4)根據(jù)設(shè)置的定時(shí)時(shí)間,產(chǎn)生定時(shí)器中斷。中斷發(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燈熄滅或點(diǎn)亮。從現(xiàn)象中看到LED1和LED2燈閃爍一次,就說明定時(shí)器發(fā)生了一次中斷。具體實(shí)現(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中斷原

          評(píng)論


          技術(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); })();