6 uCOS-II操作系統(tǒng)ppt課件.ppt_第1頁
6 uCOS-II操作系統(tǒng)ppt課件.ppt_第2頁
6 uCOS-II操作系統(tǒng)ppt課件.ppt_第3頁
6 uCOS-II操作系統(tǒng)ppt課件.ppt_第4頁
6 uCOS-II操作系統(tǒng)ppt課件.ppt_第5頁
已閱讀5頁,還剩56頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第6章uC/OS-II操作系統(tǒng),1,內 容,6.1 uCOS-II操作系統(tǒng)簡介 6.2 uCOS-II操作系統(tǒng)內核結構 6.3 uCOS-II操作系統(tǒng)任務管理 6.4 uCOS-II操作系統(tǒng)內存管理 6.5 uCOS-II操作系統(tǒng)時間管理 6.6 uCOS-II操作系統(tǒng)任務間的通訊 6.7 uCOS-II操作系統(tǒng)移植,2,6.1 uC/OS-II簡介,1、uC/OS-II是一個簡單、高效的嵌入式實時操作系統(tǒng)內核 2、支持 x86、ARM、PowerPC、MIPS 等眾多體系結構 3、可從www.ucos-網(wǎng)站上獲得全部源碼及其在各種體系結構平臺上的移植范例。,3,uC/OS-II的特點,1、u

2、C/OS-II內核具有可搶占的實時多任務調度功能 2、提供了許多系統(tǒng)服務,如信號量、消息隊列、郵箱、內存管理、時間函數(shù)等 3、這些功能可以根據(jù)不同的需求進行裁減。,4,C/OS-II的各種商業(yè)應用,全世界有數(shù)百種產品在應用: 醫(yī)療器械 移動電話 路由器 工業(yè)控制 GPS 導航系統(tǒng) 智能儀器 更多,5,目的:為了實現(xiàn)資源共享。 實現(xiàn)方法:進入臨界段時關中斷,退出臨界段時開中斷。這使得C/OS-能夠在臨界段代碼時避免被其它任務或中斷服務所中斷。 C/OS-定義兩個宏(macros)來開關中斷。分別是: 進入臨界段:OS_ENTER_CRITICAL() 退出臨界段:OS_EXIT_CRITICAL

3、()。 這兩個宏的定義取決于所用的微處理器,每種微處理器都有自己的OS_CPU.H文件。,臨界段(Critical Sections),6,任務(task),一個任務通常是一個無限的循環(huán): void mytask(void *pdata) do init while (1) do something; waiting; do something; ,7,任務(task),C/OS-可以管理多達64個任務。 優(yōu)先級為0-63 優(yōu)先級號越低,任務的優(yōu)先級越高。 每個任務的優(yōu)先級不能相同。 保留優(yōu)先級: 高優(yōu)先級:0、1、2、3 低優(yōu)先級:OS_LOWEST_PRIO-3、OS_LOWEST_PRI

4、0-2,OS_LOWEST_PRI0-1以及OS_LOWEST_PRI0 用戶可以有多達56個應用任務。,8,中斷處理,用戶中斷服務子程序框架: 1、保存全部CPU寄存器; 2、調用OSIntEnter或OSIntNesting直接加1; 3、執(zhí)行用戶代碼做中斷服務; 4、調用OSIntExit(); 5、恢復所有CPU寄存器; 6、執(zhí)行中斷返回指令;,9,OSIntEnter(),void OSIntEnter (void) OS_ENTER_CRITICAL(); OSIntNesting+; OS_EXIT_CRITICAL(); ,10,OSIntExit,OS_ENTER_CRITI

5、CAL(); if (-OSIntNesting | OSLockNesting) = 0) OSIntExitY = OSUnMapTblOSRdyGrp; OSPrioHighRdy = (INT8U)(OSIntExitY 3) + OSUnMapTblOSRdyTblOSIntExitY); if (OSPrioHighRdy != OSPrioCur) OSTCBHighRdy=OSTCBPrioTblOSPrioHighRdy; OSCtxSwCtr+; OSIntCtxSw(); OS_EXIT_CRITICAL();,11,中斷與時鐘節(jié)拍,當發(fā)生中斷時,首先應保護現(xiàn)場,將CPU

