嵌入式實(shí)時(shí)操作系統(tǒng)uCOS-II:第10章 移植與應(yīng)用_第1頁
嵌入式實(shí)時(shí)操作系統(tǒng)uCOS-II:第10章 移植與應(yīng)用_第2頁
嵌入式實(shí)時(shí)操作系統(tǒng)uCOS-II:第10章 移植與應(yīng)用_第3頁
嵌入式實(shí)時(shí)操作系統(tǒng)uCOS-II:第10章 移植與應(yīng)用_第4頁
嵌入式實(shí)時(shí)操作系統(tǒng)uCOS-II:第10章 移植與應(yīng)用_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、第10 章 移植與應(yīng)用這一章將介紹C/OS-在不同處理器上移植的一般方法以及基于MCS-51和ARM處理器的移植和應(yīng)用實(shí)例。 10.1 移植的基本方法 10.1.1 移植的概念與一般要求 這里所謂的移植就是使一個(gè)實(shí)時(shí)內(nèi)核能在另一種微處理器或者微控制器上運(yùn)行。為了方便移植,C/OS-在設(shè)計(jì)時(shí)就充分考慮了可移植性,大部分代碼都是用ANSI C語言編寫的,考慮到絕大多數(shù)微處理器在讀寫寄存器時(shí)只能用匯編語言來實(shí)現(xiàn),所以仍然需要用匯編語言來編寫一些與處理器相關(guān)的代碼。 10.1.1.1 移植對微處理器的要求 要使C/OS-能夠正常運(yùn)行,處理器和編譯器必須滿足以下五項(xiàng)原則:處理器的C編譯器能產(chǎn)生可重入代碼

2、;用C語言就可以實(shí)現(xiàn)開關(guān)中斷;處理器至少能支持定時(shí)中斷,中斷頻率一般在10至100Hz之間;處理器能夠支持硬件堆棧,容量可達(dá)幾千字節(jié);處理器有堆棧指針和讀寫CPU其它寄存器、堆棧內(nèi)容或內(nèi)存的指令。10.1.1.2 對移植開發(fā)工具的要求 移植C/OS-,需要一個(gè)針對用戶用的CPU的C編譯器,它必須滿足如下要求:C編譯器必須支持匯編語言程序;C編譯器必須能支持可重入代碼,因?yàn)镃/OS-是一個(gè)可剝奪型內(nèi)核;C編譯器必須包括匯編器、連接器和定位器。連接器用來將經(jīng)編譯和匯編后產(chǎn)生的不同的模塊連接成目標(biāo)文件。定位器用于將代碼和數(shù)據(jù)放置在目標(biāo)處理器的指定內(nèi)存映射空間中。C編譯器必須支持從C中打開和關(guān)閉中斷;

3、C編譯器最好支持用戶在C語言程序中嵌入?yún)R編語言,這有利于用匯編語言來直接開關(guān)中斷。 10.1.1.3 移植的主要工作 C/OS-的移植非常簡單,但前提是:必須理解處理器和C編譯器的技術(shù)細(xì)節(jié)擁有和掌握必要的工具處理器和編譯器滿足C/OS-的上述五項(xiàng)原則。根據(jù)如圖10.1所示的C/OS-軟硬件體系結(jié)構(gòu),移植工作主要是改寫與處理器有關(guān)的內(nèi)核代碼以及與編譯器數(shù)據(jù)類型有關(guān)的文件,詳細(xì)內(nèi)容如表10.1所示。 10.1.1.3 移植的主要工作移植所要進(jìn)行的工作可以簡單地歸納為如下幾條:聲明11個(gè)數(shù)據(jù)類型(OS_CPU.H);用#define聲明4個(gè)宏(OS_CPU.H);用C語言編寫10個(gè)簡單的函數(shù)(OS_

4、CPU_C.C);編寫4個(gè)匯編語言函數(shù)(OS_CPU_A.ASM)。事實(shí)上,移植工作很簡單,根據(jù)處理器的不同,一個(gè)移植實(shí)例可能需要編寫或改寫50至300行的代碼,需要的時(shí)間從幾個(gè)小時(shí)到一星期不等。移植完畢后還要進(jìn)行測試。 10.1.1.4 INCLUDES.H文件說明 INCLUDES.H是一個(gè)主頭文件,它包括了所有的頭文件,這樣做的好處是使得在應(yīng)用中無需考慮每個(gè).C文件到底需要哪些頭文件。唯一的缺點(diǎn)是它可能會包含一些不相關(guān)的頭文件,因此可能增加每個(gè)文件的編譯時(shí)間。但這樣做的最大優(yōu)點(diǎn)是提高了代碼的可移植性。一般地,該文件應(yīng)該包含在所有.C文件的第一行,即:# include includes.

