uCOS-II原理PPT演示課件_第1頁
uCOS-II原理PPT演示課件_第2頁
uCOS-II原理PPT演示課件_第3頁
uCOS-II原理PPT演示課件_第4頁
uCOS-II原理PPT演示課件_第5頁
已閱讀5頁,還剩30頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

C/OS-II中的任務(wù)管理,1,任務(wù)的狀態(tài)及其轉(zhuǎn)換,正在運(yùn)行的任務(wù),需要等待一段時(shí)間或需要等待一個(gè)事件發(fā)生再運(yùn)行時(shí),該任務(wù)就會(huì)把CPU的使用權(quán)讓給別的任務(wù)而使任務(wù)進(jìn)入等待狀態(tài)。,任務(wù)在沒有被配備任務(wù)控制塊或被剝奪了任務(wù)控制塊時(shí)的狀態(tài)叫做任務(wù)的睡眠狀態(tài),系統(tǒng)為任務(wù)配備了任務(wù)控制塊且在任務(wù)就緒表中進(jìn)行了就緒登記,這時(shí)任務(wù)的狀態(tài)叫做就緒狀態(tài)。,處于就緒狀態(tài)的任務(wù)如果經(jīng)調(diào)度器判斷獲得了CPU的使用權(quán),則任務(wù)就進(jìn)入運(yùn)行狀態(tài),一個(gè)正在運(yùn)行的任務(wù)一旦響應(yīng)中斷申請(qǐng)就會(huì)中止運(yùn)行而去執(zhí)行中斷服務(wù)程序,這時(shí)任務(wù)的狀態(tài)叫做中斷服務(wù)狀態(tài),2,前面談到,一個(gè)任務(wù)的任務(wù)控制塊的主要作用就是保存該任務(wù)的虛擬處理器的堆棧指針寄存器SP。其實(shí),隨著任務(wù)管理工作的復(fù)雜性的提高,它還應(yīng)該保存一些其他信息。,任務(wù)控制塊任務(wù)在系統(tǒng)中的身份證,由于系統(tǒng)存在著多個(gè)任務(wù),于是系統(tǒng)如何來識(shí)別并管理一個(gè)任務(wù)就是一個(gè)需要解決的問題。識(shí)別一個(gè)任務(wù)的最直接的辦法是為每一個(gè)任務(wù)起一個(gè)名稱。由于C/OS-II中的任務(wù)都有一個(gè)惟一的優(yōu)先級(jí)別,因此C/OS-II是用任務(wù)的優(yōu)先級(jí)來作為任務(wù)的標(biāo)識(shí)的。所以,任務(wù)控制塊還要來保存該任務(wù)的優(yōu)先級(jí)別。,另外,前面也談到,一個(gè)任務(wù)在不同的時(shí)刻還處于不同的狀態(tài),顯然,記錄了任務(wù)狀態(tài)的數(shù)據(jù)也應(yīng)該保存到任務(wù)控制塊中。,基于上述原因,系統(tǒng)必須為每個(gè)任務(wù)創(chuàng)建一個(gè)保存與該任務(wù)有關(guān)的相關(guān)信息的數(shù)據(jù)結(jié)構(gòu),這個(gè)數(shù)據(jù)結(jié)構(gòu)就叫做該任務(wù)的任務(wù)控制塊(TCB)。,任務(wù)控制塊結(jié)構(gòu)的主要成員typedefstructos_tcbOS_STK*OSTCBStkPtr;/指向任務(wù)堆棧棧頂?shù)闹羔業(yè)NT8UOSTCBStat;/任務(wù)的當(dāng)前狀態(tài)標(biāo)志INT8UOSTCBPrio;/任務(wù)的優(yōu)先級(jí)別OS_TCB;,任務(wù)控制塊是不是像我們?nèi)嗽谝粋€(gè)國(guó)家中的身份證?(其實(shí),系統(tǒng)中的所有資源都應(yīng)該有身份證。),3,任務(wù)在內(nèi)存中的結(jié)構(gòu),4,用戶任務(wù)代碼的一般結(jié)構(gòu),voidMyTask(void*pdata)for(;)可以被中斷的用戶代碼;OS_ENTER_CRITICAL();/進(jìn)入臨界段(關(guān)中斷)不可以被中斷的用戶代碼;OS_EXIT_CRITICAL();/退出臨界段(開中斷)可以被中斷的用戶代碼;,臨界段,無限循環(huán),于是可以這樣說,C/OS-II任務(wù)的代碼結(jié)構(gòu)是一個(gè)可以帶有臨界段的無限循環(huán)。,5,系統(tǒng)提供的空閑任務(wù),在多任務(wù)系統(tǒng)運(yùn)行時(shí),系統(tǒng)經(jīng)常會(huì)在某個(gè)時(shí)間內(nèi)無用戶任務(wù)可運(yùn)行而處于所謂的空閑狀態(tài),為了使CPU在沒有用戶任務(wù)可執(zhí)行的時(shí)候有事可做,C/OS-II提供了一個(gè)叫做空閑任務(wù)OSTaskIdle()的系統(tǒng)任務(wù),voidOSTaskIdle(void*pdata)#ifOS_CRITICAL_METHOD=3OS_CPU_SRcpu_sr;#endifpdata=pdata;/防止某些編譯器報(bào)錯(cuò)for(;)OS_ENTER_CRITICAL();/關(guān)閉中斷OSdleCtr+;/計(jì)數(shù)OS_EXIT_CRITICAL();/開放中斷,空閑任務(wù)只是做了一個(gè)計(jì)數(shù)工作,注意!空閑任務(wù)中沒有調(diào)用任務(wù)延時(shí)函數(shù),C/OS-II規(guī)定,一個(gè)用戶應(yīng)用程序必須使用這個(gè)空閑任務(wù),而且這個(gè)任務(wù)是不能用軟件來刪除的,6,系統(tǒng)提供的另一個(gè)任務(wù)統(tǒng)計(jì)任務(wù),C/OS-II提供的另一個(gè)系統(tǒng)任務(wù)是統(tǒng)計(jì)任務(wù)OSTaskStat()。這個(gè)統(tǒng)計(jì)任務(wù)每秒計(jì)算一次CPU在單位時(shí)間內(nèi)被使用的時(shí)間,并把計(jì)算結(jié)果以百分比的形式存放在變量OSCPUsage中,以便應(yīng)用程序通過訪問它來了解CPU的利用率,所以這個(gè)系統(tǒng)任務(wù)OSTaskStat()叫做統(tǒng)計(jì)任務(wù),7,任務(wù)的優(yōu)先權(quán)及優(yōu)先級(jí)別,C/OS_II把任務(wù)的優(yōu)先權(quán)分為64個(gè)優(yōu)先級(jí)別,每一個(gè)級(jí)別都用一個(gè)數(shù)字來表示。數(shù)字0表示任務(wù)的優(yōu)先級(jí)別最高,數(shù)字越大則表示任務(wù)的優(yōu)先級(jí)別越低,用戶可以根據(jù)應(yīng)用程序的需要,在文件OS_CFG.H中通過給表示最低優(yōu)先級(jí)別的常數(shù)OS_LOWEST_PRIO賦值的方法,來說明應(yīng)用程序中任務(wù)優(yōu)先級(jí)別的數(shù)目。該常數(shù)一旦被定義,則意味著系統(tǒng)中可供使用的優(yōu)先級(jí)別為:0,1,2,OS_LOWEST_PRIO,共OS_LOWEST_PRIO+1個(gè),固定地,系統(tǒng)總是把最低優(yōu)先級(jí)別OS_LOWEST_PRIO自動(dòng)賦給空閑任務(wù)。如果應(yīng)用程序中還使用了統(tǒng)計(jì)任務(wù),系統(tǒng)則會(huì)把優(yōu)先級(jí)別OS_LOWEST_PRIO-1自動(dòng)賦給統(tǒng)計(jì)任務(wù),因此用戶任務(wù)可以使用的優(yōu)先級(jí)別是:0,1,2OS_LOWEST_PRIO-2,共OS_LOWEST_PRIO-1個(gè),8,任務(wù)堆棧,保存CPU寄存器中的內(nèi)容及存儲(chǔ)任務(wù)私有數(shù)據(jù)的需要,每個(gè)任務(wù)都應(yīng)該配有自己的堆棧,任務(wù)堆棧是任務(wù)的重要的組成部分,在應(yīng)用程序中定義任務(wù)堆棧的棧區(qū)非常簡(jiǎn)單,即定義一個(gè)OS_STK類型的一個(gè)數(shù)組并在創(chuàng)建一個(gè)任務(wù)時(shí)把這個(gè)數(shù)組的地址賦給該任務(wù)就可以了。例如:/定義堆棧的長(zhǎng)度#defineTASK_STK_SIZE512/定義一個(gè)數(shù)組來作為任務(wù)堆棧OS_STKTaskStkTASK_STK_SIZE;,typedefunsignedintOS_STK;/這是系統(tǒng)定義的一個(gè)數(shù)據(jù)類型,voidmain(void)OSTaskCreate(MyTask,/任務(wù)的指針,在創(chuàng)建用戶任務(wù)時(shí),要傳遞任務(wù)的堆棧指針和任務(wù)優(yōu)先級(jí)別,使用函數(shù)OSTaskCreate()創(chuàng)建任務(wù)時(shí),一定要注意所使用的處理器對(duì)堆棧增長(zhǎng)方向的支持是向上的還是向下的,9,任務(wù)堆棧的初始化,應(yīng)用程序在創(chuàng)建一個(gè)新任務(wù)的時(shí)候,必須把在系統(tǒng)啟動(dòng)這個(gè)任務(wù)時(shí)CPU各寄存器所需要的初始數(shù)據(jù)(任務(wù)指針、任務(wù)堆棧指針、程序狀態(tài)字等等),事先存放在任務(wù)的堆棧中,C/OS-II在創(chuàng)建任務(wù)函數(shù)OSTaskCreate()中通過調(diào)用任務(wù)堆棧初始化函數(shù)OSTaskStkInit()來完成任務(wù)堆棧初始化工作的,它的原型如下:OS_STK*OSTaskStkInit(void(*task)(void*pd),void*pdato,OS_STK*ptos,INT16Uopt);,由于各種處理器的寄存器及對(duì)堆棧的操作方式不盡相同,因此該函數(shù)需要用戶在進(jìn)行C/OS-II的移植時(shí),按所使用的處理器由用戶來編寫。實(shí)現(xiàn)這個(gè)函數(shù)的具體細(xì)節(jié),將在本書有關(guān)C/OS-II移植的章節(jié)中做進(jìn)一步的介紹,其實(shí),任務(wù)堆棧的初始化就是對(duì)該任務(wù)的虛擬處理器的初始化(復(fù)位)。,10,任務(wù)控制塊(OS_TCB)及任務(wù)控制塊鏈表,C/OS-II用來記錄任務(wù)的堆棧指針、任務(wù)的當(dāng)前狀態(tài)、任務(wù)的優(yōu)先級(jí)別等一些與任務(wù)管理有關(guān)的屬性的表就叫做任務(wù)控制塊,任務(wù)控制塊就相當(dāng)于是一個(gè)任務(wù)的身份證,沒有任務(wù)控制塊的任務(wù)是不能被系統(tǒng)承認(rèn)和管理的,任務(wù)控制塊結(jié)構(gòu)的主要成員typedefstructos_tcbOS_STK*OSTCBStkPtr;/指向任務(wù)堆棧棧頂?shù)闹羔榮tructos_tcb*OSTCBNext;/指向后一個(gè)任務(wù)控制塊的指針structos_tcb*OSTCBPrev;/指向前一個(gè)任務(wù)控制塊的指針I(yè)NT16UOSTCBDly;/任務(wù)等待的時(shí)限(節(jié)拍數(shù))INT8UOSTCBStat;/任務(wù)的當(dāng)前狀態(tài)標(biāo)志INT8UOSTCBPrio;/任務(wù)的優(yōu)先級(jí)別OS_TCB;,任務(wù)控制塊鏈表,空任務(wù)控制塊鏈表,當(dāng)應(yīng)用程序調(diào)用函數(shù)OSTaskCreate()創(chuàng)建一個(gè)任務(wù)時(shí),這個(gè)函數(shù)會(huì)調(diào)用系統(tǒng)函數(shù)OSTCBInit()來為任務(wù)控制塊進(jìn)行初始化。這個(gè)函數(shù)首先為被創(chuàng)建任務(wù)從空任務(wù)控制塊鏈表獲取一個(gè)任務(wù)控制塊,然后用任務(wù)的屬性對(duì)任務(wù)控制塊各個(gè)成員進(jìn)行賦值,最后再把這個(gè)任務(wù)控制塊鏈入到任務(wù)控制塊鏈表的頭部,當(dāng)進(jìn)行系統(tǒng)初始化時(shí),初始化函數(shù)會(huì)按用戶提供的任務(wù)數(shù)為系統(tǒng)創(chuàng)建具有相應(yīng)數(shù)量的任務(wù)控制塊并把它們鏈接為一個(gè)鏈表。由于這些任務(wù)控制塊還沒有對(duì)應(yīng)的任務(wù),故這個(gè)鏈表叫做空任務(wù)塊鏈表。即相當(dāng)于是一些空白的身份證。,11,任務(wù)就緒表及任務(wù)調(diào)度,多任務(wù)操作系統(tǒng)的核心工作就是任務(wù)調(diào)度。所謂調(diào)度,就是通過一個(gè)算法在多個(gè)任務(wù)中確定該運(yùn)行的任務(wù),做這項(xiàng)工作的函數(shù)就叫做調(diào)度器。C/OS_II進(jìn)行任務(wù)調(diào)度的思想是“近似地每時(shí)每刻總是讓優(yōu)先級(jí)最高的就緒任務(wù)處于運(yùn)行狀態(tài)”。為了保證這一點(diǎn),它在系統(tǒng)或用戶任務(wù)調(diào)用系統(tǒng)函數(shù)及執(zhí)行中斷服務(wù)程序結(jié)束時(shí)總是調(diào)用調(diào)度器,來確定應(yīng)該運(yùn)行的任務(wù)并運(yùn)行它。,C/OS_II進(jìn)行任務(wù)調(diào)度的依據(jù)就是任務(wù)就緒表,為了能夠使系統(tǒng)清楚地知道,系統(tǒng)中哪些任務(wù)已經(jīng)就緒,哪些還沒有就緒,C/OS_II在RAM中設(shè)立了一個(gè)記錄表,系統(tǒng)中的每個(gè)任務(wù)都在這個(gè)表中占據(jù)一個(gè)位置,并用這個(gè)位置的狀態(tài)(1或者0)來表示任務(wù)是否處于就緒狀態(tài),這個(gè)表就叫做任務(wù)就緒狀態(tài)表,簡(jiǎn)稱叫任務(wù)就緒表,任務(wù)就緒表就是一個(gè)二維數(shù)組OSRdyTbl,12,為加快訪問任務(wù)就緒表的速度,系統(tǒng)定義了一個(gè)變量OSRdyGrp來表明就緒表每行中是否存在就緒任務(wù)。,13,OSRdyTbl,1/01/01/01/01/01/01/01/0,1/01/01/01/01/01/01/01/0,1/01/01/01/01/01/01/01/0,1/01/01/01/01/01/01/01/0,1/01/01/01/01/01/01/01/0,1/01/01/01/01/01/01/01/0,1/01/01/01/01/01/01/01/0,1/01/01/01/01/01/01/01/0,OSRdyGrp,D7D6D5D4D3D2D1D0,1/01/01/01/01/01/01/01/0,任務(wù)就緒表的示意圖,0,1,2,3,4,5,6,7,x,y,0,1,2,3,4,5,6,7,14,OSRdyGrp,D7D6D5D4D3D2D1D0,1,1,1,1,0,0,0,0,prio=29,D7D6D5D4D3D2D1D0,1,D7D6D5D4D3D2D1D0,1,OSRdyTbl3,把prio為29的任務(wù)置為就緒狀態(tài),Y,X,OSRdyGrp|=OSMapTblprio3;,OSRdyTblprio3|=OSMapTblprio,在程序中,可以用類似下面的代碼把優(yōu)先級(jí)別為prio的任務(wù)置為就緒狀態(tài):OSRdyGrp|=OSMapTblprio3;OSRdyTblprio3|=OSMapTblprio,15,OSRdyGrp,D7D6D5D4D3D2D1D0,1,1,1,1,0,0,0,0,prio=29,D7D6D5D4D3D2D1D0,1,D7D6D5D4D3D2D1D0,1,OSRdyTbly,x=OSUnMapTalOSRdyTbly;,1,1,0,0,0,0,0,0,0,0,0,0,0,0,y=OSUnMapTalOSRdyGrp;,圖5-6在就緒表中查找最高優(yōu)先級(jí)別任務(wù)的過程,從任務(wù)就緒表中獲取優(yōu)先級(jí)別最高的就緒任務(wù)可用如下類似的代碼:y=OSUnMapTalOSRdyGrp;/D5、D4、D3位x=OSUnMapTalOSRdyTbly;/D2、D1、D0位prio=(y3)+x;/優(yōu)先級(jí)別或y=OSUnMapTblOSRdyGrp;prio=(INT8U)(yOSTCBStkPtr;/SP指向待運(yùn)行任務(wù)堆棧用出棧指令把R1,R2,彈入CPU的通用寄存器;RETI;/中斷返回,使PC指向待運(yùn)行任務(wù),31,應(yīng)用程序中的臨界段,在應(yīng)用程序中經(jīng)常有一些代碼段必須不受任何干擾地連續(xù)運(yùn)行,這樣的代碼段叫做臨界段。因此,為了使臨界段在運(yùn)行時(shí)不受中斷所打斷,在臨界段代碼前必須用關(guān)中斷指令使CPU屏蔽中斷請(qǐng)求,而在臨界段代碼后必須用開中斷指令解除屏蔽使得CPU可以響應(yīng)中斷請(qǐng)求,由于各廠商生產(chǎn)的CPU和C編譯器的關(guān)中斷和開中斷的方法和指令不盡相同,為增強(qiáng)C/OS-II的可移植性(即在C/OS-II的各個(gè)C函數(shù)中盡可能地不出現(xiàn)匯編語言代碼),C/OS-II用兩個(gè)宏來實(shí)現(xiàn)中斷的開放和關(guān)閉,而把與系統(tǒng)的硬件相關(guān)的關(guān)中斷和開中斷的指令分別封裝在這兩個(gè)宏中:OS_ENTER_CRITICAL()OS_EXIT_CRITICAL(),第一種方法最簡(jiǎn)單,即直接使用處理器的開中斷和關(guān)中斷指令來實(shí)現(xiàn)宏,這時(shí)需要令常數(shù)OS_CRITICAL_METHOD=1。其示意性代碼為:#defineOS_ENTER_CRITICAL()asm(“DI”)關(guān)中斷#defineOS_EXIT_CRITICAL()asm(“EI”)開中斷,第二種方法稍微復(fù)雜一些,但可以使CPU中斷允許標(biāo)志的狀態(tài),在臨界段前和臨界段后不發(fā)生改變。在宏OS_ENTER_CRITICAL()中,把CPU的允許中斷標(biāo)志保持到堆棧中,然后再關(guān)閉中斷,這樣在臨界段結(jié)束時(shí),即在調(diào)用宏OS_EXIT_CRITICAL()時(shí)只要把堆棧中保存的CPU允許中斷狀態(tài)恢復(fù)就可以了。這兩個(gè)宏的示意性代碼如下:#defineOS_ENTER_CRITICAL()asm(“PUSHPSW”)/*通過保存程序狀態(tài)字來保存中斷允許標(biāo)志*/asm(“DI”)/關(guān)中斷#defineOS_EXIT_CRITICAL()asm(“POPPSW”)/恢復(fù)中斷允許標(biāo)志,32,C/OS-II的系統(tǒng)時(shí)鐘,C/OS-II與大多數(shù)計(jì)算機(jī)系統(tǒng)一樣,用硬件定時(shí)器產(chǎn)生一個(gè)周期為ms級(jí)的周期性中斷來實(shí)現(xiàn)系統(tǒng)時(shí)鐘,最小的時(shí)鐘單位就是兩次中斷之間相間隔的時(shí)間,這個(gè)最小時(shí)鐘單位叫做時(shí)鐘節(jié)拍(TimeTick)。硬件定時(shí)器以時(shí)鐘節(jié)拍為周期定時(shí)地產(chǎn)生中斷,該中斷的中斷服務(wù)程序叫做OSTickISR()。中斷服務(wù)程序通過調(diào)用函數(shù)OSTimeTick()來完成系統(tǒng)在每個(gè)時(shí)鐘節(jié)拍時(shí)需要做的工作。,voidOSTickISR(void)保存CPU寄存器;調(diào)用OSIntEnter();/記錄中斷嵌套層數(shù)if(OSIntNesting=1;OSTCBCur-OSTCBStkPtr=SP;/保存堆棧指針調(diào)用OSTimeTick();/節(jié)拍處理清除中斷;開中斷;調(diào)用OSIntExit();/中斷嵌套層數(shù)減一恢復(fù)CPU寄存器;中斷返回;,這是系統(tǒng)時(shí)鐘中斷服務(wù)程序,voidOSTimeTick(void)OSTimeTickHook();OSTime+;/記錄節(jié)拍數(shù)if(OSRunning=TRUE)ptcb=OSTCBList;while(ptcb-OS

溫馨提示

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

評(píng)論

0/150

提交評(píng)論