新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 從 μC/OS 升級到 μC/OS-II

        從 μC/OS 升級到 μC/OS-II

        作者: 時間:2016-10-08 來源:網絡 收藏

        對棧操作由低地址向高地址增長,設OS_STK_GROWTH 為 0

        對棧操作由高地址向低地址遞減,設OS_STK_GROWTH 為 1

        有些新的常數定義(#define constants )在μC/OS中是沒有的,故要加到OS_CPU.H中去。

        10.2.4OS_TASK_SW()

        OS_TASK_SW()是一個宏,從μC/OS升級到μC/OS-II時,這個宏不需要改動。當μC/OS-II從低優先級的任務向高優先級的任務切換時要用到這個宏,OS_TASK_SW()的調用總是出現在任務級代碼中。

        10.2.5OS_FAR

        因為Intel80x86的結構特點, 在μC/OS中使用過OS_FAR 。 這個定義語句 (#define ) 在μC/OS-II中去掉了,因為這條定義使移植變得不方便。結果是對于Intel80x86,如果用戶定義在大模式下編譯時,所有存儲器屬性都將為遠程(FAR).

        在μC/OS-II中,任務返回值類型定義如程序清單L10.5所示。用戶可以重新編輯所有OS_FAR的文件,或者在μC/OS-II中將OS_FAR定義為空,去掉OS_FAR,以實現向μC/OS-II的升級。

        程序清單 L10.5 在 μC/OS 中任務函數的定義

        voidOS_FARtask(void*pdata)

        {

        pdata=pdata;

        while(1){

        .

        .

        }

        }

        10.3 OS_CPU_A.ASM

        移植μC/OS 和μC/OS-II 需要用戶用匯編語言寫4個相當簡單的函數。

        OSSTartHighRdy()

        OSCtxSw()

        OSIntCtxSw()

        OSTickISR()

        10.3.1OSStartHighRdy()

        在μC/OS-II中,OSStartHighRdy()要調用OSSTaskSwHook()。OSTaskSwHook()這個函數在μC/OS中沒有。用戶將最高優先級任務的棧指針裝入CPU之前要先調用OSTaskSwHook()。

        還有, OSStartHighRdy要在調用OSTaskSwHook()之后立即將OSRunning設為1。程序清單L10.6 給出OSStartHighRdy()的示意代碼。.μC/OS只有其中最后三步。

        程序清單 L10.6 OSStartHighRdy()的示意代碼

        OSStartHighRdy:

        CallOSTaskSwHook(); 調用OSTaskSwHook();

        SetOSRunningto1; 置 OSRunning 為

        1;

        LoadtheprocessorstackpointerwithOSTCBHighRdy->OSTCBStkPtr;

        將 OSTCBHighRdy->OSTCBStkPtr 裝入處理器的棧指

        針;

        POPalltheprocessorregistersfromthestack; 從棧中彈出所有寄存器的值;

        ExecuteaReturnfromInterruptinstruction; 執行中斷返回指令;

        10.3.2OSCtxSw()

        在μC/OS-II中,任務切換要增作兩件事,首先,將當前任務棧指針保存到當前任務控制塊TCB后要立即調用OSTaskSwHook()。其次,在裝載新任務的棧指針之前必須將OSPrioCur設為OSPrioHighRdy 。OSCtxSw()的示意代碼如程序清單L10.7所示。μC/OS-II加上了步驟L10.7(1)和(2)。

        程序清單 L10.7 OSCtxSw()的示意代碼

        OSCtxSw:

        PUSHprocessorregistersontothecurrenttask’sstack;

        所有處理器寄存器的值推入當前任務棧;

        SavethestackpointeratOSTCBCur->OSTCBStkPtr;

        CallOSTaskSwHook();1)

        OSTCBCur=OSTCBHighRdy;

        OSPrioCur=OSPrioHighRdy;(2)

        LoadtheprocessorstackpointerwithOSTCBHighRdy->OSTCBStkPtr;

        將 OSTCBHighRdy->OSTCBStkPtr 裝入處理器的棧指

        針;

        POPalltheprocessorregistersfromthestack; 從棧中彈出所有寄存器的值;

        ExecuteaReturnfromInterruptinstruction;

        10.3.3OSIntCtxSw()

        如同上述函數一樣,在μC/OS-II.中,OSCtxSw()也增加了兩件事。首先,將當前任務的棧指針保存到當前任務的控制塊TCB后要立即調用OSTaskSwHook()。其次,在裝載新任務的棧指針之前必須將OSPrioCur 設為OSPrioHighRdy。程序清單L10.8給出OSIntCtxSw()的示意代碼。μC/OS-II.中增加了L10.8(1)和(2)。

        程序清單L10.8OSIntCtxSw()的示意代碼

        OSIntCtxSw():

        AdjustthestackpointertoremovecalltoOSIntExit(),localsin

        OSIntExit()

        andthecalltoOSIntCtxSw();

        調整由于調用上述子程序引起的棧指針值的變化;

        SavethestackpointeratOSTCBCur->OSTCBStkPtr;

        保存棧指針到OSTCBCur->OSTCBStkPtr;

        CallOSTaskSwHook(); 調用OSTaskSwHook();(1)

        OSTCBCur=OSTCBHighRdy;

        OSPrioCur=OSPrioHighRdy;(2)

        LoadtheprocessorstackpointerwithOSTCBHighRdy->OSTCBStkPtr;

        將 OSTCBHighRdy->OSTCBStkPtr 裝入處理器的棧指針;

        POPalltheprocessorregistersfromthestack; 從棧中彈出所有寄存器的值;

        ExecuteaReturnfromInterruptinstruction; 執行中斷返回指令;

        10.3.4OSTickISR()

        在μC/OS-II和μC/OS 中,這個函數的代碼是一樣,無須改變。

        10.4 OS_CPU_C.C

        移植 μC/OS-II 需要用C語言寫6個非常簡單的函數:

        OSTaskStkInit()

        OSTaskCreateHook()

        OSTaskDelHook()

        OSTaskSwHook()

        OSTaskStatHook()

        OSTimeTickHook()

        其中只有一個函數OSTaskStkInit()是必不可少的。其它5個只需定義,而不包括任何代碼。

        10.4.1OSTaskStkInit()

        在μC/OS中,OSTaskCreate()被認為是與使用的微處理器類型有關的函數。實際上這個函數中只有一部分內容是依賴于微處理器類型的。在μC/OS-II中,與使用的微處理器類型有關的那一部分已經從函數OSTaskCreate() 中抽出來了,放在一個叫作OSTaskStkInit()的函數中。

        OSTaskStkInit()只負責設定任務的棧,使之看起來好像中斷剛剛發生過,所有的CPU寄存器都被推入堆棧。作為提供給用戶的例子,程序清單L10.9給出Intel80x86實模式,在大模式下編譯的 μC/OS的OSTaskCreate()函數的代碼。程序清單L10.10是同類微微處理器的μC/OS-II的OSTaskStkInit()函數的代碼。比較這兩段代碼,可以看出:從 [L10.9(1)]

        OS_EXIT_CRIITICAL() 到 [L10.9(2)] 調用 OSTaskStkInit() 都抽出來并移到了



        關鍵詞:

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 大田县| 福州市| 永定县| 北京市| 剑川县| 盐边县| 方正县| 柳州市| 黑水县| 和静县| 大同县| 宿迁市| 璧山县| 临湘市| 白玉县| 民权县| 耒阳市| 彭泽县| 彭山县| 大邑县| 高密市| 罗源县| 高清| 阜康市| 广安市| 西华县| 广灵县| 古蔺县| 新河县| 盈江县| 穆棱市| 澄城县| 淮安市| 云南省| 图片| 宁波市| 开封市| 拉萨市| 延庆县| 神农架林区| 通榆县|