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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > VxWorks基于AT91RM9200處理器的中斷處理

          VxWorks基于AT91RM9200處理器的中斷處理

          作者: 時間:2012-03-27 來源:網(wǎng)絡(luò) 收藏

            Vxworks作為一個實時嵌入式操作系統(tǒng),通常采用中斷的方式來滿足系統(tǒng)實時性的要求。

            因此,熟悉其中斷的處理過程對于操作系統(tǒng)的開發(fā)是至關(guān)重要的.本文通過編寫和調(diào)試基于處理器的嵌入式操作系統(tǒng)的BSP,來討論操作系統(tǒng)的中斷機制。

          1 VxWorks機制及AIC

            使用一個8優(yōu)先級,可單獨屏蔽中斷的中斷向量控制器AIC。在ARM體系結(jié)構(gòu)中,有7種異常中斷,對應(yīng)有一個異常中斷向量表。 ARM體系結(jié)構(gòu)要求這個異常中斷向量表從0地址處開始,對于外部中斷請求IRQ,系統(tǒng)又增加了一塊由中斷控制器控制的中斷向量表。

          2 BSP的中斷驅(qū)動的實現(xiàn)
          2.1 中斷驅(qū)動中定義的函數(shù)
            STATUS at91rm9200LvlVecChk (int*,int*);
            STATUS at91rm9200LvlVecAck(int,int);
            STATUS at91rm9200LvlEnable(int);
            STATUS at91rm9200LvlDisable(int);

          2.2 高級中斷控制器AIC的初始化

            在usrInit()中excVecInit()函數(shù)對異常中斷向量進行初始化.整個中斷庫,以及中斷控制器的初始化都是在syslib.c中的 sysHwInit2()函數(shù)中完成的.該函數(shù)在sysClkConnect()中被調(diào)用,因為系統(tǒng)時鐘中斷要在內(nèi)核開放中斷后就要使能,因此內(nèi)核在初始化為一個多任務(wù)環(huán)境后,就產(chǎn)生一個usrRoot()的任務(wù),在該任務(wù)中要建立系統(tǒng)時鐘中斷,因此調(diào)用了sysClkConnect()函數(shù),中斷庫以及中斷控制器的初始化也就完成了。

            高級中斷控制器必須進行初始化,其初始化是在板級支持包BSP的中斷驅(qū)動程序中。具體的實現(xiàn)函數(shù)是void at91rm9200IntDevInit(void)。該函數(shù)在文件syslib.c的sysHwInit2()函數(shù)中調(diào)用。

            at91rm9200IntDevInit(void)函數(shù)中主要是配置系統(tǒng)的鉤子函數(shù),然后對中斷源向量寄存器和中斷模式寄存器進行配置,同時要清除并禁止AIC中所有的中斷。

          2.3 中斷驅(qū)動中的回調(diào)函數(shù)

            在intEnt中,程序很快就進入了特權(quán)模式(SVC32),如果是中斷可嵌套模式,要設(shè)置該模式下的堆棧,并且將中斷深度intCnt值加1.然后跳轉(zhuǎn)到intIntRtnPreempt中,在intIntRtnPreempt中為后來調(diào)用中斷驅(qū)動中的函數(shù)開辟了32個字節(jié)的堆??臻g,并且將程序指針拉到at91rm9200LvlVecChk函數(shù)處執(zhí)行,at91rm9200LvlVecChk函數(shù)是在中斷驅(qū)動中定義的函數(shù),是用來檢測當(dāng)前掛起的中斷中,優(yōu)先級最高的中斷源。檢測出最高優(yōu)先級的中斷后,首先要禁止該中斷,因此要調(diào)用at91rm9200LvlDisable函數(shù),該函數(shù)也在中斷驅(qū)動中定義。在禁止中斷的過程中,需要通過intLock和intUnLock函數(shù)來保護臨界代碼不被新的中斷打斷。

            at91rm9200LvlVecChk()函數(shù)是通過讀AIC_IVR寄存器來獲取當(dāng)前最高優(yōu)先級的中斷,將獲得的中斷號和中斷向量賦給2個變量,并且禁止該中斷。

            at91rm9200LvlVecAek()函數(shù)是在結(jié)束后,通過寫AIC_EIOC寄存器來清除剛剛處理的中斷,并將其使能。 at91rm9200LvlEnable(int leve1)和at91rm9200LvlDisable(int level)來允許和禁止中斷,從而保護臨界代碼不被新的中斷所打斷。

          2.4 中斷驅(qū)動程序?qū)崿F(xiàn)的流程圖

            中斷驅(qū)動程序?qū)崿F(xiàn)的流程圖如圖1所示。


               VxWorks基于AT91RM9200處理器的中斷處理
          圖1 中斷驅(qū)動程序?qū)崿F(xiàn)的流程圖


          上一頁 1 2 下一頁

          關(guān)鍵詞: VxWorks AT91RM9200 中斷處理

          評論


          相關(guān)推薦

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