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

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ARM中斷處理及狀態(tài)機(jī)嵌套實(shí)現(xiàn)

          ARM中斷處理及狀態(tài)機(jī)嵌套實(shí)現(xiàn)

          作者: 時(shí)間:2016-11-19 來(lái)源:網(wǎng)絡(luò) 收藏
          1.ARM7提供兩種級(jí)別的中斷, FIQ(Fast Interrupt Request快中斷) 一般中斷低速反應(yīng)中斷IRQ。

          所有的中斷請(qǐng)求一旦產(chǎn)生則中斷反應(yīng)會(huì)經(jīng)過(guò)三個(gè)步驟
          a.輸入階段這個(gè)邏輯可以根據(jù)中斷源被實(shí)現(xiàn),需要0-2個(gè)時(shí)鐘周期
          b.EIC自身處理 2個(gè)時(shí)鐘周期
          c.ARM7的邏輯處理
          2.EIC Enhanced Interrupt Controller增強(qiáng)型中斷控制器
          EIC硬件處理多路中斷,中斷優(yōu)先運(yùn)算和矢能。
          a.32路可屏蔽的中斷,映射到ARM 的CPU中斷請(qǐng)求總線
          b.每路16級(jí)可編程優(yōu)先級(jí)映射IRQ
          c.硬件支持最大16個(gè)中斷嵌套
          d.2路可屏蔽的中斷通過(guò)FIQ中斷請(qǐng)求總線
          e.在0x18處的寄存器裝載的是最高優(yōu)先及中斷用戶自定義的中斷處理地址
          f.16個(gè)XTI塊外部中斷
          3.中斷處理過(guò)程
          1.檢查相關(guān)中斷的請(qǐng)求屏蔽位
          2.比較所有中斷請(qǐng)求的優(yōu)先級(jí),IRQ當(dāng)前中斷是否優(yōu)先級(jí)高于當(dāng)前存儲(chǔ)的中斷。
          3.自動(dòng)裝載EIC_SIRn[31:16]位用戶自定義地址進(jìn)入EIC_IVR[15:0]中
          4.手動(dòng)裝載用戶中斷處理高16位地址進(jìn)入EIC_IVR[31:16]
          5.當(dāng)新產(chǎn)生一個(gè)中斷則保存先前的中斷優(yōu)先級(jí)進(jìn)入優(yōu)先棧中。
          6.當(dāng)新的中斷被接受則用新的優(yōu)先級(jí)更新當(dāng)前中斷優(yōu)先級(jí)寄存器

          EIC_ICR 中斷控制寄存器
          31-2保留
          1. FIQ_EN:RW是FIQ允許的標(biāo)志位置1開(kāi)啟置0關(guān)閉
          0.IRQ_EN:RW是IRQ允許的標(biāo)志位置1開(kāi)啟置0關(guān)閉

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

          EIC_CICR 中斷頻道控制寄存器
          31-5保留
          4-0.CIC[4:0]:R是當(dāng)前中斷的序號(hào),是第幾號(hào)中斷由中斷請(qǐng)求發(fā)生時(shí)硬件寫(xiě)入

          EIC_CIPR當(dāng)前中斷優(yōu)先級(jí)寄存器
          31-4保留
          3-0 CIP[3:0]:rw是當(dāng)前中斷的優(yōu)先級(jí),在IRQ總線上會(huì)自動(dòng)探測(cè)進(jìn)入的中斷請(qǐng)求優(yōu)先級(jí)
          和當(dāng)前的優(yōu)先級(jí)的高低。

          EIC_IVR 中斷矢量寄存器
          IVR[31-16]:IRQ用戶寫(xiě)入的在程序初始化時(shí),是中斷服務(wù)的高16位地址
          IVR[15-0]:I在中斷請(qǐng)求接受后,從EIC_SIRn[31-16]的自定義服務(wù)程序地址拷貝過(guò)來(lái)

          EIC_FIR
          3-2FIP[3:2] 是FIQ的中斷頻道
          1-0FIE[1:0] 是FIQ的中斷允許標(biāo)志位

          EIC_IER0中斷啟動(dòng)寄存器
          32為對(duì)應(yīng)配置32路中斷的運(yùn)行位


          EIC_IEP0中斷啟動(dòng)寄存器
          32對(duì)應(yīng)配置32路中斷的中斷掛靠位根據(jù)IER0中設(shè)置同步。
          note:只讀/寫(xiě)零的寄存器,在退出中斷服務(wù)后ISR,軟件要清除相應(yīng)的掛靠位,
          才能保證下次不繼續(xù)進(jìn)入這個(gè)中斷,這個(gè)清除操作帶來(lái)一個(gè)中斷結(jié)束中斷
          并且保證有已經(jīng)嵌套的中斷正常彈出,順利執(zhí)行新的中斷。
          這個(gè)中斷位要注意不能隨便清除如果清除了不是期望的中斷位的話,導(dǎo)致
          嵌套堆棧永不恢復(fù)。

          EIC_SIRn源中斷寄存器
          SIV[31-16]是自定義服務(wù)地址偏移
          15-4保留
          3-0優(yōu)先級(jí)

          FSM: 有限狀態(tài)機(jī)制
          FSM分為兩種狀態(tài)READY和WAIT,這兩種狀態(tài)根據(jù)ARM7TDMI的nIRQ總線探測(cè)出來(lái)
          如果全局中斷允許位IRQ_EN標(biāo)志被清除,nIRQ無(wú)條件的的檢測(cè)為高.在reset的
          時(shí)候FSM=READY也就是nIRQ=HIGH,當(dāng)優(yōu)先解碼確定了一個(gè)新的中斷,FSM=WAIT
          并且nIRQ=LOW。如果要轉(zhuǎn)到就緒狀態(tài)必須強(qiáng)制讀EIC_IVR寄存器內(nèi)容即處理中
          斷服務(wù)或者rest EIC單元。讀EIC_IVR寄存器改變狀態(tài)機(jī)狀態(tài)同時(shí)釋放EIC的
          nIRQ總線。

          STACK:堆棧
          ARM支持15個(gè)事件嵌套,嵌套的事件信息均在需要的時(shí)候被壓入彈出堆棧。
          事件的信息包括 中斷頻道EIC_CICR interrupt channel,中斷優(yōu)先級(jí)EIC_CIPR
          interrupt priority.
          當(dāng)FSM=WAIT即狀態(tài)機(jī)在等待狀態(tài)也就是解碼出一個(gè)最高優(yōu)先中斷源時(shí),直接來(lái)讀取
          EIC_IVR寄存器會(huì)產(chǎn)生內(nèi)部標(biāo)志,需要把EIC_CICR EIC_CIPR入棧,當(dāng)做完入棧工作
          后才在第二時(shí)鐘周期讀取EIC_IVR進(jìn)行中斷服務(wù),讀完后內(nèi)部標(biāo)志清除即需要把當(dāng)前
          的EIC_CICR EIC_CIPR給出棧。 然后更新當(dāng)前中斷源和當(dāng)前中斷優(yōu)先寄存器。
          當(dāng)FSM=READY的時(shí)候EIC_IVR的訪問(wèn)時(shí)候是不產(chǎn)生內(nèi)部標(biāo)志來(lái)進(jìn)行嵌套的。
          在嵌套時(shí)當(dāng)前中斷服務(wù)完成后必須清除相應(yīng)標(biāo)志位(具體看EIC_IEP0介紹)
          然后處理上一個(gè)被壓棧的中斷。



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