6、寄存器入棧,再處理中斷函數(shù),然后恢復現(xiàn)場,將CPU寄存器出棧,最后執(zhí)行中斷返回。 uC/OS中提供了OSIntEnter()和OSIntExit()告訴內核進入了中斷狀態(tài)。 時鐘節(jié)拍是一種特殊的中斷,操作系統(tǒng)的心臟。對任務列表進行掃描,判斷是否有延時任務應該處于準備就緒狀態(tài),最后進行上下文切換。,12,時鐘節(jié)拍,C/OS需要用戶提供周期性信號源,用于實現(xiàn)時間延時和確認超時。節(jié)拍率應在說10到100Hz。時鐘節(jié)拍率越高,系統(tǒng)的額外負荷就越重。 時鐘節(jié)拍的實際頻率取決于用戶應用程序的精度。時鐘節(jié)拍源可以是專門的硬件定時器,也可以是來自50/60Hz交流電源的信號。 用戶必須在多任務系統(tǒng)啟動以后再開

7、啟時鐘節(jié)拍器,也就是在調用OSStart()之后。,13,OSTickISR,void OSTickISR(void) 保存處理器寄存器的值; 調用OSIntEnter()或是將OSIntNesting加1; 調用OSTimeTick(); 調用OSIntExit(); 恢復處理器寄存器的值; 執(zhí)行中斷返回指令; ,14,C/OS-初始化,在調用C/OS-的任何其它服務之前,C/OS-要求用戶首先調用系統(tǒng)初始化函數(shù)OSInit()。 OSInit()建立空閑任務idle task,這個任務總是處于就緒態(tài)的??臻e任務OSTaskIdle()的優(yōu)先級總是設成最低,即OS_LOWEST_PRIO。

8、C/OS-還初始化了4個空數(shù)據(jù)結構緩沖區(qū)。,15,C/OS-初始化后的一些數(shù)據(jù)結構內容,16,C/OS-初始化后的緩沖區(qū),17,C/OS-的啟動,多任務的啟動是用戶通過調用OSStart()實現(xiàn)的。然而,啟動C/OS-之前,用戶至少要建立一個應用任務。 OSInit(); /* 初始化uC/OS-II*/ 調用OSTaskCreate()或OSTaskCreateExt(); OSStart(); /*開始多任務調度!永不返回 */,18,OSStart,if (OSRunning = FALSE) y = OSUnMapTblOSRdyGrp; x = OSUnMapTblOSRdyTbly

9、; OSPrioHighRdy = (INT8U)(y 3) + x); OSPrioCur = OSPrioHighRdy; OSTCBHighRdy = OSTCBPrioTblOSPrioHighRdy; OSTCBCur = OSTCBHighRdy; OSStartHighRdy(); ,19,任務狀態(tài),20,任務控制塊(TCB),任務控制塊 OS_TCB是一個數(shù)據(jù)結構,保存該任務的相關參數(shù),包括任務堆棧指針,狀態(tài),優(yōu)先級,任務表位置,任務鏈表指針等。 一旦任務建立了,任務控制塊OS_TCBs將被賦值。 所有的任務控制塊分為兩條鏈表,空閑鏈表和使用鏈表。,21,任務控制塊結構的主要成

10、員,OS_STK *OSTCBStkPtr; /*當前任務棧頂?shù)闹羔?/ struct os_tcb *OSTCBNext; /*任務控制塊的雙重鏈接指針*/ struct os_tcb *OSTCBPrev; /*任務控制塊的雙重鏈接指針*/ OS_EVENT *OSTCBEventPtr; /*事件控制塊的指針*/ void *OSTCBMsg; /*消息的指針*/ INT16U OSTCBDly; /*任務延時*/ INT8U OSTCBStat; /*任務的狀態(tài)字*/ INT8U OSTCBPrio; /*任務優(yōu)先級*/ INT8U OSTCBX; /*用于加速進入就緒態(tài)的過程*/ I

11、NT8U OSTCBY; /*用于加速進入就緒態(tài)的過程*/ INT8U OSTCBBitX; /*用于加速進入就緒態(tài)的過程*/ INT8U OSTCBBitY; /*用于加速進入就緒態(tài)的過程*/,22,任務就緒表(Ready List),每個任務的就緒態(tài)標志都放入就緒表中的,就緒表中有兩個變量OSRdyGrp和OSRdyTbl。 在OSRdyGrp中,任務按優(yōu)先級分組,8個任務為一組。OSRdyGrp中的每一位表示8組任務中每一組中是否有進入就緒態(tài)的任務。任務進入就緒態(tài)時,就緒表OSRdyTbl中的相應元素的相應位也置位。,23,任務就緒表,24,任務創(chuàng)建,想讓C/OS-管理用戶的任務,用戶必

