<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 從 μC/OS 升級(jí)到 μC/OS-II

          從 μC/OS 升級(jí)到 μC/OS-II

          作者: 時(shí)間:2016-10-08 來(lái)源:網(wǎng)絡(luò) 收藏

          對(duì)棧操作由低地址向高地址增長(zhǎng),設(shè)OS_STK_GROWTH 為 0

          對(duì)棧操作由高地址向低地址遞減,設(shè)OS_STK_GROWTH 為 1

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

          10.2.4OS_TASK_SW()

          OS_TASK_SW()是一個(gè)宏,從μC/OS升級(jí)到μC/OS-II時(shí),這個(gè)宏不需要改動(dòng)。當(dāng)μC/OS-II從低優(yōu)先級(jí)的任務(wù)向高優(yōu)先級(jí)的任務(wù)切換時(shí)要用到這個(gè)宏,OS_TASK_SW()的調(diào)用總是出現(xiàn)在任務(wù)級(jí)代碼中。

          10.2.5OS_FAR

          因?yàn)镮ntel80x86的結(jié)構(gòu)特點(diǎn), 在μC/OS中使用過(guò)OS_FAR 。 這個(gè)定義語(yǔ)句 (#define ) 在μC/OS-II中去掉了,因?yàn)檫@條定義使移植變得不方便。結(jié)果是對(duì)于Intel80x86,如果用戶定義在大模式下編譯時(shí),所有存儲(chǔ)器屬性都將為遠(yuǎn)程(FAR).

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

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

          voidOS_FARtask(void*pdata)

          {

          pdata=pdata;

          while(1){

          .

          .

          }

          }

          10.3 OS_CPU_A.ASM

          移植μC/OS 和μC/OS-II 需要用戶用匯編語(yǔ)言寫(xiě)4個(gè)相當(dāng)簡(jiǎn)單的函數(shù)。

          OSSTartHighRdy()

          OSCtxSw()

          OSIntCtxSw()

          OSTickISR()

          10.3.1OSStartHighRdy()

          在μC/OS-II中,OSStartHighRdy()要調(diào)用OSSTaskSwHook()。OSTaskSwHook()這個(gè)函數(shù)在μC/OS中沒(méi)有。用戶將最高優(yōu)先級(jí)任務(wù)的棧指針裝入CPU之前要先調(diào)用OSTaskSwHook()。

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

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

          OSStartHighRdy:

          CallOSTaskSwHook(); 調(diào)用OSTaskSwHook();

          SetOSRunningto1; 置 OSRunning 為

          1;

          LoadtheprocessorstackpointerwithOSTCBHighRdy->OSTCBStkPtr;

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

          針;

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

          ExecuteaReturnfromInterruptinstruction; 執(zhí)行中斷返回指令;

          10.3.2OSCtxSw()

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

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

          OSCtxSw:

          PUSHprocessorregistersontothecurrenttask’sstack;

          所有處理器寄存器的值推入當(dāng)前任務(wù)棧;

          SavethestackpointeratOSTCBCur->OSTCBStkPtr;

          CallOSTaskSwHook();1)

          OSTCBCur=OSTCBHighRdy;

          OSPrioCur=OSPrioHighRdy;(2)

          LoadtheprocessorstackpointerwithOSTCBHighRdy->OSTCBStkPtr;

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

          針;

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

          ExecuteaReturnfromInterruptinstruction;

          10.3.3OSIntCtxSw()

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

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

          OSIntCtxSw():

          AdjustthestackpointertoremovecalltoOSIntExit(),localsin

          OSIntExit()

          andthecalltoOSIntCtxSw();

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

          SavethestackpointeratOSTCBCur->OSTCBStkPtr;

          保存棧指針到OSTCBCur->OSTCBStkPtr;

          CallOSTaskSwHook(); 調(diào)用OSTaskSwHook();(1)

          OSTCBCur=OSTCBHighRdy;

          OSPrioCur=OSPrioHighRdy;(2)

          LoadtheprocessorstackpointerwithOSTCBHighRdy->OSTCBStkPtr;

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

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

          ExecuteaReturnfromInterruptinstruction; 執(zhí)行中斷返回指令;

          10.3.4OSTickISR()

          在μC/OS-II和μC/OS 中,這個(gè)函數(shù)的代碼是一樣,無(wú)須改變。

          10.4 OS_CPU_C.C

          移植 μC/OS-II 需要用C語(yǔ)言寫(xiě)6個(gè)非常簡(jiǎn)單的函數(shù):

          OSTaskStkInit()

          OSTaskCreateHook()

          OSTaskDelHook()

          OSTaskSwHook()

          OSTaskStatHook()

          OSTimeTickHook()

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

          10.4.1OSTaskStkInit()

          在μC/OS中,OSTaskCreate()被認(rèn)為是與使用的微處理器類型有關(guān)的函數(shù)。實(shí)際上這個(gè)函數(shù)中只有一部分內(nèi)容是依賴于微處理器類型的。在μC/OS-II中,與使用的微處理器類型有關(guān)的那一部分已經(jīng)從函數(shù)OSTaskCreate() 中抽出來(lái)了,放在一個(gè)叫作OSTaskStkInit()的函數(shù)中。

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

          OS_EXIT_CRIITICAL() 到 [L10.9(2)] 調(diào)用 OSTaskStkInit() 都抽出來(lái)并移到了



          關(guān)鍵詞:

          評(píng)論


          相關(guān)推薦

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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();