新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 在ARM處理器上移植uCOS II的中斷處理

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

        作者: 時間:2011-12-03 來源:網(wǎng)絡(luò) 收藏
        3.3 服務(wù)程序

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

        ……

        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

        ……

        在代碼中省略了現(xiàn)場工作寄存器的保護(hù)與恢復(fù)及工作模式的切換。

        3.4 中斷程序

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

        C程序

        void OS_CPU_IRQ_ISR_Handler(void)

        {

        PFNCT pfnct; //定義中斷函數(shù)指針

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

        while(pfnct!=(PFNCT)0)

        {

        (*pfnct)(); //調(diào)用中斷函數(shù)

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

        } //所有中斷都執(zhí)行完畢退出

        }

        中斷程序依賴中斷控制器的中斷響應(yīng)順序,所以 把OS_CPU_IRQ_ISR_Handler()歸屬于用戶程序的一部分。在中斷返回之前,中斷處理程序要處理完所有的中斷響應(yīng),以避免在多個中斷同時響應(yīng)或中斷處理過程中響應(yīng)中斷的情況下, 進(jìn)入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 編寫中斷函數(shù)

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

        4 中斷處理的應(yīng)用示例

        uCOS II要提供周期性信號源,用于實現(xiàn)時間延時和確認(rèn)超時。節(jié)拍率應(yīng)為10~100 Hz。時鐘節(jié)拍源可以由專門的硬件定時器產(chǎn)生,以下就以IRQ中斷方式產(chǎn)生節(jié)拍源為示例。

        初始化中斷控制器:

        C程序

        void VICInit(void)

        {

        VICIntEnClr=0xfffff;

        VICDefVectAddr=-(INT32U)Non_Vect_IRQ_Handler;

        VICVectAddr0= (INT32U)OSTickISR;

        VICVectCntl0= (0x20 | 0x04);

        VICIntEnable= 14;

        }

        定時器0中斷函數(shù):

        C程序

        void OSTickISR(void)

        {

        TO_IR = 0xff;

        OSTimeTick(); //調(diào)用OSTimeTick()

        VICVectAddr=0; //通知中斷控制器中斷結(jié)束

        }

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

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

        5 結(jié)束語

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

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


        上一頁 1 2 下一頁

        關(guān)鍵詞: 中斷 處理 II uCOS 處理器 移植 ARM

        評論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 大邑县| 鱼台县| 巨野县| 建始县| 县级市| 琼海市| 隆化县| 伊通| 龙南县| 雷山县| 桐乡市| 南部县| 玉树县| 林甸县| 五大连池市| 西和县| 甘南县| 乐安县| 东海县| 磐石市| 武邑县| 台南县| 囊谦县| 宁远县| 兴和县| 梁河县| 大渡口区| 靖安县| 城步| 永德县| 周宁县| 仁怀市| 长岛县| 泾川县| 阜阳市| 榕江县| 南华县| 沙河市| 津南区| 余江县| 自贡市|