12、須要先建立任務。 用戶可以通過傳遞任務地址和其它參數(shù)到以下兩個函數(shù)之一來建立任務: OSTaskCreate() OSTaskCreateExt()。 任務不能由中斷服務程序(ISR)來建立。,25,任務調度(Task Scheduling),C/OS是搶占式實時多任務內核,優(yōu)先級最高的任務一旦準備就緒,則擁有CPU的所有權開始投入運行。 C/OS中不支持時間片輪轉法,每個任務的優(yōu)先級要求不一樣且是唯一的,所以任務調度的工作就是:查找準備就緒的最高優(yōu)先級的任務并進行上下文切換。 C/OS任務調度所花的時間為常數(shù),與應用程序中建立的任務數(shù)無關。,26,任務調度(Task Scheduling),

13、C/OS-總是運行進入就緒態(tài)任務中優(yōu)先級最高的那一個。確定哪個任務優(yōu)先級最高,下面該哪個任務運行了的工作是由調度器(Scheduler)完成的。 任務級的調度是由函數(shù)OSSched()完成的。中斷級的調度是由另一個函數(shù)OSIntExt()完成的,這個函數(shù)將在以后描述。,27,根據(jù)就緒表確定最高優(yōu)先級,通過OSRdyGrp值確定高3位,假設OSRdyGrp0 x08,對應OSRdyTbl3,高優(yōu)先級為2; 通過OSRdyTbl3的值來確定低3位,假設OSRdyTbl30 x3a,最高優(yōu)先級的任務為25,28,使任務進入就緒態(tài),如果prio是任務是優(yōu)先級,也是任務的識別號,則將任務放入就緒表,即使

14、任務進入就緒態(tài)的方法是: OSRdyGrp |=OSMapTblprio3; OSRdyTblprio3 |=OSMapTblprio ,29,使任務脫離就緒態(tài),將任務就緒表OSRdyTblprio3相應元素的相應位清零,而且當OSRdyTblprio3中的所有位都為零時,即全組任務中沒有一個進入就緒態(tài)時,OSRdyGrp的相應位才為零。 if(OSRdyTblprio3,30,任務調度器,void OSSched (void) INT8U y; OS_ENTER_CRITICAL(); if (OSLockNesting | OSIntNesting) = 0) y = OSUnMapTbl

15、OSRdyGrp; OSPrioHighRdy = (INT8U)(y 3) + OSUnMapTblOSRdyTbly); if (OSPrioHighRdy != OSPrioCur) OSTCBHighRdy = OSTCBPrioTblOSPrioHighRdy; OSCtxSwCtr+; OS_TASK_SW(); OS_EXIT_CRITICAL(); ,31,任務切換,將被掛起的任務寄存器入棧 將較高優(yōu)先級任務的寄存器出棧,32,任務級的任務切換OS_TASK_SW(),通過系統(tǒng)調用指令完成 保護當前任務的現(xiàn)場 恢復新任務的現(xiàn)場 執(zhí)行中斷返回指令 開始執(zhí)行新的任務,33,調用OS

16、_TASK_SW()前的數(shù)據(jù)結構,低優(yōu)先級任務 OS_TCB,OSTCBCur (1),存貯器低地址,存貯器高地址,堆棧方向,SP,R1,R2,R3,R4,PC,PSW,存貯器低地址,存貯器高地址,高優(yōu)先級任務 OS_TCB,OSTCBHighRdy (3),(2),CPU,(4),(5),34,保存當前CPU寄存器的值,低優(yōu)先級任務 OS_TCB,OSTCBCur,存貯器低地址,存貯器高地址,堆棧方向,SP,R1,R2,R3,R4,PC,PSW,存貯器低地址,存貯器高地址,高優(yōu)先級任務 OS_TCB,OSTCBHighRdy (3),(2),CPU,(4),(5),(1),(3),35,重新