5、h。 10.1.2 OS_CPU.H代碼的移植 OS_CPU.H頭文件中包含了與編譯器有關(guān)的數(shù)據(jù)類型和與處理器有關(guān)的代碼,其代碼如程序清單10.1所示。 10.1.3 OS_CPU_C.C代碼的移植 如表10.1所示,在OS_CPU_C.C文件中有10個(gè)函數(shù)要求用戶進(jìn)行修改,但是其中唯一必要的是OSTaskStkInit()函數(shù),其余9個(gè)都是用于擴(kuò)展的用戶接口函數(shù),C/OS-要求必須聲明,但未必包含任何代碼。 10.1.3.1 OSTaskStkInit()函數(shù) OSTaskStkInit()函數(shù)為OSTaskCreate()和OSTaskCreateExt()函數(shù)所調(diào)用,用于任務(wù)棧的初始化,

6、初始化后的任務(wù)??雌饋硐駝倓偘l(fā)生過一次中斷并將所有的寄存器都保存進(jìn)了堆棧的情形一樣。如圖10.2所示,它主要完成四項(xiàng)任務(wù):(1)仿真帶參數(shù)pdata的函數(shù)調(diào)用;(2)接著保存任務(wù)代碼的首地址指針,當(dāng)調(diào)用OSStart()函數(shù)啟動(dòng)時(shí),為第一次運(yùn)行提供任務(wù)代碼的首地址指針,應(yīng)用任務(wù)的代碼便從這里開始執(zhí)行;(3)初始化任務(wù)棧結(jié)構(gòu),保存CPU寄存器內(nèi)容,盡管這些寄存器內(nèi)容可能在第一次運(yùn)行時(shí)沒有起什么作用,但仍然要設(shè)計(jì)成完整的結(jié)構(gòu),以便于計(jì)算代碼的指針;(4)返回棧頂指針給調(diào)用者,調(diào)用者又將這個(gè)指針傳遞給任務(wù)控制塊,并且放在任務(wù)控制塊數(shù)據(jù)結(jié)構(gòu)的最前面,這樣就可以用匯編語言來方便地進(jìn)行讀寫。 圖10.2

7、初始化任務(wù)棧結(jié)構(gòu) void *OSTaskStkInit (void (*task)(void *pd), void *pdata, void *ptos, INT16U opt) 10.1.3.2 其它函數(shù) 10.1.4 OS_CPU_A.ASM代碼的移植 C/OS-的移植要求用戶編寫如下四個(gè)簡單的匯編語言函數(shù):OSStartHighRdy(),最高優(yōu)先級就緒任務(wù)啟動(dòng)函數(shù);OSCtxSw(),任務(wù)級任務(wù)切換函數(shù);OSIntCtxSw(),中斷級任務(wù)切換函數(shù);OSTickISR(),時(shí)鐘節(jié)拍中斷服務(wù)子程序。如果編譯器支持插入?yún)R編語言代碼,就可以將這部分代碼編寫在OS_CPU_C.C文件中,而沒

8、有必要使用單獨(dú)的匯編語言文件。 10.1.4.1 OSStartHighRdy()函數(shù) OSStartHighRdy()函數(shù)使準(zhǔn)備就緒的最高優(yōu)先級任務(wù)開始第一次運(yùn)行,在OSStart()函數(shù)中被調(diào)用。OSStartHighRdy()總是假設(shè)OSTCBHighRdy指向的是準(zhǔn)備就緒的優(yōu)先級最高的任務(wù)的任務(wù)控制塊。在C/OS-中,處于就緒狀態(tài)的任務(wù)的堆棧中保存的是全部CPU寄存器內(nèi)容,其情形就好像中斷保存寄存器進(jìn)堆棧的情形一樣。堆棧指針儲存在任務(wù)控制塊最前面。當(dāng)需要運(yùn)行準(zhǔn)備就緒的最高優(yōu)先級任務(wù)時(shí),只需要將保存在該任務(wù)堆棧中的所有處理器寄存器按順序彈出來,并且執(zhí)行中斷的返回就可以了。這就是OSSta

9、rtHighRdy()函數(shù)的任務(wù)之一。OSStartHighRdy()函數(shù)的另一個(gè)任務(wù)是在最高優(yōu)先級任務(wù)恢復(fù)運(yùn)行前將OSRunning設(shè)置成“TRUE”,這可以在該函數(shù)內(nèi)實(shí)現(xiàn),也可以在OSTaskSwHook()函數(shù)中實(shí)現(xiàn),因?yàn)楹瘮?shù)OSStartHighRdy()一開始就會調(diào)用OSTaskSwHook()。OSStartHighRdy()函數(shù)示意性代碼如程序清單10.3所示。 10.1.4.2 OSCtxSw()函數(shù) SCtxSw()是一個(gè)任務(wù)級的任務(wù)切換函數(shù),它為OSSched()函數(shù)所調(diào)用,執(zhí)行軟中斷或者CPU陷阱指令,主要功能是保存當(dāng)前任務(wù)的CPU寄存器和將即將運(yùn)行的任務(wù)的CPU寄存器內(nèi)

