[信息與通信]ucos-ii在51單片機上的移植_第1頁
已閱讀1頁,還剩31頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、?引言:隨著各種應用電子系統(tǒng)的復雜化和系統(tǒng)實時性需求的提高,并伴隨應用軟件朝著系統(tǒng)化方向發(fā)展的加速,在16位32位單片機中廣泛使用了嵌入式實時操作系統(tǒng)。然而實際使用中卻存在著大量8位單片機,從經(jīng)濟性考慮,對某些應用場合,在8位MCU上使用操作系統(tǒng)是可行的。從學習操作系統(tǒng)角度,uCOSIIf51即簡單又全面,學習成本低廉,值得推廣。結語:μCOSII具有免費、簡單、可靠性高、實時性好等優(yōu)點,但也有缺乏便利開發(fā)環(huán)境等缺點,尤其不像商用嵌入式

2、系統(tǒng)那樣得到廣泛使用和持續(xù)的研究更新。但開放性又使得開發(fā)人員可以自行裁減和添加所需的功能,在許多應用領域發(fā)揮著獨特的作用。當然,是否在單片機系統(tǒng)中嵌入μCOSII應視所開發(fā)的項目而定,對于一些簡單的、低成本的項目來說,就沒必要使用嵌入式操作系統(tǒng)了。uCOSII原理:uCOSII包括任務調度、時間管理、內存管理、資源管理(信號量、郵箱、消息隊列)四大部分,沒有文件系統(tǒng)、網(wǎng)絡接口、輸入輸出界面。它的移植只與4個文件相關:匯編文件(OS_CP

3、U_A.ASM)、處理器相關C文件(OS_CPU.H、OS_CPU_C.C)和配置文件(OS_CFG.H)。有64個優(yōu)先級,系統(tǒng)占用8個,用戶可創(chuàng)建56個任務,不支持時間片輪轉。它的基本思路就是“近似地每時每刻總是讓優(yōu)先級最高的就緒任務處于運行狀態(tài)”。為了保證這一點,它在調用系統(tǒng)API函數(shù)、中斷結束、定時中斷結束時總是執(zhí)行調度算法。原作者通過事先計算好數(shù)據(jù),簡化了運算量,通過精心設計就緒表結構,使得延時可預知。任務的切換是通過模擬一次中

4、斷實現(xiàn)的。uCOSII工作核心原理是:近似地讓最高優(yōu)先級的就緒任務處于運行狀態(tài)。操作系統(tǒng)將在下面情況中進行任務調度:調用API函數(shù)(用戶主動調用),中斷(系統(tǒng)占用的時間片中斷OsTimeTick(),用戶使用的中斷)。調度算法書上講得很清楚,我主要講一下整體思路。(1)在調用API函數(shù)時,有可能引起阻塞,如果系統(tǒng)API函數(shù)察覺到運行條件不滿足,需要切換就調用OSSched()調度函數(shù),這個過程是系統(tǒng)自動完成的,用戶沒有參與。OSSche

5、d()判斷是否切換,如果需要切換,則此函數(shù)調用OS_TASK_SW()。這個函數(shù)模擬一次中斷(在51里沒有軟中斷,我用子程序調用模擬,效果相同),好象程序被中斷打斷了,其實是OS故意制造的假象,目的是為了任務切換。既然是中斷,那么返回地址(即緊鄰OS_TASK_SW()的下一條匯編指令的PC地址)就被自動壓入堆棧,接著在中斷程序里保存CPU寄存器(PUSHALL)……。堆棧結構不是任意的,而是嚴格按照uCOSII規(guī)范處理。OS每次切換都

6、會保存和恢復全部現(xiàn)場信息(POPALL),然后用RETI回到任務斷點繼續(xù)執(zhí)行。這個斷點就是OSSched()函數(shù)里的緊鄰OS_TASK_SW()的下一條匯編指令的PC地址。切換的整個過程就是,用戶任務程序調用系統(tǒng)API函數(shù),API調用OSSched(),OSSched()調用軟中斷OS_TASK_SW()即OSCtxSw,返回地址(PC值)壓棧,進入OSCtxSw中斷處理子程序內部。反之,切換程序調用RETI返回緊鄰OS_TASK_SW

7、()的下一條匯編指令的我設計的堆棧結構如下圖所示:TCB結構體中OSTCBStkPtr總是指向用戶堆棧最低地址,該地址空間內存放用戶堆棧長度,其上空間存放系統(tǒng)堆棧映像,即:用戶堆棧空間大小=系統(tǒng)堆??臻g大小1。SP總是先加1再存數(shù)據(jù),因此,SP初始時指向系統(tǒng)堆棧起始地址(OSStack)減1處(OSStkStart)。很明顯系統(tǒng)堆棧存儲空間大小=SPOSStkStart。任務切換時,先保存當前任務堆棧內容。方法是:用SPOSStkSta

8、rt得出保存字節(jié)數(shù),將其寫入用戶堆棧最低地址內,以用戶堆棧最低地址為起址,以OSStkStart為系統(tǒng)堆棧起址,由系統(tǒng)棧向用戶??截悢?shù)據(jù),循環(huán)SPOSStkStart次,每次拷貝前先將各自棧指針增1。其次,恢復最高優(yōu)先級任務系統(tǒng)堆棧。方法是:獲得最高優(yōu)先級任務用戶堆棧最低地址,從中取出“長度”,以最高優(yōu)先級任務用戶堆棧最低地址為起址,以OSStkStart為系統(tǒng)堆棧起址,由用戶棧向系統(tǒng)??截悢?shù)據(jù),循環(huán)“長度”數(shù)值指示的次數(shù),每次拷貝前先

9、將各自棧指針增1。用戶堆棧初始化時從下向上依次保存:用戶堆棧長度(15),PCL,PCH,PSW,ACC,B,DPL,DPH,R0,R1,R2,R3,R4,R5,R6,R7。不保存SP,任務切換時根據(jù)用戶堆棧長度計算得出。OSTaskStkInit函數(shù)總是返回用戶棧最低地址。操作系統(tǒng)tick時鐘我使用了51單片機的T0定時器,它的初始化代碼用C寫在了本文件中。最后還有幾點必須注意的事項。本來原則上我們不用修改與處理器無關的代碼,但是由于

10、KEIL編譯器的特殊性,這些代碼仍要多處改動。因為KEIL缺省情況下編譯的代碼不可重入,而多任務系統(tǒng)要求并發(fā)操作導致重入,所以要在每個C函數(shù)及其聲明后標注reentrant關鍵字。另外,“pdata”、“data”在uCOS中用做一些函數(shù)的形參,但它同時又是KEIL的關鍵字,會導致編譯錯誤,我通過把“pdata”改成“ppdata”,“data”改成“ddata”解決了此問題。OSTCBCur、OSTCBHighRdy、OSRunnin

溫馨提示

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

評論

0/150

提交評論