17、裝入要運行的任務,低優(yōu)先級任務 OS_TCB,OSTCBCur,存貯器低地址,存貯器高地址,堆棧方向,SP,R1,R2,R3,R4,PC,PSW,存貯器低地址,存貯器高地址,高優(yōu)先級任務 OS_TCB,OSTCBHighRdy OSTCBCur (1),(2),CPU,(4),(4),(1),(3),(3),(4),36,任務切換OS_TASK_SW()的代碼,Void OSCtxSw(void) 將R1,R2,R3及R4推入當前堆棧; OSTCBCurOSTCBStkPtr = SP; OSTCBCur = OSTCBHighRdy; SP = OSTCBHighRdy OSTCBSTKPt

18、r; 將R4,R3,R2及R1從新堆棧中彈出; 執(zhí)行中斷返回指令; ,37,內存管理,在ANSI C中可以用malloc()和free()兩個函數(shù)動態(tài)地分配內存和釋放內存。在嵌入式實時操作系統(tǒng)中,容易產生內存碎片。 C/OS-II中,操作系統(tǒng)把連續(xù)的大塊內存按分區(qū)來管理。每個分區(qū)中包含有整數(shù)個大小相同的內存塊。 在一個系統(tǒng)中可以有多個內存分區(qū)。這樣,用戶的應用程序就可以從不同的內存分區(qū)中得到不同大小的內存塊。但是,特定的內存塊在釋放時必須重新放回它以前所屬于的內存分區(qū)。,38,內存分區(qū)示意圖,39,內存控制塊,為了便于內存的管理,在C/OS-II中使用內存控制塊(memory control

19、blocks)的數(shù)據(jù)結構來跟蹤每一個內存分區(qū),系統(tǒng)中的每個內存分區(qū)都有它自己的內存控制塊。 typedef struct void *OSMemAddr; /*分區(qū)起始地址*/ void *OSMemFreeList;/*下一個空閑內存塊*/ INT32U OSMemBlkSize;/*內存塊的大小*/ INT32U OSMemNBlks;/*內存塊數(shù)量*/ INT32U OSMemNFree;/*空閑內存塊數(shù)量 */ OS_MEM;,40,內存管理初始化,如果要在C/OS-II中使用內存管理,需要在OS_CFG.H文件中將開關量OS_MEM_EN設置為1。這樣C/OS-II 在啟動時就會對內