10、容從相應(yīng)的任務(wù)棧中彈出來。調(diào)用該函數(shù)前,C/OS-早已將指針OSTCBCur指向了當(dāng)前任務(wù)的任務(wù)控制塊,OSSched()函數(shù)還需要將準(zhǔn)備就緒的最高優(yōu)先級任務(wù)的地址裝載到OSTCBHighRdy中,然后通過調(diào)用OS_TASK_SW()來執(zhí)行軟中斷或陷阱指令。調(diào)用該函數(shù)時(shí),中斷服務(wù)、陷阱或異常處理例程的入口向量地址必須指向OSCtxSw()。 10.1.4.2 OSCtxSw()函數(shù)OSCtxSw()示意性代碼如程序清單10.4所示,這部分代碼必須用匯編語言編寫,因?yàn)橛脩舨荒苤苯佑肅語言訪問CPU寄存器。值得注意的是在執(zhí)行OSCtxSw()和用戶擴(kuò)展函數(shù)OSTaskSwHook()的過程中,中斷

11、是禁止的。 10.1.4.3 OSIntCtxSw()函數(shù) OSIntCtxSw()是中斷級任務(wù)切換函數(shù),它為OSIntExit()函數(shù)所調(diào)用,從ISR中執(zhí)行切換功能,它的絕大多數(shù)代碼與OSCtxSw()相同,可以共用許多代碼。在移植時(shí),可以將程序跳轉(zhuǎn)到OSCtxSw()中以減少OSIntCtxSw()代碼量。與OSCtxSw()不同的是ISR已經(jīng)將CPU寄存器推進(jìn)了堆棧,而不再需要OSCtxSw()中保存CPU寄存器的那一段代碼,這是因?yàn)镺SIntCtxSw()是在ISR中被調(diào)用的,所以可以確信所有的CPU寄存器都被正確地保存到了被中斷的任務(wù)的堆棧之中。OSIntCtxSw()示意性代碼如程

12、序清單10.5所示,這部分代碼必須用匯編語言編寫,因?yàn)橛脩舨荒苤苯佑肅語言訪問CPU寄存器。 10.1.4.4 OSTickISR()函數(shù) OSTickISR()是一個(gè)時(shí)鐘節(jié)拍函數(shù),它為了系統(tǒng)提供一個(gè)時(shí)鐘資源來實(shí)現(xiàn)時(shí)間的延時(shí)和期滿功能。一般地,時(shí)鐘節(jié)拍的頻率應(yīng)該在10100Hz之間,即每秒鐘產(chǎn)生10100個(gè)時(shí)鐘中斷。時(shí)鐘節(jié)拍正確的使用方法是在OSStart()運(yùn)行后,在運(yùn)行的第一個(gè)任務(wù)中初始化時(shí)鐘節(jié)拍并允許中斷。通常容易犯的錯(cuò)誤是在調(diào)用OSInit()和OSStart()之間初始化并允許時(shí)鐘節(jié)拍中斷,這樣做的可能后果是如果在第一個(gè)任務(wù)開始運(yùn)行前時(shí)鐘節(jié)拍中斷就發(fā)生了,此時(shí)C/OS-的運(yùn)行狀態(tài)還不

13、確定,所以可能導(dǎo)致應(yīng)用程序崩潰。OSTickISR()示意性代碼如程序清單10.6所示,這部分代碼必須用匯編語言編寫,因?yàn)椴荒苤苯佑肅語言訪問CPU寄存器。為了縮短運(yùn)行時(shí)間,可以直接操作OSIntNesting,使其加1,而不必調(diào)用OSIntEnter()。 10.1.5 移植代碼的測試 在代碼修改移植結(jié)束后,緊接著要進(jìn)行的工作就是測試,測試的目的就是驗(yàn)證所移植的代碼是否能正常地工作,這也可能是移植過程中最復(fù)雜的工作,但必不可少。測試的主要方法是:首先,在沒有應(yīng)用程序的情況下進(jìn)行,讓內(nèi)核自己測試自己,以確保自身運(yùn)行狀況沒有錯(cuò)誤,簡單的測試代碼如程序清單10.7所示。這樣做有兩個(gè)好處:第一,避免使本來就復(fù)雜的事情變得更加復(fù)雜;第二,如果

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論