![嵌入式實時操作系統(tǒng)ucos-ii邵貝貝譯-原版第8章_第1頁](http://file4.renrendoc.com/view/97c89634814644922ffa63e28bc29afd/97c89634814644922ffa63e28bc29afd1.gif)
![嵌入式實時操作系統(tǒng)ucos-ii邵貝貝譯-原版第8章_第2頁](http://file4.renrendoc.com/view/97c89634814644922ffa63e28bc29afd/97c89634814644922ffa63e28bc29afd2.gif)
![嵌入式實時操作系統(tǒng)ucos-ii邵貝貝譯-原版第8章_第3頁](http://file4.renrendoc.com/view/97c89634814644922ffa63e28bc29afd/97c89634814644922ffa63e28bc29afd3.gif)
![嵌入式實時操作系統(tǒng)ucos-ii邵貝貝譯-原版第8章_第4頁](http://file4.renrendoc.com/view/97c89634814644922ffa63e28bc29afd/97c89634814644922ffa63e28bc29afd4.gif)
![嵌入式實時操作系統(tǒng)ucos-ii邵貝貝譯-原版第8章_第5頁](http://file4.renrendoc.com/view/97c89634814644922ffa63e28bc29afd/97c89634814644922ffa63e28bc29afd5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第八 移植μC/OS-μC/OS-Ⅱ移植到不同的處理器上。所謂移植,就是使一個實時內(nèi)核理器寄存器時只能通過匯編語言來實現(xiàn)。由于μC/OS-Ⅱ在設(shè)計時就已經(jīng)充分考慮了可移植性,所μC/OS-Ⅱ的移植相對來說是比較容易的。如果已經(jīng)有人在您使用的處理器上成功地移植μC/OS-Ⅱ,您也得到了相關(guān)代碼,就不必看本章了。當(dāng)然,本章介紹的內(nèi)容將有要使μC/OS處理器的C編譯器能產(chǎn)生可重入代碼用C處理器支持中斷,并且能產(chǎn)生定時中斷(通常在10100Hz之間處理器支持能夠容納一定量數(shù)據(jù)(可能是幾千字節(jié))的硬件堆棧處理器有將堆棧指針和其它CPU寄存器讀出和到堆?;騼?nèi)存中的指令圖8.1說明了μC/OS-Ⅱ的結(jié)構(gòu)以及它與硬件的關(guān)系。由于μC/OS-Ⅱ為,當(dāng)用戶用到μC/OS-Ⅱ時,有責(zé)任公開應(yīng)用μC/OS-Ⅱ的配置代碼。這本書和磁盤包含了所有與處理器無關(guān)的代碼和In80x86實模式下的與處理器相關(guān)的代碼(C編譯器大模式下果沒有只好自己編寫了。用戶可以在正式的μC/OS-Ⅱwww.μCOS-Ⅱ.com中查找一些移圖 μC/OS-II硬件和體系結(jié)如果用戶理解C編譯器的技術(shù)細(xì)節(jié)μC/OS-Ⅱ的工作實際上是非常簡單的。前提是您的處理器和編μC/OS-Ⅱ的要求,并且已經(jīng)有了必要工具。移植用#define 10個數(shù)據(jù)類型(OS_CPU.H)用#define三個宏用C一旦代碼移植結(jié)束,下一步工作就是測試。測試一個象μC/OS-Ⅱ一樣的多任務(wù)實時內(nèi)開發(fā)工數(shù)據(jù)放置在目標(biāo)處理器的指定內(nèi)存空間中。所用的C編譯器還必須提供一個機(jī)制來從C以直接從C中允許和中斷。和文本書所付的磁盤中提供了μC/OS-Ⅱ的安裝程序,可在硬盤上安裝μC/OS-Ⅱ和移植實例代碼(In80x86實模式,大模式編譯)。我設(shè)計了續(xù)的結(jié)構(gòu),使得用戶更容方法(包括的建立和文件名等等。所有的移植實例都應(yīng)放在用戶硬盤的\SOFTWARE\μCOS-Ⅱ下。各個微處理器或微控制器的移植源代碼必須在以下兩個或三個文件中找到:OS_CPU.H,OS_CPU_C.C,語言中匯編語言,所以用戶可以將所需的匯編語言代碼直接放到OS_CPU_C.C中。放置移植實例的決定于用戶所用的處理器,例如在下面的表中所示的放置不同移植實例的 /AMDMotorolaMotorola 在第一章中曾提到過,INCLUDES.H一個頭文件,它在所有.C件的第一行被包#include INCLUDES.H使得用戶項目中的每個.C不用分別去考慮它實際上需要哪些頭文件。INCLUDES.H的唯一缺點是它可能會包含一些實際不相關(guān)的頭文件。這意味著每個文件可以通過INCLUDES.H來增加自己的頭文件,但是用戶的頭文件必須添加在頭文件列表大體結(jié)構(gòu)如程序L8.1所示。程 L8.1#ifdefOS_CPU_GLOBALS#defineOS_CPU_EXT#defineOS_CPU_EXTextern數(shù)據(jù)類typedefunsignedchartypedefunsignedchartypedefsignedchartypedefunsignedint
INT8U;/*無符號8位整數(shù)*/INT8S;/*有符號8位整數(shù)*/INT16U;/*無符號16位整數(shù)*/
typedef /*有符號16位整 typedefunsignedlongINT32U; /*無符號32位整數(shù) typedef long /*有符號32位整 typedefunsigned /*堆 寬度為16位
#define#defineOS_ENTER_CRITICAL()???中???/*#define /*1=向下0=向上*#define因為不同的微處理器有不同的字長,所以μC/OS-Ⅱ的移植包括了一系列的類型定義以確保其可移植性。尤其是,μC/OS-Ⅱ代碼從不使用Cshort,intlong型,因例如,INT16U數(shù)據(jù)類型總是代16無符號整數(shù)。現(xiàn)在,μC/OS-Ⅱ和用戶的應(yīng)用程序就可以估計出為該數(shù)據(jù)類型的變量的數(shù)值范圍是0-65535。將μC/OS-Ⅱ移植到32用戶必須將任務(wù)堆棧的數(shù)據(jù)類型告訴給μC/OS-Ⅱ。這個過程是通過為OS_STK正確的C數(shù)據(jù)類型來完成的。如果用戶的處理器上的堆棧成員是32位的,并且用戶的編譯文件指定整型為32位數(shù),那么就應(yīng)該將OS_STK位無符號整型數(shù)據(jù)類型。所有的任務(wù)堆棧都必須用OS_STK來數(shù)據(jù)類型。用戶所必須要做的就是查看編譯器手冊,并找到對應(yīng)于μC/OS-Ⅱ的標(biāo)準(zhǔn)C數(shù)據(jù)類型。EI和_與所有的實時內(nèi)核一樣,μC/OS-Ⅱ需要先中斷再代碼的臨界段,并且完畢后重新允許中斷。這就使得μC/OS-Ⅱ能夠保護(hù)臨界段代碼免受多任務(wù)或中斷服務(wù)例程的系統(tǒng)對實件的響應(yīng)能力。雖然μC/OS-Ⅱ盡量使中斷時間達(dá)到最短,但是μC/OS-會提供一定的指令來/允許中斷,因此用戶的C編譯器必須要有一定的機(jī)制來直接從C中執(zhí)行這些操作。有些編譯器能夠允許用戶在C源代碼中匯編語言。這樣就使得插可以直接從C中允許和中斷。為了隱藏編譯器廠商提供的具體實現(xiàn)方法,μC/OS-Ⅱ定義了兩個宏來和允許中斷:OS_ENTER_CRITICAL()OS_EXIT_CRITICAL()[L8.1(3)]{{/*?μC/OS-II臨界代碼*/}執(zhí)行這兩個宏的第一個也是最簡單的方法是在OS_ENTER_CRITICAL()中調(diào)用處理器指令來中斷,以及在OS_EXIT_CRITICAL()中調(diào)用允許中斷指令。但是,在這個過程中還的時候,中斷可能會變成是允許的了!如果用戶中斷就表明用戶想在從μC/OS-Ⅱ函數(shù)執(zhí)行OS_ENTER_CRITICAL()的第二個方法是先將中斷狀態(tài)保存到堆棧中,然中斷。而執(zhí)行OS_EXIT_CRITICAL()的時候只是從堆棧中恢復(fù)中斷狀態(tài)。如果用這個方法的話,不管用戶是在中斷還是允許的情況下調(diào)用μC/OS-Ⅱ服務(wù),在整個調(diào)用過程中都不會改變中斷狀態(tài)。如果用戶在中斷的時候調(diào)用μC/OS-Ⅱ服務(wù),其實用戶是在延長應(yīng)用程OS_ENTER_CRITICAL得節(jié)拍中斷!很明顯,所有的PEND調(diào)用都會涉及到這個問題,用戶得十分。一個通用如果用戶想在調(diào)用μC/OS-Ⅱ服務(wù)過程中保持中斷狀態(tài),那么很明顯用戶應(yīng)該選擇第二#define#defineOS_ENTER_CRITICAL()asm#define asm#define#defineOS_ENTER_CRITICAL()asmPUSHF;#define asm在這種情況下,OS_ENTER_CRITICAL()需要12個時鐘周期,而OS_EXIT_CRITICAL()需要另外的8個時鐘周期(總共有20個周期)。這樣,保持中斷狀態(tài)要比簡單的/允許中斷多花16個時鐘周期的時間(至少在80186上是這樣的)。當(dāng)然,如果用戶有一個速度比較快的處理器(如InPentiumⅡ),那么這兩種方法的時間差別會很小。式工作的。μC/OS-Ⅱ被設(shè)計成兩種情況都可以處理,只要在結(jié)構(gòu)常量OS_STK_GROWTH置OS_STK_GROWTH1表示堆棧從上往下長)任務(wù)時被調(diào)用的。OS_TASK_SW()總是在任務(wù)級代碼中被調(diào)用的。另一個函數(shù)OSIntExitOSCtxSw()8.04.02)。例如,在In或者AMD80x86處理器上可以使用INT指令。但是中斷處理向量需要指向OSCtxSw()。Motorola68HC11處理器使用的是SWI指令,同樣,SWI的向量地址仍是OSCtxSw()。還有,Motorola680x0/CPU32可能會使16陷阱指令中的一個。當(dāng)然,選一些處理器如ZilogZ80并不提供軟中斷機(jī)制。在這種情況下,用戶需要盡自己的所能某個向量指向OSCtxSw()。μC/OS已經(jīng)被移植到了Z80處理器上,μC/OS-Ⅱ也同樣可以。放到OS_CPU_C.C件中,而不必再擁有一些分散的匯編語言文件。y)使就緒狀態(tài)的任務(wù)開始運(yùn)行OSStart(),如下所示。OSTaskCreate任務(wù)控制塊。前面曾提到過μC/OS-Ⅱ中處于就緒狀態(tài)的任務(wù)的堆棧結(jié)構(gòu)看起來就像剛單一點,堆棧指針總是在任務(wù)控制塊(即它的OS_TCB)的開頭。換句話說,也就是要想恢復(fù)的任務(wù)堆棧指針總是在OS_TCB0偏址內(nèi)存單元中。voidvoidOSStartHighRdy{CalluserdefinableGetthestackpointerofthetasktoresume:Stackpointer=OSTCBHighRdy->OSTCBStkPtr;OSRunning=Restoreallprocessorregistersfromthenewtask'sstack;Executeareturnfrominterruptinstruction;}注意,OSStartHighRdy()必須調(diào)用OSTaskSwHook(),因為用戶正在進(jìn)行任務(wù)切換的部分工作用戶在恢復(fù)最高優(yōu)先級任務(wù)的寄存器。OSTaskSwHook可以通過檢查OSRunning來知道是OSStartHighRdy()在調(diào)用它(OSRunning為FALSE)還是正常的任務(wù)切換在調(diào)用它(OSRunning為TRUE).OSStartHighRdy()還必須在最高優(yōu)先級任務(wù)恢復(fù)之前和調(diào)用OSTaskSwHook()之后設(shè)置OSRunning為TRUE。)中斷服務(wù)例程,陷阱或異常處理例程的向量地址必須指向OSCtxSw(如果當(dāng)前任務(wù)調(diào)用μC/OS-Ⅱ提供的系統(tǒng)服務(wù),并使得更高優(yōu)先級任務(wù)處于就緒狀態(tài),μC/OS-Ⅱ就會借助上面提到的向量地址找到OSCtxSw()。在系統(tǒng)服務(wù)調(diào)用的最后,μC/OS-Ⅱ會調(diào)用OSSched(),并由此來推斷當(dāng)前任務(wù)不再是要運(yùn)行的最重要的任務(wù)了。OSSched()代碼必須寫在匯編語言中,因為用戶不能直接從C中CPU寄存器。注意在OSCtxSw()和void{保存處理器寄存器void{保存處理器寄存器OSTCBCur->OSTCBStkPtrStackpointer;OSTCBCur=OSTCBHighRdy;OSPrioCurOSPrioHighRdy;Stackpointer=OSTCBHighRdy-;;}n)要想了解OSIntCtxSw(),用戶μC/OS-Ⅱ調(diào)用該函數(shù)的過程。用戶可以參看圖 在ISR執(zhí)行過程中的堆棧內(nèi)容接著,CPU會調(diào)用正確的ISR。μC/OS-Ⅱ要求用戶的ISR在開始時要保存剩下的處理器者將變OSIntNesting1。在這個時候,被中斷任務(wù)的堆棧中只包含了被中斷任務(wù)的寄存器內(nèi)容?,F(xiàn)在,ISR可以執(zhí)行中斷服務(wù)了。并且如果ISR發(fā)消息給任務(wù)(通過調(diào)用或OSTimeDlyResume()的話,有可能使更高優(yōu)先級的任務(wù)處于就緒狀態(tài)。假設(shè)有一個更高優(yōu)先級的任務(wù)處于就緒狀態(tài)。μC/OS-Ⅱ要求用戶的ISR在完成中斷服務(wù)的時候調(diào)用OSIntExit()。OSIntExit()會告訴μC/OS-Ⅱ到了返回任務(wù)級代碼的時間了。調(diào)用OSIntExit()會導(dǎo)致調(diào)用者的返回地址被保存到被中斷的任務(wù)的堆棧中[F8.2(3)]。OSInxt()剛開始時會中斷,因為它需要執(zhí)行臨界段的代碼。根OSNIA()的不同執(zhí)行過程(參看30),處理器的狀態(tài)寄存器會被保存到被中斷的任務(wù)的堆棧中[.(4)]。i()注意到由于有更高優(yōu)先級的任務(wù)處于就緒狀THhy會被指向新任務(wù)的O,并且Snit()會調(diào)用OtS()來執(zhí)行任務(wù)切換。調(diào)用OSInttxS8.2在用戶切換任務(wù)的時候,用戶只想將某些項([F8.2(1)]和[F8.2(2)])保留在堆棧(5)被保存到被切換出去的任務(wù)的OS_TCBF8.2(7)]。OSIntCtxSw()是μC/OS-Ⅱ(和μC/OS)中唯一的與編譯器相關(guān)的函數(shù);在我收到程序L8.3OSIntCtxSw()的原voidvoid{OSTCBCur->OSTCBStkPtr堆棧指針OSTCBCur=OSTCBHighRdy;OSPrioCurOSPrioHighRdy;堆棧指針=OSTCBHighRdy-}i)CO-Ⅱ要求用戶提供一個時鐘資源來實現(xiàn)時間的延時和期滿功能。時鐘節(jié)拍應(yīng)該每0-0z的所犯的錯誤是在調(diào)用OSInit()和OSStart()之間允許時鐘節(jié)拍中斷(如程序L8.4所voidvoid{..../*初始化?μC/OS-/*應(yīng)用程序初始化代碼/*調(diào)用OSTaskCreate()建立至少個任務(wù)..允許時鐘節(jié)拍中斷;/*千萬不要在這里允許.. /*開始多任務(wù)調(diào) }程L8.4有可能在μC/OS-Ⅱ開始執(zhí)行第一個任務(wù)前時鐘節(jié)拍中斷就發(fā)生了。在這種情況下μC/OS-Ⅱ的運(yùn)行狀態(tài)不確定,用戶的應(yīng)用程序也可能會時鐘節(jié)拍ISR的原型如程序L8.5所示。這些代碼必須寫在匯編語言中,因為用戶不能直接從C語言中CPU寄存器。如果用戶的處理器可以通過單條指令來增加OSIntNesting,那么用戶就沒必要OSIntEnter()了。增OSIntNesting過函數(shù)程序L8.5時鐘節(jié)拍ISR的原voidvoid{保存處理器寄存器調(diào)用OSIntEnter()或者直接將OSIntNesting加調(diào)用}μC/OSC唯一必要的函數(shù)是OSTaskStkInit(),其它五個函數(shù)必須得但沒必要包含代碼)OSTaskCreate()和OSTaskCreateExt()通過調(diào)用OSTaskStkInt()來初始化任務(wù)的堆棧是從上往下長的。下面的同樣適用于從下往上長的堆棧。在用戶建立任務(wù)的時候,用戶會傳遞任務(wù)的地址,pdata指針,任務(wù)的堆棧棧頂和任務(wù)的優(yōu)先級給OSTaskCreate()和OSTaskCreateExt()。雖然OSTaskCreateExt()還要求有其它的參數(shù),但這些參數(shù)在OSTaskStkInt()的時候是無關(guān)緊要的。為了正確初始化堆棧結(jié)構(gòu),OSTaskStkInt()只要求剛才提到的前三個參數(shù)和一個附加的選項,這個選項只能在圖 堆棧初始化(pdata通過堆棧傳遞始被μC/OS-Ⅱ執(zhí)行時,任務(wù)就會收到一個參數(shù),好像它被其它的任務(wù)調(diào)用一樣。voidvoidMyTask(void{/*對'pdata'做某些操作forfor(;;)/*}}如果從其它的函數(shù)中調(diào)用MyTask(),C編譯器就會先將調(diào)用MyTask()的函數(shù)的返或多個寄存器中。在后面我會這類情況。假定pdata會被編譯器保存到堆棧中,接著,用戶需要將剩下的處理器寄存器保存到堆棧中[F8.3(3)]。保存令依賴于用8個寄存器保存到堆棧中。對Mtorla68H11處理器而言,在中斷響應(yīng)期間,所有的寄現(xiàn)在是時候這個問題了:如果用戶的C編譯器將pdata參數(shù)傳遞到寄存器中而不是內(nèi)容就會隨著這個寄存器的被放置在堆棧中。圖 堆棧初始化(pdata通過寄存器傳遞OSTaskCreateOSTaskCreateExt()會獲得該地址并將它保存到任務(wù)控制塊(OS_TCB)中。單元位置。例如,對In80x86處理器而言,堆棧指針會指向最后存入數(shù)據(jù)的堆棧單元位置,而對Motorola68HC11處理器而言,堆棧指針會指向下一個空閑的位置。OSTaskCreateOSTaskCreateExt當(dāng)μC/OS-Ⅱ設(shè)置完了自己的結(jié)構(gòu)后,會在調(diào)用任務(wù)調(diào)度程序之前調(diào)用OSTaskCreateHook()被調(diào)用的時候,它會收到指向已建立任務(wù)的OS_TCB的指針,這樣它就可以所有的結(jié)構(gòu)成員了。當(dāng)使用OSTaskCreate()建立任務(wù)時,存器,MMU寄存器,任務(wù)計數(shù)器的內(nèi)容,以及調(diào)試信息。只用當(dāng)OS_CFG.H中的OS_CPU_HOOKS_EN1時才會產(chǎn)生OSTaskCreateHook()的代碼。這樣,使用用戶的移植實例的用戶可以在其它的文件中重新定義hook)當(dāng)任務(wù)被刪除的時候就OSTaskDelHook()。該函數(shù)在把任務(wù)從μC/OS-Ⅱ的務(wù)的OS_TCB的指針,這樣它就可以所有的結(jié)構(gòu)成員了。OSTaskDelHook()可以用來檢驗只用當(dāng)OS_CFG.H中的OS_CPU_HOOKS_EN1時才會產(chǎn)生OSTaskDelHook()的代碼a)當(dāng)發(fā)生任務(wù)切換的時候調(diào)用OSTaskSwHook()。不管任務(wù)切換是通過OSCtxSw()還是OSIntCtxSw()來執(zhí)行的都會調(diào)用該函數(shù)。OSTaskSwHook()可以直接OSTCBCur和OSTCBHighRdy,因為它們是全局變量。OSTCBCur指向被切換出去的任務(wù)的OS_TCB,而只用當(dāng)OS_CFG.H中的OS_CPU_HOOKS_EN1時才會產(chǎn)OSTaskSwHookOSTaskStatHook()每秒鐘都會被OSTaskStat()調(diào)用一次。用戶可以O(shè)STaskStatHook()來擴(kuò)展統(tǒng)計功能。例如,用戶可以保持并顯示每個任務(wù)的執(zhí)行時間,每個任務(wù)所CPU份只用當(dāng)OS_CFG.H中的OS_CPU_HOOKS_EN被置為1才會產(chǎn)生OSTaskStatHooki)OSTaskTimeHookOSTaskTick()OSTaskTimeHookμC/OS-Ⅱ真正處理,并通知用戶的移植實例或應(yīng)用程序之前只用當(dāng)OS_CFG.H中的OS_CPU_HOOKS_EN被置為1才會產(chǎn)生OSTaskTimeHookvoidOSTaskCreateHook(OS_TCBCalledCodeenabledOSTas
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 廚房承包合同
- 宿舍承包合同范本
- 2025雜工勞務(wù)分包合同
- 2025關(guān)于住房公積金借款合同書例文
- 房子裝修承包合同
- 提高創(chuàng)新和問題解決能力的培訓(xùn)
- 2025會計工作勞動合同范本
- 2025副食品供貨合同范文
- 工程材料采購合同簡單
- 2025共有產(chǎn)權(quán)住房 預(yù)售合同 (范本)
- 《企業(yè)管理課件:團(tuán)隊管理知識點詳解PPT》
- 配網(wǎng)設(shè)備缺陷分類及管理重點標(biāo)準(zhǔn)
- 反腐倡廉廉潔行醫(yī)
- UI與交互設(shè)計人機(jī)交互設(shè)計(第二版)PPT完整全套教學(xué)課件
- GMS要素-持續(xù)改進(jìn)(CI)-上汽通用五菱-課件
- 《插畫設(shè)計》課程標(biāo)準(zhǔn)
- 高考作文答題卡(作文)
- 在鄉(xiāng)村治理中深化推廣運(yùn)用清單制、積分制、一張圖工作方案
- 梅毒的診斷與治療課件
- 工程倫理第二講工程中的風(fēng)險、安全與責(zé)任課件
評論
0/150
提交評論