新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > UCOS移植心得

        UCOS移植心得

        作者: 時間:2016-11-27 來源:網絡 收藏


        然后是OSIntCtxSw():完成中斷級任務切換,大部分和上一個函數一樣

        _OSIntCtxSw:

        CALL _OSTaskSwHook




        //OSUCBCur=OSTCBHighRdy

        R1=_OSTCBCur

        R2=[_OSTCBHighRdy]

        [R1]=R2



        //OSPrioCur=OSPrioHighRdy

        R1=[_OSPrioHighRdy]

        [_OSPrioCur]=R1



        R1=[_OSTCBHighRdy]

        SP=[R1]



        POP R1 FROM [SP]

        [_InterruptC]=R1

        CMP R1,0//查看是否需要關中斷處理

        JE KAI1//如果不需要則直接返回

        IRQ OFF//需要就關中斷

        KAI1:POP R1,R5 FROM [SP]

        RETI

        還有一個是OSTickISR():

        這個函數其實不是必須叫這個名字,可以根據具體情況改變的,在uCOS_II.h里面關于函數原型的部分可以看到,它的原型是條件編譯的,只要你定義一個OS_ISR_PROTO_EXT,編譯器就不會再去編譯這個原型了,定義OS_ISR_PROTO_EXT意味著你告訴編譯器你將自己另寫中斷函數的,不再使用OSTickISR(),同時由于OSCtxSw()和OSTickISR()使用相同的

        條件編譯,你還必須再自己在OS_CPU.H里面寫一條語句:#defineOS_TASK_SW()OSCtxSw();這樣的話,就在任務切換時將調用你編寫的函數(不過我開始沒有定義那個OS_ISR_PROTO_EXT時也沒有出現問題,所以這塊我也不太肯定)


        我自己寫的中斷函數是針對凌陽的,代碼如下:


        _IRQ6:

        PUSH R1,R5 TO [SP]

        R1=0x0002

        [P_INT_Clear]=R1//清中斷標志



        CALL _Clear_Dog//俗稱喂狗



        R1=[_OSIntNesting]

        R1+=1

        [_OSIntNesting]=R1

        CMP R1,1

        JNE TCB//查看是否發生中斷嵌套,

        R1=[_InterruptC]//如果沒有嵌套,則保存當前任務的中斷計數器

        PUSH R1 TO [SP]//及任務堆棧地址

        R2=[_OSTCBCur]

        [R2]=SP


        TCB:CALL _OSTimeTick

        CALL _OSIntExit


        R1=[_OSIntNesting]//如果能執行到此,則說明不需要任務切換

        CMP R1,0//查看是否發生過中斷嵌套

        JNE TCB1//如果發生過,則沒有保存中斷計數器

        POP R1 FROM [SP]//否則需要彈出中斷計數器調整堆棧指針

        [_InterruptC]=R1

        TCB1:POPR1,R5 FROM [SP]

        RETI


        OS_CPU.H:

        在這個文件里面主要就是定義數據類型,一樣的數據不同的CPU有不同的位數,在這里就是要定義移植過程中的數據位數問題,還有就是定義堆棧的生長方式,及OS_ENTER_CRITICAL( ),OS_EXIT_CRITICAL( ),OS_TASK_SW( ),也都是比較簡單的問題,比較容易處理,不多廢話

        雖然說編譯器有時候出些莫名其妙的問題,但我還是要說用好你的IDE真的是太重要了,象我在開始時老有問題,我不知道到底哪有毛病,懷疑是在保存堆棧指針時有問題,因為那一塊盡是一堆的指針操作,我開始不知道怎么用那個變量查看窗口,就沒辦法確定我是否操作正確,最后比不得已,弄了半天學會了,通過那個窗口查看變量后,才確定自己真的是錯在那了……


        再有一個小小的經驗就是像這種比較大的東西你要step調試真的很暈,我是自己搭了個小小的測試平臺(其實就是8個發光二極管),連到B口,建立任務直接看結果,很簡單,但真的很管用!

        上一頁 1 2 下一頁

        關鍵詞: UCOS移植心

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 固原市| 香格里拉县| 南川市| 常熟市| 光山县| 宿迁市| 林芝县| 九江市| 河源市| 乌恰县| 威宁| 万全县| 淮北市| 平昌县| 台东市| 府谷县| 巨鹿县| 武强县| 彭水| 浦北县| 卓尼县| 漯河市| 南宫市| 耿马| 汤阴县| 天气| 蓝田县| 商水县| 尖扎县| 孟州市| 都兰县| 通化市| 晴隆县| 滦南县| 长汀县| 大理市| 汾西县| 肥西县| 封丘县| 冷水江市| 中方县|