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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

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

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

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

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

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

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

7、初始化任務棧結構 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-的移植要求用戶編寫如下四個簡單的匯編語言函數(shù):OSStartHighRdy(),最高優(yōu)先級就緒任務啟動函數(shù);OSCtxSw(),任務級任務切換函數(shù);OSIntCtxSw(),中斷級任務切換函數(shù);OSTickISR(),時鐘節(jié)拍中斷服務子程序。如果編譯器支持插入?yún)R編語言代碼,就可以將這部分代碼編寫在OS_CPU_C.C文件中,而沒

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

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

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

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

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

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

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論