20、存管理器進行初始化 (OSMemInit() )。,41,建立一個內存分區(qū),OSMemCreate(),在使用一個內存分區(qū)之前,必須使用OSMemCreate()先建立該內存分區(qū)。該函數(shù)共有4個參數(shù):內存分區(qū)的起始地址、分區(qū)內的內存塊總塊數(shù)、每個內存塊的字節(jié)數(shù)和一個指向錯誤信息代碼的指針。 每個內存分區(qū)必須含有至少兩個內存塊,每個內存塊至少為一個指針的大小 。 OS_MEM *CommTxBuf; INT8U CommTxPart10032; CommTxBuf = OSMemCreate(CommTxPart, 100, 32, ,42,分配一個內存塊,OSMemGet(),調用OSMemG

21、et()函數(shù)從已經(jīng)建立的內存分區(qū)中申請一個內存塊。該函數(shù)的唯一參數(shù)是指向特定內存分區(qū)的指針,該指針在建立內存分區(qū)時,由OSMemCreate()函數(shù)返回。 注意的是,用戶可以在中斷服務子程序中調用OSMemGet(),因為在暫時沒有內存塊可用的情況下,OSMemGet()不會等待,而是馬上返回NULL指針。,43,釋放一個內存塊,OSMemPut(),應用程序不再使用一個內存塊時,必須及時地把它釋放并放回到相應的內存分區(qū)中。這個操作由OSMemPut()函數(shù)完成。 必須注意的是,OSMemPut()并不知道一個內存塊是屬于哪個內存分區(qū)的。 釋放內存塊時必須將它釋放到正確的分區(qū)。,44,時間管理

22、,C/OS-(其它內核也一樣)要求用戶提供定時中斷來實現(xiàn)延時與超時控制等功能。這個定時中斷叫做時鐘節(jié)拍,它應該每秒發(fā)生10至100次。時鐘節(jié)拍的頻率越高,系統(tǒng)的負荷就越重。 與時鐘管理相關的系統(tǒng)服務有: OSTimeDLY() OSTimeDLYHMSM() OSTimeDlyResmue() OStimeGet() OSTimeSet(),45,任務間通信手段,C/OS中,采用多種方法保護任務之間的共享數(shù)據(jù)和提供任務之間的通信。 提供OS_ENTER_CRITICAL和OS_EXIT_CRITICAL來對臨界資源進行保護 OSSchedLock( )禁止調度保護任務級的共享資源。 提供了經(jīng)典

23、操作系統(tǒng)任務間通信方法:信號量、郵箱、消息隊列,事件標志。,46,事件控制塊ECB,所有的通信信號都被看成是事件(event), 一個稱為事件控制塊(ECB, Event Control Block)的數(shù)據(jù)結構來表征每一個具體事件,ECB的結構如下: typedef struct void *OSEventPtr; /*指向消息或消息隊列的指針*/ INT8U OSEventTblOS_EVENT_TBL_SIZE; /*等待任務列表*/ INT16U OSEventCnt; /*計數(shù)器(事件是信號量時)*/ INT8U OSEventType; /*事件類型:信號量、郵箱等*/ INT8U

24、OSEventGrp; /*等待任務組*/ OS_EVENT; 與TCB類似的結構,使用兩個鏈表,空閑鏈表與使用鏈表,47,信號量semaphore,信號量在多任務系統(tǒng)中用于:控制共享資源的使用權、標志事件的發(fā)生、使兩個任務的行為同步。 uC/OS中信號量由兩部分組成:信號量的計數(shù)值和等待該信號任務的等待任務表。信號量的計數(shù)值可以為二進制, 也可以是其他整數(shù)。 系統(tǒng)通過OSSemPend( )和OSSemPost( )來支持信號量的兩種原子操作P()和V()。P()操作減少信號量的值,如果新的信號量的值不大于0,則操作阻塞;V()操作增加信號量的值。,48,總結,不存在一個內核任務/實體,內核

25、的管理是通過調用系統(tǒng)函數(shù)來實現(xiàn)的。 每個任務有自己的堆棧空間。內核對任務的占先式調度不會干擾每個任務的總的運行結果。,49,COS-II在ARM9上的移植,所謂移植,是指使一個實時操作系統(tǒng)能夠在某個微處理器平臺上運行。COS-II的主要代碼都是由標準的C語言寫成的,移植方便。,50,移植COS-II滿足的條件,處理器的C編譯器能產生可重入代碼 在程序中可以打開或者關閉中斷 處理器支持中斷,并且能產生定時中斷(通常在101000Hz之間) 處理器支承能夠容納一定量數(shù)據(jù)的硬件堆棧 處理器有將堆棧指針和其他CPU寄存器存儲和讀出到堆棧(或者內存)的指令,51,打開/關閉中斷,在COS-II中,可以通

26、過: OS_ENTER_CRITICAL () OS_EXIT_CRITICAL() 宏來控制系統(tǒng)關閉或者打開中斷。這需要處理器的支持。 在ARM7TDMI的處理器上,可以設置相應的寄存器來關閉或者打開系統(tǒng)的所有中斷。,52,處理器支持中斷并且能產生定時中斷,COS-II是通過處理器產生的定時器的中斷來實現(xiàn)多任務之間的調度的。ARM7TDMI的處理器上可以產生定時器中斷。 本系統(tǒng)工作在60MHz的主頻下,定時器的中斷的頻率為100Hz。也就是系統(tǒng)的響應時間為10ms。,53,處理器支持硬件堆棧,COS-II進行任務調度的時候,會把當前任務的CPU寄存器存放到此任務的堆棧中,然后,再從另一個任務的堆棧中恢復原來的工作寄存器,繼續(xù)運行另一個任務。所以,寄存器的入棧和出棧是COS-II多任務調度的基礎。 ARM7處理器中有專門的指令處理堆棧,可以靈活的使用堆棧。,54,例:C/OS-II在S3C2410上的移植,設置OS_CPU.H中與處理器和編譯器相關的代碼 用C語言編寫六個操作系統(tǒng)相關的函數(shù)(OS_CPU_C.C) 用匯編語言編寫四個與處理器相關的函數(shù)(OS_CPU.ASM),55,設置與處理器和編譯器相關的代碼,

溫馨提示

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

評論

0/150

提交評論