新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 在ARM處理器上移植uCOS II的中斷處理

        在ARM處理器上移植uCOS II的中斷處理

        作者: 時間:2011-12-03 來源:網絡 收藏
        3.3 服務程序

        以IRQ為例服務程序(OS_CPU_IRQ_ISR)主要依據上面所描述的“ 中斷響應的過程”編寫,其主要代碼如下:

        ……

        LDR R0,OS_IntNesting

        LDRB R1,[R0]

        ADD R1,R1,#1

        STRB R1,[R0]

        CMP R1,#l

        BNE OS_CPU_IRQ_ISR_1

        LDR R4,OS_TCBCur

        LDR R5,[R4]

        STR SP,[R5]

        OS_CPU_IRQ_ISR_1:

        MSR CPSR_c,#(NO_INT | IRQ32_MODE)

        //切換到SVC模式

        LDR R0,OS_CPU_IRQ_ISR_Handler

        MOV LR,PC

        BX R0

        MSR CPSR_c,#(NO_INT | SVC32_MODE)

        //切換到SVC模式

        LDRR0,OS_IntExit //OSIntExit()

        MOV LR,PC

        BX R0

        ……

        在代碼中省略了現場工作寄存器的保護與恢復及工作模式的切換。

        3.4 中斷程序

        以IRQ中斷為例,中斷程序:

        C程序

        void OS_CPU_IRQ_ISR_Handler(void)

        {

        PFNCT pfnct; //定義中斷函數指針

        pfnct=(PFNCT)VICVectAddr; //獲取函數地址

        while(pfnct!=(PFNCT)0)

        {

        (*pfnct)(); //調用中斷函數

        pfnct=(PFNCT)VICVectAddr; //獲取新的中斷函數

        } //所有中斷都執行完畢退出

        }

        中斷程序依賴中斷控制器的中斷響應順序,所以 把OS_CPU_IRQ_ISR_Handler()歸屬于用戶程序的一部分。在中斷返回之前,中斷處理程序要處理完所有的中斷響應,以避免在多個中斷同時響應或中斷處理過程中響應中斷的情況下, 進入OS_CPU_IRQ_ISR () 和退出OS_CPU_IRQ_ISR()時,OS_CPU_IRQ_ISR()耗盡保存CPU寄存器的堆棧空間。

        另外,在OS_CPU_IRQ_ISR_Handler()中不要清CPSR的I位來開放中斷,因為沒有必要使用中斷嵌套,OS_CPU_IRQ_ISR_Handler()在返回之前會檢查并處理所有的中斷。

        3.5 編寫中斷函數

        中斷函數一般采用C語言編寫, 建議中斷函數應盡量短,一般做法是在中斷函數中緩存數據,給任務發送一個信號來處理數據。中斷函數的地址在系統初始化的時候要置人中斷向量寄存器(VICVectAddr0~15)。由于向量中斷控制器(VIC)的特殊結構,在中斷函數中要寫一次中斷向量寄存器(VICVectAddr)。

        4 中斷處理的應用示例

        uCOS II要提供周期性信號源,用于實現時間延時和確認超時。節拍率應為10~100 Hz。時鐘節拍源可以由專門的硬件定時器產生,以下就以IRQ中斷方式產生節拍源為示例。

        初始化中斷控制器:

        C程序

        void VICInit(void)

        {

        VICIntEnClr=0xfffff;

        VICDefVectAddr=-(INT32U)Non_Vect_IRQ_Handler;

        VICVectAddr0= (INT32U)OSTickISR;

        VICVectCntl0= (0x20 | 0x04);

        VICIntEnable= 14;

        }

        定時器0中斷函數:

        C程序

        void OSTickISR(void)

        {

        TO_IR = 0xff;

        OSTimeTick(); //調用OSTimeTick()

        VICVectAddr=0; //通知中斷控制器中斷結束

        }

        當定時中斷發生時調用OS_CPU_IRQ_ISR Handler(),得到OSTickISR()的地址并執行,在OSTickISR()中調用OSTimeTick()為uCOS II提供周期性信號源。

        此代碼在GNU工具鏈-GCC下編譯通過,并在Easy2100開發實驗板上得到驗證。

        5 結束語

        通過示例講述了在uCOS II移植過程中的中斷處理所需要注意的幾個問題和通用方法,經筆者在GNU工具鏈下編譯、調試,并在實驗板上得到很好的驗證。這種移植方案的中斷函數都

        使用C語言編寫,具有較好的移植性,有利于對不同需求的用戶進行中斷擴充,增強了中斷嵌套時uCOS II運行的穩定性,使移植具有更好的通用性。


        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 黑山县| 盐亭县| 封开县| 清新县| 平和县| 乌兰浩特市| 修水县| 米泉市| 江都市| 泽普县| 岳阳市| 棋牌| 修水县| 彭州市| 新丰县| 泸西县| 兴宁市| 洛扎县| 陕西省| 阿拉尔市| 富宁县| 三穗县| 无棣县| 濮阳县| 罗源县| 焉耆| 抚宁县| 融水| 兴国县| 大洼县| 保靖县| 霍林郭勒市| 汾阳市| 界首市| 孟连| 连州市| 容城县| 荥经县| 永胜县| 大厂| 马公市|