新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > VxWorks基于AT91RM9200處理器的中斷處理

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

        作者: 時間:2012-03-27 來源:網絡 收藏

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

          因此,熟悉其中斷的處理過程對于操作系統的開發是至關重要的.本文通過編寫和調試基于處理器的嵌入式操作系統的BSP,來討論操作系統的中斷機制。

        1 VxWorks機制及AIC

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

        2 BSP的中斷驅動的實現
        2.1 中斷驅動中定義的函數
          STATUS at91rm9200LvlVecChk (int*,int*);
          STATUS at91rm9200LvlVecAck(int,int);
          STATUS at91rm9200LvlEnable(int);
          STATUS at91rm9200LvlDisable(int);

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

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

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

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

        2.3 中斷驅動中的回調函數

          在intEnt中,程序很快就進入了特權模式(SVC32),如果是中斷可嵌套模式,要設置該模式下的堆棧,并且將中斷深度intCnt值加1.然后跳轉到intIntRtnPreempt中,在intIntRtnPreempt中為后來調用中斷驅動中的函數開辟了32個字節的堆棧空間,并且將程序指針拉到at91rm9200LvlVecChk函數處執行,at91rm9200LvlVecChk函數是在中斷驅動中定義的函數,是用來檢測當前掛起的中斷中,優先級最高的中斷源。檢測出最高優先級的中斷后,首先要禁止該中斷,因此要調用at91rm9200LvlDisable函數,該函數也在中斷驅動中定義。在禁止中斷的過程中,需要通過intLock和intUnLock函數來保護臨界代碼不被新的中斷打斷。

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

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

        2.4 中斷驅動程序實現的流程圖

          中斷驅動程序實現的流程圖如圖1所示。


             VxWorks基于AT91RM9200處理器的中斷處理
        圖1 中斷驅動程序實現的流程圖


        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 兴安县| 赤峰市| 嘉善县| 周至县| 百色市| 白山市| 大荔县| 清苑县| 上犹县| 信阳市| 鹤山市| 离岛区| 观塘区| 施秉县| 柳江县| 衡南县| 即墨市| 肃宁县| 哈巴河县| 白银市| 金昌市| 黔西县| 阳信县| 锦州市| 合江县| 万全县| 比如县| 台安县| 中卫市| 徐州市| 阿克陶县| 衡阳市| 兴山县| 车险| 许昌市| 崇礼县| 阜宁县| 徐汇区| 浦县| 鹤峰县| 石渠县|