




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第10 章 移植與應用這一章將介紹C/OS-在不同處理器上移植的一般方法以及基于MCS-51和ARM處理器的移植和應用實例。 10.1 移植的基本方法 10.1.1 移植的概念與一般要求 這里所謂的移植就是使一個實時內核能在另一種微處理器或者微控制器上運行。為了方便移植,C/OS-在設計時就充分考慮了可移植性,大部分代碼都是用ANSI C語言編寫的,考慮到絕大多數微處理器在讀寫寄存器時只能用匯編語言來實現(xiàn),所以仍然需要用匯編語言來編寫一些與處理器相關的代碼。 10.1.1.1 移植對微處理器的要求 要使C/OS-能夠正常運行,處理器和編譯器必須滿足以下五項原則:處理器的C編譯器能產生可重入代碼
2、;用C語言就可以實現(xiàn)開關中斷;處理器至少能支持定時中斷,中斷頻率一般在10至100Hz之間;處理器能夠支持硬件堆棧,容量可達幾千字節(jié);處理器有堆棧指針和讀寫CPU其它寄存器、堆棧內容或內存的指令。10.1.1.2 對移植開發(fā)工具的要求 移植C/OS-,需要一個針對用戶用的CPU的C編譯器,它必須滿足如下要求:C編譯器必須支持匯編語言程序;C編譯器必須能支持可重入代碼,因為C/OS-是一個可剝奪型內核;C編譯器必須包括匯編器、連接器和定位器。連接器用來將經編譯和匯編后產生的不同的模塊連接成目標文件。定位器用于將代碼和數據放置在目標處理器的指定內存映射空間中。C編譯器必須支持從C中打開和關閉中斷;
3、C編譯器最好支持用戶在C語言程序中嵌入匯編語言,這有利于用匯編語言來直接開關中斷。 10.1.1.3 移植的主要工作 C/OS-的移植非常簡單,但前提是:必須理解處理器和C編譯器的技術細節(jié)擁有和掌握必要的工具處理器和編譯器滿足C/OS-的上述五項原則。根據如圖10.1所示的C/OS-軟硬件體系結構,移植工作主要是改寫與處理器有關的內核代碼以及與編譯器數據類型有關的文件,詳細內容如表10.1所示。 10.1.1.3 移植的主要工作移植所要進行的工作可以簡單地歸納為如下幾條:聲明11個數據類型(OS_CPU.H);用#define聲明4個宏(OS_CPU.H);用C語言編寫10個簡單的函數(OS_
4、CPU_C.C);編寫4個匯編語言函數(OS_CPU_A.ASM)。事實上,移植工作很簡單,根據處理器的不同,一個移植實例可能需要編寫或改寫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頭文件中包含了與編譯器有關的數據類型和與處理器有關的代碼,其代碼如程序清單10.1所示。 10.1.3 OS_CPU_C.C代碼的移植 如表10.1所示,在OS_CPU_C.C文件中有10個函數要求用戶進行修改,但是其中唯一必要的是OSTaskStkInit()函數,其余9個都是用于擴展的用戶接口函數,C/OS-要求必須聲明,但未必包含任何代碼。 10.1.3.1 OSTaskStkInit()函數 OSTaskStkInit()函數為OSTaskCreate()和OSTaskCreateExt()函數所調用,用于任務棧的初始化,
6、初始化后的任務棧看起來像剛剛發(fā)生過一次中斷并將所有的寄存器都保存進了堆棧的情形一樣。如圖10.2所示,它主要完成四項任務:(1)仿真帶參數pdata的函數調用;(2)接著保存任務代碼的首地址指針,當調用OSStart()函數啟動時,為第一次運行提供任務代碼的首地址指針,應用任務的代碼便從這里開始執(zhí)行;(3)初始化任務棧結構,保存CPU寄存器內容,盡管這些寄存器內容可能在第一次運行時沒有起什么作用,但仍然要設計成完整的結構,以便于計算代碼的指針;(4)返回棧頂指針給調用者,調用者又將這個指針傳遞給任務控制塊,并且放在任務控制塊數據結構的最前面,這樣就可以用匯編語言來方便地進行讀寫。 圖10.2
7、初始化任務棧結構 void *OSTaskStkInit (void (*task)(void *pd), void *pdata, void *ptos, INT16U opt) 10.1.3.2 其它函數 10.1.4 OS_CPU_A.ASM代碼的移植 C/OS-的移植要求用戶編寫如下四個簡單的匯編語言函數:OSStartHighRdy(),最高優(yōu)先級就緒任務啟動函數;OSCtxSw(),任務級任務切換函數;OSIntCtxSw(),中斷級任務切換函數;OSTickISR(),時鐘節(jié)拍中斷服務子程序。如果編譯器支持插入匯編語言代碼,就可以將這部分代碼編寫在OS_CPU_C.C文件中,而沒
8、有必要使用單獨的匯編語言文件。 10.1.4.1 OSStartHighRdy()函數 OSStartHighRdy()函數使準備就緒的最高優(yōu)先級任務開始第一次運行,在OSStart()函數中被調用。OSStartHighRdy()總是假設OSTCBHighRdy指向的是準備就緒的優(yōu)先級最高的任務的任務控制塊。在C/OS-中,處于就緒狀態(tài)的任務的堆棧中保存的是全部CPU寄存器內容,其情形就好像中斷保存寄存器進堆棧的情形一樣。堆棧指針儲存在任務控制塊最前面。當需要運行準備就緒的最高優(yōu)先級任務時,只需要將保存在該任務堆棧中的所有處理器寄存器按順序彈出來,并且執(zhí)行中斷的返回就可以了。這就是OSSta
9、rtHighRdy()函數的任務之一。OSStartHighRdy()函數的另一個任務是在最高優(yōu)先級任務恢復運行前將OSRunning設置成“TRUE”,這可以在該函數內實現(xiàn),也可以在OSTaskSwHook()函數中實現(xiàn),因為函數OSStartHighRdy()一開始就會調用OSTaskSwHook()。OSStartHighRdy()函數示意性代碼如程序清單10.3所示。 10.1.4.2 OSCtxSw()函數 SCtxSw()是一個任務級的任務切換函數,它為OSSched()函數所調用,執(zhí)行軟中斷或者CPU陷阱指令,主要功能是保存當前任務的CPU寄存器和將即將運行的任務的CPU寄存器內
10、容從相應的任務棧中彈出來。調用該函數前,C/OS-早已將指針OSTCBCur指向了當前任務的任務控制塊,OSSched()函數還需要將準備就緒的最高優(yōu)先級任務的地址裝載到OSTCBHighRdy中,然后通過調用OS_TASK_SW()來執(zhí)行軟中斷或陷阱指令。調用該函數時,中斷服務、陷阱或異常處理例程的入口向量地址必須指向OSCtxSw()。 10.1.4.2 OSCtxSw()函數OSCtxSw()示意性代碼如程序清單10.4所示,這部分代碼必須用匯編語言編寫,因為用戶不能直接用C語言訪問CPU寄存器。值得注意的是在執(zhí)行OSCtxSw()和用戶擴展函數OSTaskSwHook()的過程中,中斷
11、是禁止的。 10.1.4.3 OSIntCtxSw()函數 OSIntCtxSw()是中斷級任務切換函數,它為OSIntExit()函數所調用,從ISR中執(zhí)行切換功能,它的絕大多數代碼與OSCtxSw()相同,可以共用許多代碼。在移植時,可以將程序跳轉到OSCtxSw()中以減少OSIntCtxSw()代碼量。與OSCtxSw()不同的是ISR已經將CPU寄存器推進了堆棧,而不再需要OSCtxSw()中保存CPU寄存器的那一段代碼,這是因為OSIntCtxSw()是在ISR中被調用的,所以可以確信所有的CPU寄存器都被正確地保存到了被中斷的任務的堆棧之中。OSIntCtxSw()示意性代碼如程
12、序清單10.5所示,這部分代碼必須用匯編語言編寫,因為用戶不能直接用C語言訪問CPU寄存器。 10.1.4.4 OSTickISR()函數 OSTickISR()是一個時鐘節(jié)拍函數,它為了系統(tǒng)提供一個時鐘資源來實現(xiàn)時間的延時和期滿功能。一般地,時鐘節(jié)拍的頻率應該在10100Hz之間,即每秒鐘產生10100個時鐘中斷。時鐘節(jié)拍正確的使用方法是在OSStart()運行后,在運行的第一個任務中初始化時鐘節(jié)拍并允許中斷。通常容易犯的錯誤是在調用OSInit()和OSStart()之間初始化并允許時鐘節(jié)拍中斷,這樣做的可能后果是如果在第一個任務開始運行前時鐘節(jié)拍中斷就發(fā)生了,此時C/OS-的運行狀態(tài)還不
13、確定,所以可能導致應用程序崩潰。OSTickISR()示意性代碼如程序清單10.6所示,這部分代碼必須用匯編語言編寫,因為不能直接用C語言訪問CPU寄存器。為了縮短運行時間,可以直接操作OSIntNesting,使其加1,而不必調用OSIntEnter()。 10.1.5 移植代碼的測試 在代碼修改移植結束后,緊接著要進行的工作就是測試,測試的目的就是驗證所移植的代碼是否能正常地工作,這也可能是移植過程中最復雜的工作,但必不可少。測試的主要方法是:首先,在沒有應用程序的情況下進行,讓內核自己測試自己,以確保自身運行狀況沒有錯誤,簡單的測試代碼如程序清單10.7所示。這樣做有兩個好處:第一,避免使本來就復雜的事情變得更加復雜;第二,如果
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 倉房搭建合同范例
- 農村永久征地合同范例
- 臨時用工合同范例
- 洗浴吧員崗位職責
- 公廁管理勞務合同范例
- tod開發(fā)模式合同范例
- 保溫棉廠家采購合同范例
- 個人賬號合同范本
- 麗水專業(yè)食堂承包合同范例
- 一年級成長之旅
- LY/T 2499-2015野生動物飼養(yǎng)場總體設計規(guī)范
- 愛德華閥門檢修工藝(2)2
- GB/T 13701-1992單標準氣體質譜法鈾同位素分析
- AMOLED技術寶典(十年OLED技術經驗總結)
- 7S稽核查檢表-倉庫
- 小學科學《噪音的危害與防治》優(yōu)質課件
- 病理學-第3章 局部血液循環(huán)障礙
- 湖北省黃石市基層診所醫(yī)療機構衛(wèi)生院社區(qū)衛(wèi)生服務中心村衛(wèi)生室信息
- 打印版醫(yī)師執(zhí)業(yè)注冊健康體檢表(新版)
- 時代與變革-為人生而藝術
- 人教八年級下冊英語U5Do-you-remember-what-you-were-doing?課件
評論
0/150
提交評論