新聞中心

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

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

        作者: 時間:2010-01-25 來源:網絡 收藏

        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 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 涞水县| 汝南县| 讷河市| 读书| 苍梧县| 彭水| 清镇市| 石泉县| 沁水县| 衡阳市| 呈贡县| 赤壁市| 安乡县| 株洲县| 金门县| 南康市| 乌海市| 彭水| 改则县| 临邑县| 张家川| 彰化市| 潮州市| 南京市| 大方县| 新郑市| 棋牌| 汶川县| 兴安盟| 澄迈县| 洪洞县| 祥云县| 张家港市| 博乐市| 平山县| 浏阳市| 石嘴山市| 滨海县| 合肥市| 镇平县| 镇远县|