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

          新聞中心

          2440之中斷管理

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

          中斷是嵌入式里最重要的一個(gè)概念。一般一個(gè)系統(tǒng)對(duì)于一個(gè)設(shè)備要么采用中斷方式,要么采用輪詢方式 。中斷方式可以有效地減少處理器負(fù)荷 ,但是如果大量采用中斷則有可能降低處理速度 ,因?yàn)橹袛嗵幚砥茐牧颂幚砥鞯牧魉畽C(jī)制。復(fù)習(xí)下微機(jī)原理中中斷處理過(guò)程和中斷機(jī)制。

          本文引用地址:http://www.ex-cimer.com/article/201611/316741.htm

          2440中支持FIQ(快速中斷)和IRQ(普通中斷)2種中斷方式,一般只采用IRQ中斷。2440有60個(gè)中斷源,不支持中斷嵌套。具體的參考用戶手冊(cè)第14章。下圖是2440中斷產(chǎn)生過(guò)程。

          具體的講解一下,關(guān)于寄存器請(qǐng)查閱用戶手冊(cè)。

          中斷源分為2種,子中斷中斷源和中斷源,當(dāng)一個(gè)子中斷產(chǎn)生一個(gè)中斷信號(hào),子中斷源掛起寄存器(SUBRCPND)相應(yīng)位自動(dòng)置1,察看子中斷屏蔽寄存器(SUBMASK)該子中斷是否被屏蔽(人工設(shè)置),如果沒(méi)屏蔽,則中斷源寄存器(SRCPND)置1,察看該中斷源是否被屏蔽和采用那種模式,如果沒(méi)被屏蔽,采用IRQ模式,進(jìn)行優(yōu)先級(jí)判斷后,高優(yōu)先級(jí)的執(zhí)行,中斷掛起寄存器置1,產(chǎn)生IRQ信號(hào)。同時(shí)CPSR寄存器的I位置1,表明當(dāng)前有一個(gè)IRQ中斷產(chǎn)生。記得以前讓大家注意該寄存器中的I和Q位了吧,他的作用就在這 。

          中斷處理過(guò)程:

          CPU每執(zhí)行一條指令都會(huì)檢查CPSR寄存器,當(dāng)發(fā)現(xiàn)I和F位被置1時(shí),就進(jìn)行中斷處理。第一步跳入異常向量表:

          b ResetHandler

          b HandlerUndef ;handler for Undefined mode

          b HandlerSWI ;handler for SWI interrupt

          b HandlerPabort ;handler for PAbort

          b HandlerDabort ;handler for DAbort

          b . ;reserved

          b HandlerIRQ ;handler for IRQ interrupt

          b HandlerFIQ ;handler for FIQ interrupt

          HandlerFIQ HANDLER HandleFIQ

          HandlerIRQ HANDLER HandleIRQ

          HandlerUndef HANDLER HandleUndef

          HandlerSWI HANDLER HandleSWI

          HandlerDabort HANDLER HandleDabort

          HandlerPabort HANDLER HandlePabort

          ^ _ISR_STARTADDRESS ; _ISR_STARTADDRESS=0x33FF_FF00

          HandleReset # 4

          HandleUndef # 4

          HandleSWI # 4

          HandlePabort # 4

          HandleDabort # 4

          HandleReserved # 4

          HandleIRQ # 4

          HandleFIQ # 4

          如果是IRQ 則跳到HandlerIRQ,此過(guò)程由硬件來(lái)完成。接下來(lái)

          ldr r0,=HandleIRQ ;This routine is needed

          ldr r1,=IsrIRQ ;if there is not subs pc,lr,#4 at 0x18, 0x1c

          str r1,[r0]

          進(jìn)行第2次跳轉(zhuǎn),跳轉(zhuǎn)到2級(jí)中斷向量表

          IsrIRQ

          sub sp,sp,#4 ;reserved for PC

          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}

          HandleEINT0 # 4

          HandleEINT1 # 4

          HandleEINT2 # 4

          HandleEINT3 # 4

          次代碼完成了建立2級(jí)中斷向量表,在我們中斷程序中我們先對(duì)中斷進(jìn)行注冊(cè)

          例 EINT0 = ISR_FUNC();這樣就完成了中斷向量和中斷服務(wù)程序的關(guān)聯(lián)。跳到2級(jí)中斷向量表后就進(jìn)入了中斷處理程序。中斷處理完成了CPU返回繼續(xù)執(zhí)行中斷處理前的下一條程序,關(guān)于處理現(xiàn)場(chǎng)的保護(hù)部分參考微原部分。

          下邊是一個(gè)關(guān)于中斷處理函數(shù)的測(cè)試題:明白中斷處理函數(shù)的使用

          中斷是嵌入式系統(tǒng)中重要的組成部分,這導(dǎo)致了很多編譯開(kāi)發(fā)商提供一種擴(kuò)展—讓標(biāo)準(zhǔn)C支持中斷。具代表事實(shí)是,產(chǎn)生了一個(gè)新的關(guān)鍵字

          __interrupt。下面的代碼就使用了__interrupt關(guān)鍵字去定義了一個(gè)中斷服務(wù)子程序(ISR),請(qǐng)?jiān)u論一下這段代碼的。

          __interrupt double compute_area (double radius)

          {

          double area = PI * radius * radius;

          printf("nArea = %f", area);

          return area;

          }

          上邊就是2440的中斷產(chǎn)生及處理過(guò)程,這些是最基本的知識(shí)要牢牢掌握。對(duì)于ARM這些都是一樣的,只不過(guò)是寄存器有可能不一樣,但處理過(guò)程是一樣的,有些處理器支持中斷可重入,如710處理器。閱讀下用戶手冊(cè)14章中關(guān)于優(yōu)先級(jí)部分,注意下有些寄存器的清0方法。



          關(guān)鍵詞: 2440中斷管

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