版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
嵌入式操作系統(tǒng)及應(yīng)用任務(wù)管理與調(diào)第1頁/共150頁主要內(nèi)容任務(wù)任務(wù)管理任務(wù)調(diào)度優(yōu)先級反轉(zhuǎn)第2頁/共150頁HighPriorityTaskLowPriorityTaskTaskTaskTaskTaskTaskTaskEventEventEachTaskInfiniteLoopImportanceSplittinganapplicationintoTasks第3頁/共150頁intmain(void){//InitializeuCOS-II.OSInit();//CreatethefirsttaskOSTaskCreate(TestTask1,(void*)11,&TestTaskStk1[TASK_STK_SIZE],11);//Startmultitasking.OSStart();return0;}voidTestTask1(void*pdata){printf("%4u:*****TestTask1Firstcall*****\n",OSTime);
//Create3othertasksOSTaskCreate(TestTask2,(void*)22,&TestTaskStk2[TASK_STK_SIZE],22);OSTaskCreate(TestTask3,(void*)33,&TestTaskStk3[TASK_STK_SIZE],33);OSTaskCreate(TestTask4,(void*)10,&TestTaskStk3[TASK_STK_SIZE],10);while(1){
printf("%4u:*****TestTask11*****\n",OSTime);
OSTimeDly(1);}}TaskdemobasedonucOS第4頁/共150頁voidTestTask2(void*pdata){
while(1){printf("%4u:*****TestTask22*****\n",OSTime);
OSTimeDly(1);
}}voidTestTask3(void*pdata){
while(1){
printf("%4u:*****TestTask33*****\n",OSTime);OSTimeDly(1);}}voidTestTask4(void*pdata){
while(1){printf("%4u:+++++TestTask10+++++\n",OSTime);OSTaskSuspend(10);//Suspendyourself
}}程序運(yùn)行結(jié)果第5頁/共150頁
采用多任務(wù)的好處:任務(wù)的規(guī)模較小每個(gè)任務(wù)更容易編碼和調(diào)試,其質(zhì)量也更容易得到保證不少應(yīng)用本身就是由多個(gè)任務(wù)構(gòu)成的如一個(gè)應(yīng)用可能需要進(jìn)行以下任務(wù)的處理:計(jì)算、從網(wǎng)絡(luò)獲取數(shù)據(jù)和刷新顯示屏幕采用多任務(wù)的處理方式是應(yīng)用問題的一個(gè)非常自然的解決方式任務(wù)之間具有較高的獨(dú)立性,耦合性小通過增加新的任務(wù)就能方便的擴(kuò)充系統(tǒng)功能實(shí)時(shí)性強(qiáng)保證緊急事件得到優(yōu)先處理成為可能第6頁/共150頁在嵌入式實(shí)時(shí)系統(tǒng)中任務(wù)(task)通常為進(jìn)程(process)和線程(thread)的統(tǒng)稱任務(wù)是調(diào)度的基本單位進(jìn)程最初由Multics的設(shè)計(jì)者在60年代提出來的,主要包括以下內(nèi)容:一個(gè)正在執(zhí)行的程序;計(jì)算機(jī)中正在運(yùn)行的程序的一個(gè)實(shí)例;可以分配給處理器,并由處理器執(zhí)行的一個(gè)實(shí)體;由一個(gè)順序的執(zhí)行線程、一個(gè)當(dāng)前狀態(tài)和一組相關(guān)的系統(tǒng)資源所刻畫的活動單元。第7頁/共150頁進(jìn)程由代碼、數(shù)據(jù)、堆棧和進(jìn)程控制塊構(gòu)成。進(jìn)程控制塊包含了操作系統(tǒng)用來控制進(jìn)程所需要的信息:進(jìn)程狀態(tài)CPU寄存器調(diào)度信息內(nèi)存管理信息I/O狀態(tài)信息等早期的進(jìn)程,包含了以下兩個(gè)方面的內(nèi)容:
資源。進(jìn)程是資源分配的基本單位,一個(gè)進(jìn)程包括一個(gè)保存進(jìn)程映像的虛擬地址空間、主存、I/O設(shè)備和文件等資源。調(diào)度執(zhí)行。進(jìn)程作為操作系統(tǒng)的調(diào)度實(shí)體,是調(diào)度的基本單位。第8頁/共150頁隨著操作系統(tǒng)的發(fā)展,進(jìn)程所包含的兩個(gè)方面的內(nèi)容逐漸被分開:輕量級進(jìn)程或線程:調(diào)度執(zhí)行的單位進(jìn)程:資源分配的單位線程是進(jìn)程內(nèi)部一個(gè)相對獨(dú)立的控制流,由線程上下文和需要執(zhí)行的一段程序指令構(gòu)成在進(jìn)程中,所有線程共享該進(jìn)程的狀態(tài)和資源,可以訪問相同的數(shù)據(jù)使用線程的優(yōu)勢:創(chuàng)建:在一個(gè)已有進(jìn)程中創(chuàng)建一個(gè)新線程比創(chuàng)建一個(gè)全新的進(jìn)程所需的時(shí)間開銷少;終止:終止一個(gè)線程比終止一個(gè)進(jìn)程所花費(fèi)的時(shí)間少;切換:線程切換比進(jìn)程切換所花費(fèi)的時(shí)間少;通信:使同一進(jìn)程內(nèi)部不同線程之間的通信效率得到顯著提高。在大多數(shù)操作系統(tǒng)中,不同進(jìn)程之間的通信需要內(nèi)核的干預(yù),而同一進(jìn)程內(nèi)部不同線程之間則可直接通信。
第9頁/共150頁引入線程的概念后,可把進(jìn)程和線程的使用分為以下幾種模型:單進(jìn)程/單線程模型(如MS-DOS):整個(gè)系統(tǒng)只有一個(gè)進(jìn)程、一個(gè)線程單進(jìn)程/多線程模型:在單進(jìn)程/多線程模型中,整個(gè)系統(tǒng)有一個(gè)進(jìn)程、多個(gè)線程多進(jìn)程/單線程模型(如傳統(tǒng)的UNIX):在多進(jìn)程/單線程模型中,整個(gè)系統(tǒng)有多個(gè)進(jìn)程,每個(gè)進(jìn)程只有一個(gè)線程多進(jìn)程/多線程模型(如WindowsNT、Solaris、Mach等):在多進(jìn)程/多線程模型中,系統(tǒng)有多個(gè)進(jìn)程,每個(gè)進(jìn)程又可包含多個(gè)線程第10頁/共150頁單進(jìn)程/單線程模型單進(jìn)程/多線程模型多進(jìn)程/多線程模型多進(jìn)程/單線程模型第11頁/共150頁大多數(shù)嵌入式實(shí)時(shí)內(nèi)核:單進(jìn)程/多線程模型,或簡單地稱為任務(wù)模型把整個(gè)應(yīng)用當(dāng)作一個(gè)沒有定義的進(jìn)程來對待;應(yīng)用則被劃分為多個(gè)任務(wù)的形式來進(jìn)行處理。也有一些嵌入式實(shí)時(shí)操作系統(tǒng)采用了多進(jìn)程/多線程模型:系統(tǒng)中包含多個(gè)進(jìn)程,每個(gè)進(jìn)程對應(yīng)又包含多個(gè)線程多進(jìn)程/多線程模型適合于處理復(fù)雜的應(yīng)用任務(wù)模型則適用于實(shí)時(shí)性要求較高的、相對簡單的應(yīng)用第12頁/共150頁第一節(jié)
任務(wù)任務(wù)的定義及其主要特性任務(wù)的內(nèi)容任務(wù)的分類任務(wù)參數(shù)第13頁/共150頁任務(wù)的定義及其主要特性任務(wù)是一個(gè)具有獨(dú)立功能的無限循環(huán)的程序段的一次運(yùn)行活動,是實(shí)時(shí)內(nèi)核調(diào)度的單位,具有以下特性:動態(tài)性:任務(wù)狀態(tài)是不斷變化的。一般分為就緒態(tài)、運(yùn)行態(tài)和等待態(tài)。在多任務(wù)系統(tǒng)中,任務(wù)的狀態(tài)將隨著系統(tǒng)的需要不斷進(jìn)行變化。并行性:系統(tǒng)中同時(shí)存在多個(gè)任務(wù),這些任務(wù)在宏觀上是同時(shí)運(yùn)行的。異步獨(dú)立性:每個(gè)任務(wù)各自按相互獨(dú)立的不可預(yù)知的速度運(yùn)行,走走停停。多任務(wù)運(yùn)行情況第14頁/共150頁任務(wù)的內(nèi)容任務(wù)主要包含以下內(nèi)容:代碼:一段可執(zhí)行的程序數(shù)據(jù):程序所需要的相關(guān)數(shù)據(jù)(變量、工作空間、緩沖區(qū)等)堆棧程序執(zhí)行的上下文環(huán)境第15頁/共150頁任務(wù)的內(nèi)容任務(wù)所包含的程序通常為一個(gè)具有無限循環(huán)的程序/*ioTaskimplementsdataobtainingandhandlingcontinuously*/voidioTask(void){ intdata;
initial(); /*Thefollowingsentencesgetdataandhandledatacontinuously*/
while(TRUE) { data=getData(); handleData(data); }}第16頁/共150頁voidYourTask(void*pdata){for(;;){/*USERCODE*/CalloneofuC/OS-II’sservices:OSFlagPend();OSMboxPend();OSMutexPend();OSQPend();OSSemPend();OSTaskDel(OS_PRIO_SELF);OSTaskSuspend(OS_PRIO_SELF);OSTimeDly();OSTimeDlyHMSM();/*USERCODE*/}}voidYourTask(void*pdata){/*USERCODE*/OSTaskDel(OS_PRIO_SELF);}第17頁/共150頁voidTestTask2(void*pdata){
while(1){printf("%4u:*****TestTask22*****\n",OSTime);
OSTimeDly(1);}}voidTestTask3(void*pdata){
while(1){
printf("%4u:*****TestTask33*****\n",OSTime);OSTimeDly(1);}}voidTestTask4(void*pdata){
while(1){printf("%4u:+++++TestTask10+++++\n",OSTime);OSTaskSuspend(10);//Suspendyourself
}}第18頁/共150頁任務(wù)的內(nèi)容任務(wù)與程序的區(qū)別:任務(wù)能真實(shí)地描述工作內(nèi)容的并發(fā)性,而程序不能;程序是任務(wù)的組成部分除程序外,任務(wù)還包括數(shù)據(jù)、堆棧及其上下文環(huán)境等內(nèi)容;程序是靜態(tài)的,任務(wù)是動態(tài)的;任務(wù)有生命周期,有誕生、有消亡,是短暫的;而程序是相對長久的;一個(gè)程序可對應(yīng)多個(gè)任務(wù),反之亦然;任務(wù)具有創(chuàng)建其他任務(wù)的功能,而程序沒有。第19頁/共150頁任務(wù)的內(nèi)容任務(wù)上下文環(huán)境(context)包括了實(shí)時(shí)內(nèi)核管理任務(wù)、以及處理器執(zhí)行任務(wù)所需要的所有信息。任務(wù)優(yōu)先級任務(wù)的狀態(tài)等實(shí)時(shí)內(nèi)核所需要的信息以及處理器的各種寄存器的內(nèi)容(hardwarecontext):程序計(jì)數(shù)器、堆棧指針、通用寄存器等的內(nèi)容任務(wù)的上下文環(huán)境通過任務(wù)控制塊(taskcontrolblock,TCB)來體現(xiàn)。第20頁/共150頁任務(wù)1任務(wù)2任務(wù)3內(nèi)核內(nèi)核代碼內(nèi)核數(shù)據(jù)棧數(shù)據(jù)任務(wù)控制塊代碼棧數(shù)據(jù)任務(wù)控制塊代碼棧數(shù)據(jù)任務(wù)控制塊代碼任務(wù)1任務(wù)2任務(wù)3多任務(wù)系統(tǒng)示意圖第21頁/共150頁任務(wù)的分類按照到達(dá)情況的可預(yù)測性,任務(wù)可以劃分為:周期任務(wù)(periodictask)非周期任務(wù)按照重要程度,可分為:關(guān)鍵任務(wù)(criticaltask)非關(guān)鍵任務(wù)(noncriticaltask)第22頁/共150頁任務(wù)的分類周期任務(wù)與非周期任務(wù)周期任務(wù)每隔一個(gè)固定的時(shí)間間隔就會執(zhí)行一次。飛行器可能需要每隔100ms獲得一次關(guān)于飛行器的速度、高度和姿態(tài)數(shù)據(jù),控制傳感器獲取這些數(shù)據(jù)就需要通過周期任務(wù)來進(jìn)行。非周期任務(wù)執(zhí)行的間隔時(shí)間則為不確定的。移動通信設(shè)備中的通信任務(wù),該任務(wù)只有在需要進(jìn)行通信的情況下才會得到執(zhí)行。非周期任務(wù)分為:sporadictask:有最小到達(dá)間隔時(shí)間限制aperiodictask:沒有到達(dá)時(shí)間限制第23頁/共150頁任務(wù)的分類關(guān)鍵任務(wù)與非關(guān)鍵任務(wù)關(guān)鍵任務(wù):為需要得到及時(shí)執(zhí)行的任務(wù),否則將出現(xiàn)災(zāi)難性的后果飛行器中用于處理生命支持系統(tǒng)和穩(wěn)定性控制系統(tǒng)的任務(wù)非關(guān)鍵任務(wù):如果沒有得到及時(shí)執(zhí)行,則不會產(chǎn)生嚴(yán)重后果第24頁/共150頁任務(wù)參數(shù)任務(wù)參數(shù):優(yōu)先級(priority)周期(period)計(jì)算時(shí)間(computationtime)就緒時(shí)間(readytime)截止時(shí)間(deadline)第25頁/共150頁任務(wù)參數(shù)任務(wù)的優(yōu)先級表示任務(wù)對應(yīng)工作內(nèi)容在處理上的優(yōu)先程度優(yōu)先級越高,表明任務(wù)越需要得到優(yōu)先處理飛行器中處理穩(wěn)定性控制的任務(wù),就需要具有較高的優(yōu)先級,一旦執(zhí)行條件得到滿足,應(yīng)及時(shí)得到執(zhí)行任務(wù)的優(yōu)先級分為靜態(tài)優(yōu)先級和動態(tài)優(yōu)先級。靜態(tài)優(yōu)先級:任務(wù)的優(yōu)先級被確定后,在系統(tǒng)運(yùn)行過程中將不再發(fā)生變化;動態(tài)優(yōu)先級:系統(tǒng)運(yùn)行過程中,任務(wù)的優(yōu)先級是可以動態(tài)變化的。
第26頁/共150頁任務(wù)參數(shù)周期周期任務(wù)所具有的參數(shù),表示任務(wù)周期性執(zhí)行的間隔時(shí)間任務(wù)的計(jì)算時(shí)間任務(wù)在特定硬件環(huán)境下被完整執(zhí)行所需要的時(shí)間,也被稱為是任務(wù)的執(zhí)行時(shí)間(executiontime)。由于任務(wù)每次執(zhí)行的軟件環(huán)境的差異性,導(dǎo)致任務(wù)在各次具體執(zhí)行過程中的計(jì)算時(shí)間各有不同。通常用最壞情況下的執(zhí)行時(shí)間(worstcasetime)或是需要的最長執(zhí)行時(shí)間來表示,也可用統(tǒng)計(jì)時(shí)間(statisticaltime)來表示。第27頁/共150頁任務(wù)參數(shù)任務(wù)的就緒時(shí)間任務(wù)具備了在處理器上被執(zhí)行所需要條件時(shí)的時(shí)間
任務(wù)的截止時(shí)間意味著任務(wù)需要在該時(shí)間到來之前被執(zhí)行完成。截止時(shí)間可以通過絕對截止時(shí)間(absolutedeadline)和相對截止時(shí)間(relativetime)兩種方式來表示相對截止時(shí)間為任務(wù)的絕對截止時(shí)間減去任務(wù)的就緒時(shí)間。截止時(shí)間可以分為強(qiáng)截止時(shí)間(harddeadline)和弱截止時(shí)間(softdeadline)兩種情況:具有強(qiáng)截止時(shí)間的任務(wù)即為關(guān)鍵任務(wù),如果截止時(shí)間不能得到滿足,就會出現(xiàn)嚴(yán)重的后果。擁有關(guān)鍵任務(wù)的實(shí)時(shí)系統(tǒng)又被稱為強(qiáng)實(shí)時(shí)(hardreal-time)系統(tǒng),否則稱為弱實(shí)時(shí)(softreal-time)系統(tǒng)。
第28頁/共150頁第二節(jié)
任務(wù)管理任務(wù)狀態(tài)與變遷空閑任務(wù)任務(wù)控制塊任務(wù)切換任務(wù)隊(duì)列優(yōu)先級位圖算法任務(wù)管理機(jī)制第29頁/共150頁任務(wù)狀態(tài)與變遷任務(wù)擁有的資源情況是不斷變化的,導(dǎo)致任務(wù)狀態(tài)也表現(xiàn)出不斷變化的特性。不同的實(shí)時(shí)內(nèi)核實(shí)現(xiàn)方式對任務(wù)狀態(tài)的定義不盡相同,但是都可以概括為三種基本的狀態(tài):等待(waiting):任務(wù)在等待某個(gè)事件的發(fā)生;就緒(ready):任務(wù)等待獲得處理器資源;執(zhí)行(running):任務(wù)獲得處理器資源,所包含的代碼內(nèi)容正在被執(zhí)行。第30頁/共150頁任務(wù)狀態(tài)與變遷在單處理器系統(tǒng)中:任何時(shí)候都只有一個(gè)任務(wù)在CPU中執(zhí)行如果沒有任何事情可做,就運(yùn)行空閑任務(wù)執(zhí)行空操作任何一個(gè)可以執(zhí)行的任務(wù)都必須處于就緒狀態(tài)調(diào)度程序從任務(wù)的就緒隊(duì)列中選擇下一個(gè)需要執(zhí)行的任務(wù)。處于就緒狀態(tài)的任務(wù)擁有除CPU以外的其他所有需要的資源。任務(wù)還可能處于等待狀態(tài)如任務(wù)在需要等待I/O設(shè)備或其他任務(wù)提供的數(shù)據(jù),而數(shù)據(jù)又還沒有到達(dá)該任務(wù)的情況下,就處于等待狀態(tài)第31頁/共150頁任務(wù)狀態(tài)與變遷任務(wù)會在不同的狀態(tài)之間進(jìn)行轉(zhuǎn)換,即任務(wù)狀態(tài)的變遷對于處于就緒狀態(tài)的任務(wù),獲得CPU后,就處于執(zhí)行狀態(tài)。處于執(zhí)行狀態(tài)的任務(wù)如果被高優(yōu)先級任務(wù)所搶占,任務(wù)又會回到就緒狀態(tài)。處于執(zhí)行狀態(tài)的任務(wù)如果需要等待資源,任務(wù)會被切換到等待狀態(tài)。對處于等待狀態(tài)的任務(wù),如果需要的資源得到滿足,就會轉(zhuǎn)換為就緒狀態(tài),等待被調(diào)度執(zhí)行。第32頁/共150頁就緒態(tài)運(yùn)行態(tài)等待態(tài)獲得CPU被高優(yōu)先級任務(wù)搶占或超時(shí)獲得資源需要資源任務(wù)狀態(tài)變遷第33頁/共150頁任務(wù)1任務(wù)2任務(wù)3調(diào)度程序05101520253035404550運(yùn)行等待就緒三個(gè)任務(wù)進(jìn)行狀態(tài)轉(zhuǎn)換的過程
包含三個(gè)任務(wù)和一個(gè)調(diào)度程序。調(diào)度程序用來確定下一個(gè)需要投入運(yùn)行的任務(wù),因此調(diào)度程序本身也需要占用一定的處理時(shí)間。
第34頁/共150頁TaskstatesandtransitionofuCOS第35頁/共150頁空閑任務(wù)Whichisexecutedwhennoneoftheothertasksisreadytorun.Theidletaskisalwayssettothelowestpriority.Theidletaskcanneverbedeletedbyapplicationsoftware.IdleTaskiscreatedbyOS第36頁/共150頁voidOS_TaskIdle(void*pdata){
/*Preventcompilerwarningfornotusing'pdata‘
*/pdata=pdata;for(;;)
{OS_ENTER_CRITICAL();OSIdleCtr++;OS_EXIT_CRITICAL();
/*CalluserdefinableHOOK*/OSTaskIdleHook();
}}IdleTaskofuCOSOSIdleCtrisusedbythestatisticstasktodeterminehowmuchCPUtime(inpercentage)isactuallybeingconsumedbytheapplicationsoftware.
第37頁/共150頁任務(wù)控制塊任務(wù)管理是通過對任務(wù)控制塊(taskcontrolblock,TCB)的操作來實(shí)現(xiàn)的。任務(wù)控制塊是包含任務(wù)相關(guān)信息的數(shù)據(jù)結(jié)構(gòu)包含了任務(wù)執(zhí)行過程中所需要的所有信息。任務(wù)控制塊大都包括以下信息:任務(wù)的名字任務(wù)執(zhí)行的起始地址任務(wù)的優(yōu)先級任務(wù)的狀態(tài)任務(wù)的硬件上下文(堆棧指針、PC和寄存器等)任務(wù)的隊(duì)列指針等內(nèi)容第38頁/共150頁tasknametaskIDtaskstatustaskprioritytaskcontext(registersandflagsofCPU)…任務(wù)控制塊示意圖第39頁/共150頁任務(wù)控制塊為節(jié)約內(nèi)存,任務(wù)數(shù)量通常需要進(jìn)行預(yù)先配置按照配置的任務(wù)數(shù)量初始化任務(wù)控制塊,一個(gè)任務(wù)對應(yīng)一個(gè)初始的任務(wù)控制塊,形成一個(gè)空閑任務(wù)控制塊鏈。在任務(wù)創(chuàng)建時(shí),實(shí)時(shí)內(nèi)核從空閑任務(wù)控制塊鏈中為任務(wù)分配一個(gè)任務(wù)控制塊。隨后對任務(wù)的操作,都是基于對應(yīng)的任務(wù)控制塊來進(jìn)行的。當(dāng)任務(wù)被刪除后,對應(yīng)的任務(wù)控制塊又會被實(shí)時(shí)內(nèi)核回收到空閑任務(wù)控制塊鏈。第40頁/共150頁typedefstructos_tcb{
OS_STK*OSTCBStkPtr;/*Pointertocurrenttopofstack*/#ifOS_TASK_CREATE_EXT_EN>0void
*OSTCBExtPtr;
/*PointertouserdefinabledataforTCBextension*/OS_STK*OSTCBStkBottom;/*Pointertobottomofstack*/INT32UOSTCBStkSize;/*Sizeoftaskstack(innumberofstackelements)*/INT16UOSTCBOpt;/*TaskoptionsaspassedbyOSTaskCreateExt()*/INT16UOSTCBId;/*TaskID(0..65535)*/#endifstructos_tcb*OSTCBNext;/*PointertonextTCBintheTCBlist
*/structos_tcb*OSTCBPrev;/*PointertopreviousTCBintheTCBlist*/TCBofucOS第41頁/共150頁#if((OS_Q_EN>0)&&(OS_MAX_QS>0))||(OS_MBOX_EN>0)||(OS_SEM_EN>0)||(OS_MUTEX_EN>0)OS_EVENT*OSTCBEventPtr;/*Pointertoeventcontrolblock
*/#endif#if((OS_Q_EN>0)&&(OS_MAX_QS>0))||(OS_MBOX_EN>0)void*OSTCBMsg;/*MessagereceivedfromOSMboxPost()orOSQPost()*/#endifTCBofucOS第42頁/共150頁#if(OS_VERSION>=251)&&(OS_FLAG_EN>0)&&(OS_MAX_FLAGS>0)#ifOS_TASK_DEL_EN>0OS_FLAG_NODE*OSTCBFlagNode;/*Pointertoeventflagnode*/#endifOS_FLAGSOSTCBFlagsRdy;/*Eventflagsthatmadetaskreadytorun*/#endif
INT16UOSTCBDly;/*Nbrtickstodelaytaskor,timeoutwaitingforevent*/INT8UOSTCBStat;/*Taskstatus*/INT8UOSTCBPrio;/*Taskpriority(0==highest,63==lowest)
*/第43頁/共150頁INT8UOSTCBX;/*Bitpositioningroupcorrespondingtotaskpriority
(0..7)*/INT8UOSTCBY;/*Indexintoreadytablecorrespondingtotaskpriority
*/INT8UOSTCBBitX;/*Bitmasktoaccessbitpositioninreadytable
*/INT8UOSTCBBitY;/*Bitmasktoaccessbitpositioninreadygroup
*/#ifOS_TASK_DEL_EN>0BOOLEANOSTCBDelReq;/*Indicateswhetherataskneedstodeleteitself
*/#endif}OS_TCB;第44頁/共150頁任務(wù)切換任務(wù)切換(contextswitching)保存當(dāng)前任務(wù)的上下文,并恢復(fù)需要執(zhí)行的任務(wù)的上下文的過程。當(dāng)發(fā)生任務(wù)切換時(shí):當(dāng)前正在運(yùn)行的任務(wù)的上下文就需要通過該任務(wù)的任務(wù)控制塊保存起來;把需要投入運(yùn)行的任務(wù)的上下文從對應(yīng)的任務(wù)控制塊中恢復(fù)出來。第45頁/共150頁任務(wù)1任務(wù)2任務(wù)3調(diào)度程序05101520253035404550運(yùn)行等待就緒在時(shí)刻8即發(fā)生了任務(wù)切換,任務(wù)1的上下文需要保存到任務(wù)1的任務(wù)控制塊中去。經(jīng)過調(diào)度程序的處理,在時(shí)刻10任務(wù)2投入運(yùn)行,需要把任務(wù)2的任務(wù)控制塊中關(guān)于上下文的內(nèi)容恢復(fù)到CPU的寄存器。
第46頁/共150頁任務(wù)1任務(wù)2實(shí)時(shí)內(nèi)核調(diào)度程序保存任務(wù)1的上下文到TCB1從TCB2恢復(fù)任務(wù)2的上下文……保存任務(wù)2的上下文到TCB2從TCB1恢復(fù)任務(wù)1的上下文……時(shí)間任務(wù)1執(zhí)行一段時(shí)間后,由于某種原因,需要進(jìn)行任務(wù)切換,進(jìn)入實(shí)時(shí)內(nèi)核的調(diào)度程序。調(diào)度程序首先把當(dāng)前的上下文內(nèi)容保存到任務(wù)1的任務(wù)控制塊TCB1中,然后又把任務(wù)2的上下文從TCB2中恢復(fù)到CPU寄存器,隨后任務(wù)2得到執(zhí)行。任務(wù)2執(zhí)行一段時(shí)間后,由于某種原因,需要進(jìn)行任務(wù)切換,進(jìn)入實(shí)時(shí)內(nèi)核的調(diào)度程序。調(diào)度程序首先把當(dāng)前的上下文內(nèi)容保存到任務(wù)2的任務(wù)控制塊TCB2中,然后又把任務(wù)1的上下文從TCB1中恢復(fù)到CPU寄存器,隨后任務(wù)1得到執(zhí)行。
第47頁/共150頁任務(wù)切換任務(wù)切換將導(dǎo)致任務(wù)狀態(tài)發(fā)生變化:當(dāng)前正在運(yùn)行的任務(wù)將由運(yùn)行狀態(tài)變?yōu)榫途w或是等待狀態(tài);需要投入運(yùn)行的任務(wù)則由就緒狀態(tài)變?yōu)檫\(yùn)行狀態(tài)。第48頁/共150頁任務(wù)切換任務(wù)切換具有如下基本步驟:保存任務(wù)上下文環(huán)境;更新當(dāng)前處于運(yùn)行狀態(tài)的任務(wù)的任務(wù)控制塊的內(nèi)容,如把任務(wù)的狀態(tài)由運(yùn)行狀態(tài)改變?yōu)榫途w或是等待狀態(tài);把任務(wù)的任務(wù)控制塊移到相應(yīng)的隊(duì)列(就緒隊(duì)列或是等待隊(duì)列);選擇另一個(gè)任務(wù)進(jìn)行執(zhí)行:調(diào)度;改變需要投入運(yùn)行的任務(wù)的任務(wù)控制塊的內(nèi)容,把任務(wù)的狀態(tài)變?yōu)檫\(yùn)行狀態(tài);根據(jù)任務(wù)控制塊,恢復(fù)需要投入運(yùn)行的任務(wù)的上下文環(huán)境。第49頁/共150頁任務(wù)切換任務(wù)切換的時(shí)機(jī):中斷、自陷如當(dāng)I/O中斷發(fā)生的時(shí)候如果I/O活動是一個(gè)或多個(gè)任務(wù)正在等待的事件,內(nèi)核將把相應(yīng)的處于等待狀態(tài)的任務(wù)轉(zhuǎn)換為就緒狀態(tài)同時(shí),內(nèi)核還將確定是否繼續(xù)執(zhí)行當(dāng)前處于運(yùn)行狀態(tài)的任務(wù),或是用高優(yōu)先級的就緒任務(wù)搶占該任務(wù)自陷由于執(zhí)行任務(wù)中當(dāng)前指令所引起,將導(dǎo)致實(shí)時(shí)內(nèi)核處理相應(yīng)的錯(cuò)誤或異常事件,并根據(jù)事件類型,確定是否進(jìn)行任務(wù)的切換第50頁/共150頁任務(wù)切換運(yùn)行任務(wù)因缺乏資源而被阻塞如,任務(wù)執(zhí)行過程中進(jìn)行I/O操作時(shí)(如打開文件),如果此前該文件已被其他任務(wù)打開,將導(dǎo)致當(dāng)前任務(wù)處于等待狀態(tài),而不能繼續(xù)執(zhí)行時(shí)間片輪轉(zhuǎn)調(diào)度時(shí)內(nèi)核將在時(shí)鐘中斷處理程序中確定當(dāng)前正在運(yùn)行的任務(wù)的執(zhí)行時(shí)間是否已經(jīng)超過了設(shè)定的時(shí)間片;如果超過了時(shí)間片,實(shí)時(shí)內(nèi)核將停止當(dāng)前任務(wù)的運(yùn)行,把當(dāng)前任務(wù)的狀態(tài)變?yōu)榫途w狀態(tài),并把另一個(gè)任務(wù)投入運(yùn)行第51頁/共150頁任務(wù)切換高優(yōu)先級任務(wù)處于就緒時(shí)如果采用基于優(yōu)先級的搶占式調(diào)度算法,將導(dǎo)致當(dāng)前任務(wù)停止運(yùn)行,使更高優(yōu)先級的任務(wù)處于運(yùn)行狀態(tài)第52頁/共150頁voidOS_Sched(void){INT8Uy;OS_ENTER_CRITICAL();if((OSIntNesting==0)&&(OSLockNesting==0))
{/*Sched.onlyifallISRsdone¬locked*/
y=OSUnMapTbl[OSRdyGrp];/*GetpointertoHPTready*/OSPrioHighRdy=(INT8U)((y<<3)+OSUnMapTbl[OSRdyTbl[y]]);if(OSPrioHighRdy!=OSPrioCur)
{/*NoCtxSwifcurrenttaskishighestrdy
*/OSTCBHighRdy=OSTCBPrioTbl[OSPrioHighRdy];OSCtxSwCtr++;/*Incrementcontextswitchcounter*/OS_TASK_SW();/*Performacontextswitch*/}}OS_EXIT_CRITICAL();}TaskschedulingofucOS第53頁/共150頁voidOSCtxSw(void){PUSHR1,R2,R3andR4ontothecurrentstack;OSTCBCur->OSTCBStkPtr=SP;OSTCBCur=OSTCBHighRdy;SP=OSTCBHighRdy->OSTCBStkPtr;POPR4,R3,R2andR1fromthenewstack;Executeareturnfrominterruptinstruction;}OS_TASK_SW()第54頁/共150頁Context-switchinucOSDatastructuresbeforecontext-switch第55頁/共150頁Datastructuresaftersavingthecontext-switchofcurrenttask第56頁/共150頁Datastructuresafterrestoringthecontext-switchofhighprioritytask第57頁/共150頁Context-switchinucOSBasedon80X86CPUrealmode第58頁/共150頁_OSCtxSwPROCFARPUSHA;Savecurrenttask'scontextPUSHES;PUSHDS;;MOVAX,SEG_OSTCBCur;ReloadDSincaseitwasalteredMOVDS,AX;;LESBX,DWORDPTRDS:_OSTCBCur;OSTCBCur->OSTCBStkPtr=SS:SPMOVES:[BX+2],SS;MOVES:[BX+0],SP;;CALLFARPTR_OSTaskSwHook;MOVAX,WORDPTRDS:_OSTCBHighRdy+2;OSTCBCur=OSTCBHighRdyMOVDX,WORDPTRDS:_OSTCBHighRdy;MOVWORDPTRDS:_OSTCBCur+2,AX;MOVWORDPTRDS:_OSTCBCur,DX;;MOVAL,BYTEPTRDS:_OSPrioHighRdy;OSPrioCur=OSPrioHighRdyMOVBYTEPTRDS:_OSPrioCur,AL;LESBX,DWORDPTRDS:_OSTCBHighRdy;SS:SP=OSTCBHighRdy->OSTCBStkPtrMOVSS,ES:[BX+2];MOVSP,ES:[BX];;POPDS;Loadnewtask'scontextPOPES;POPA;;IRET;Returntonewtask;_OSCtxSwENDPContext-switchunder80x86第59頁/共150頁任務(wù)上下文切換時(shí)間任務(wù)上下文切換時(shí)間:保存:保存當(dāng)前運(yùn)行任務(wù)上下文的時(shí)間;調(diào)度:選擇下一個(gè)任務(wù)的調(diào)度時(shí)間;恢復(fù):將要運(yùn)行任務(wù)的上下文的恢復(fù)時(shí)間。保存和恢復(fù)上下文的時(shí)間:取決于任務(wù)上下文的定義和處理器的速度。不同種類的處理器,任務(wù)上下文的定義不同,其內(nèi)容有多有少。任務(wù)上下文切換的時(shí)間與調(diào)度(即選擇下一個(gè)運(yùn)行任務(wù))的過程有關(guān)。強(qiáng)實(shí)時(shí)內(nèi)核要求調(diào)度過程所花費(fèi)的時(shí)間是確定的,即不能隨系統(tǒng)中就緒任務(wù)的數(shù)目而變化。與具體實(shí)現(xiàn)調(diào)度算法時(shí)所采用的數(shù)據(jù)結(jié)構(gòu)有關(guān)。第60頁/共150頁任務(wù)隊(duì)列任務(wù)隊(duì)列通過任務(wù)控制塊實(shí)現(xiàn)對系統(tǒng)中所有任務(wù)的管理。新任務(wù)CPU就緒隊(duì)列等待隊(duì)列超時(shí)調(diào)度等待資源獲得資源釋放CPU單就緒隊(duì)列和單等待隊(duì)列第61頁/共150頁任務(wù)隊(duì)列隊(duì)列由任務(wù)控制塊構(gòu)成tasknametaskIDtaskstatustaskprioritytaskcontext…tasknametaskIDtaskstatustaskprioritytaskcontext…tasknametaskIDtaskstatustaskprioritytaskcontext…Head隊(duì)列TCB1TCB2TCBnNULL任務(wù)隊(duì)列第62頁/共150頁任務(wù)隊(duì)列單等待隊(duì)列資源對應(yīng)的事件發(fā)生時(shí),實(shí)時(shí)內(nèi)核需要掃描整個(gè)等待隊(duì)列,搜索等待該資源的任務(wù),并按照一定的策略選取任務(wù),把任務(wù)的任務(wù)控制塊放置到就緒隊(duì)列。如果系統(tǒng)的資源和任務(wù)比較多,搜索等待該資源的任務(wù)所需要的時(shí)間就比較長,會影響整個(gè)系統(tǒng)的實(shí)時(shí)性??刹捎靡环N多等待隊(duì)列的處理方式資源對應(yīng)的事件發(fā)生時(shí),能夠在較短的時(shí)間內(nèi)確立等待該資源的任務(wù)等待隊(duì)列。第63頁/共150頁新任務(wù)CPU就緒隊(duì)列資源1等待隊(duì)列超時(shí)調(diào)度等待資源1獲得資源1釋放CPU資源2等待隊(duì)列等待資源2獲得資源2資源n等待隊(duì)列等待資源n獲得資源n……單就緒隊(duì)列和多等待隊(duì)列第64頁/共150頁任務(wù)隊(duì)列對于就緒任務(wù),如果采用上述隊(duì)列方式進(jìn)行管理,在基于優(yōu)先級的調(diào)度處理中,要獲得當(dāng)前具有最高優(yōu)先級的就緒任務(wù):方式一:任務(wù)就緒時(shí),把就緒任務(wù)的任務(wù)控制塊放在就緒隊(duì)列的末尾。調(diào)度程序需要從就緒隊(duì)列的頭部到尾部進(jìn)行一次遍歷,才能獲得就緒隊(duì)列中具有最高優(yōu)先級的任務(wù);方式二:就緒隊(duì)列按照優(yōu)先級從高到低的順序排列。新的就緒任務(wù)到達(dá)時(shí),需要插入到就緒隊(duì)列的合適位置,確保就緒隊(duì)列保持優(yōu)先級從高到低排列的順序性。第65頁/共150頁任務(wù)隊(duì)列在這兩種處理方式中,所花費(fèi)的時(shí)間與任務(wù)數(shù)量有密切的關(guān)系,具有不確定性。為提高實(shí)時(shí)內(nèi)核的確定性,可采用一種被稱為優(yōu)先級位圖的就緒任務(wù)處理算法。
第66頁/共150頁FreeTCBsafterOS_TCBInit()inucOS第67頁/共150頁優(yōu)先級位圖算法
OSRdyGrp:優(yōu)先級就緒組OSRdyTbl:優(yōu)先級就緒表35:00100011charOSRdyGrp;charOSRdyTbl[8];第68頁/共150頁下標(biāo)二進(jìn)制值000000001100000010200000100300001000400010000500100000601000000710000000優(yōu)先級映射表OSMapTblcharOSMapTbl[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};OSMapTbl的數(shù)組元素的下標(biāo)與任務(wù)優(yōu)先級的高三位或低三位相對應(yīng)。OSMapTbl的數(shù)組元素對應(yīng)的二進(jìn)制值中,位為1的位表示OSRdyGrp或是OSRdyTbl[]的對應(yīng)位也為1。
35:00100011第69頁/共150頁優(yōu)先級判定表charOSUnMapTbl[256]以O(shè)SRdyGrp或是OSRdyTbl[]數(shù)組元素的值為索引,獲取該值對應(yīng)二進(jìn)制表示中1出現(xiàn)的最低二進(jìn)制位的序號(0-7)。
第70頁/共150頁任務(wù)進(jìn)入就緒態(tài)
OSRdyGrp|=OSMapTbl[priority>>3];OSRdyTbl[priority>>3]|=OSMapTbl[priority&0x07];35:00100011OSRdyGrp765432101514131211109823222120191817163130292827262524393837363534333247464554434241405554535251504948636261605958575676543210OSRdyTblOSRdyTbl[0]OSRdyTbl[1]OSRdyTbl[2]OSRdyTbl[3]OSRdyTbl[4]OSRdyTbl[5]OSRdyTbl[6]OSRdyTbl[7]0001000000001000第71頁/共150頁任務(wù)退出就緒態(tài)
if((OSRdyTbl[priority>>3]&=~OSMapTbl[priority&0x07])==0) OSRdyGrp&=~OSMapTbl[priority>>3];
35:00100011OSRdyGrp765432101514131211109823222120191817163130292827262524393837363534333247464554434241405554535251504948636261605958575676543210OSRdyTbl00001000->11110111
00010000->11101111OSRdyTbl[0]OSRdyTbl[1]OSRdyTbl[2]OSRdyTbl[3]OSRdyTbl[4]OSRdyTbl[5]OSRdyTbl[6]OSRdyTbl[7]第72頁/共150頁獲取進(jìn)入就緒態(tài)的最高優(yōu)先級
high3Bit=OSUnMapTbl[OSRdyGrp];low3Bit=OSUnMapTbl[OSRdyTbl[high3Bit]]; priority=(high3Bit<<3)+low3Bit;
ucOS中,任務(wù)按優(yōu)先級進(jìn)行組織,以優(yōu)先級為數(shù)組元素下標(biāo),通過OSTCBPrioTbl[]即可找到相應(yīng)的TCB。35:00100011OSRdyGrp7654321015141312111098232221201918171631302928272625241000100047464554434241405554535251504948636261605958575601010000OSRdyTbl0x50->4/high3Bit0x88->3/low3BitOSRdyTbl[0]OSRdyTbl[1]OSRdyTbl[2]OSRdyTbl[3]OSRdyTbl[4]OSRdyTbl[5]OSRdyTbl[6]OSRdyTbl[7]第73頁/共150頁任務(wù)管理機(jī)制任務(wù)管理用來實(shí)現(xiàn)對任務(wù)狀態(tài)的直接控制和訪問。內(nèi)核的任務(wù)管理是通過系統(tǒng)調(diào)用來體現(xiàn),主要包括任務(wù)創(chuàng)建、任務(wù)刪除、任務(wù)掛起、任務(wù)喚醒、設(shè)置任務(wù)屬性等內(nèi)容。創(chuàng)建任務(wù)刪除任務(wù)掛起任務(wù)喚醒任務(wù)設(shè)置任務(wù)屬性改變?nèi)蝿?wù)優(yōu)先級獲取任務(wù)信息…任務(wù)管理功能第74頁/共150頁任務(wù)管理機(jī)制創(chuàng)建任務(wù)的過程即為分配任務(wù)控制塊的過程。在創(chuàng)建任務(wù)時(shí),通常需要確定任務(wù)的名字和任務(wù)的優(yōu)先級等內(nèi)容,確立任務(wù)所能使用的堆棧區(qū)域。任務(wù)創(chuàng)建成功后,通常會為用戶返回一個(gè)標(biāo)識該任務(wù)的ID,以實(shí)現(xiàn)對任務(wù)的引用管理。刪除任務(wù)把任務(wù)從系統(tǒng)中去掉,釋放對應(yīng)的任務(wù)控制塊。掛起/喚醒任務(wù)把任務(wù)變?yōu)榈却隣顟B(tài),可通過喚醒任務(wù)操作把任務(wù)轉(zhuǎn)換為就緒狀態(tài)。第75頁/共150頁任務(wù)管理機(jī)制設(shè)置任務(wù)屬性可以用來設(shè)置任務(wù)的搶占、時(shí)間片等特性,以確定是否允許任務(wù)在執(zhí)行過程中被搶占或是對同優(yōu)先級任務(wù)采用時(shí)間片輪轉(zhuǎn)方式運(yùn)行等。改變?nèi)蝿?wù)優(yōu)先級用來根據(jù)需要改變?nèi)蝿?wù)的當(dāng)前優(yōu)先級。獲取任務(wù)信息獲得任務(wù)的當(dāng)前優(yōu)先級、任務(wù)的屬性、任務(wù)的名字、任務(wù)的上下文、任務(wù)的狀態(tài)等內(nèi)容,便于用戶進(jìn)行決策。第76頁/共150頁創(chuàng)建任務(wù)任務(wù)創(chuàng)建為任務(wù)分配和初始化相關(guān)的數(shù)據(jù)結(jié)構(gòu)。任務(wù)創(chuàng)建時(shí)通常需要使用如下信息:任務(wù)的名字任務(wù)的初始優(yōu)先級任務(wù)棧任務(wù)屬性任務(wù)對應(yīng)的函數(shù)入口地址任務(wù)對應(yīng)函數(shù)的參數(shù)任務(wù)刪除時(shí)的回調(diào)函數(shù)第77頁/共150頁創(chuàng)建任務(wù)??臻g:由于不同任務(wù)運(yùn)行時(shí)需要的的大小不同,由內(nèi)核進(jìn)行任務(wù)棧的分配就不能適應(yīng)應(yīng)用任務(wù)的多樣性需求。通常由用戶指定任務(wù)運(yùn)行過程中需要使用的??臻g。確定任務(wù)到底需要多少??臻g是一個(gè)比較困難的事情。大都需要進(jìn)行一個(gè)反復(fù)修正的過程:在最開始的時(shí)候,根據(jù)應(yīng)用的類型,為任務(wù)分配一個(gè)比預(yù)期估計(jì)更大的??臻g;使用棧檢測函數(shù),定期監(jiān)控任務(wù)對棧的使用情況,并據(jù)此對任務(wù)棧的大小進(jìn)行調(diào)整。第78頁/共150頁創(chuàng)建任務(wù)任務(wù)可以包含多種屬性任務(wù)是否可被搶占是否采用時(shí)間片輪轉(zhuǎn)調(diào)度方式調(diào)度是否響應(yīng)異步信號任務(wù)中開放的中斷級別是否使用數(shù)字協(xié)處理器等內(nèi)容如果任務(wù)需要進(jìn)行浮點(diǎn)運(yùn)算,在創(chuàng)建任務(wù)時(shí)實(shí)時(shí)內(nèi)核應(yīng)為任務(wù)分配浮點(diǎn)堆??臻g,以在任務(wù)切換時(shí)保存或是恢復(fù)數(shù)字協(xié)處理器的上下文內(nèi)容。任務(wù)對應(yīng)函數(shù)的入口地址表示所創(chuàng)建任務(wù)起始執(zhí)行的入口第79頁/共150頁創(chuàng)建任務(wù)任務(wù)創(chuàng)建通常需要完成以下工作:獲得任務(wù)控制塊TCB根據(jù)實(shí)時(shí)內(nèi)核用戶提供的信息初始化TCB為任務(wù)分配一個(gè)可以唯一標(biāo)識任務(wù)的ID使任務(wù)處于就緒狀態(tài),把任務(wù)放置到就緒隊(duì)列進(jìn)行任務(wù)調(diào)度處理第80頁/共150頁INT8UOSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INT8Uprio){
OS_STK*psp;
INT8Uerr;
OS_ENTER_CRITICAL();
if(OSTCBPrioTbl[prio]==(OS_TCB*)0){/*Makesuretaskdoesn'talreadyexistatthispriority*/
OSTCBPrioTbl[prio]=(OS_TCB*)1;
/*Reservetheprioritytopreventothersfromdoing
thesamethinguntiltaskiscreated.*/
OS_EXIT_CRITICAL();psp=(OS_STK*)OSTaskStkInit(task,pdata,ptos,0);
/*Initializethetask'sstack*/err=OS_TCBInit(prio,psp,(OS_STK*)0,0,0,(void*)0,0);if(err==OS_NO_ERR){
OS_ENTER_CRITICAL();
OSTaskCtr++;
/*Incrementthe#taskscounter*/
OS_EXIT_CRITICAL();
if(OSRunning==TRUE){/*Findhighestprioritytaskifmultitaskinghasstarted*/
OS_Sched();}}else{
OS_ENTER_CRITICAL();
OSTCBPrioTbl[prio]=(OS_TCB*)0;/*Makethispriorityavailabletoothers*/
OS_EXIT_CRITICAL();}return(err);}OS_EXIT_CRITICAL();return(OS_PRIO_EXIST);}
OSTaskCreateinucOS第81頁/共150頁intmain(void){//InitializeuCOS-II.OSInit();//CreatethefirsttaskOSTaskCreate(TestTask1,(void*)11,&TestTaskStk1[TASK_STK_SIZE],11);//Startmultitasking.OSStart();return0;}voidTestTask1(void*pdata){printf("%4u:*****TestTask1Firstcall*****\n",OSTime);
//Create3othertasksOSTaskCreate(TestTask2,(void*)22,&TestTaskStk2[TASK_STK_SIZE],22);OSTaskCreate(TestTask3,(void*)33,&TestTaskStk3[TASK_STK_SIZE],33);OSTaskCreate(TestTask4,(void*)10,&TestTaskStk3[TASK_STK_SIZE],10);while(1){
printf("%4u:*****TestTask11*****\n",OSTime);
OSTimeDly(1);}}TaskdemobasedonucOS第82頁/共150頁voidTestTask2(void*pdata){while(1){printf("%4u:*****TestTask22*****\n",OSTime);OSTimeDly(1);}}voidTestTask3(void*pdata){while(1){
printf("%4u:*****TestTask33*****\n",OSTime);OSTimeDly(1);}}voidTestTask4(void*pdata){while(1){printf("%4u:+++++TestTask10+++++\n",OSTime);OSTaskSuspend(10);//Suspendyourself
}}程序運(yùn)行結(jié)果第83頁/共150頁刪除任務(wù)
內(nèi)核根據(jù)任務(wù)創(chuàng)建時(shí)獲得的ID刪除指定的任務(wù)。在刪除一個(gè)任務(wù)時(shí),需要釋放該任務(wù)所擁有的資源。釋放任務(wù)所擁有的資源通常由內(nèi)核和任務(wù)共同完成。內(nèi)核通常只釋放那些由內(nèi)核為任務(wù)分配的資源如任務(wù)名字和TCB等內(nèi)容所占用的空間。由任務(wù)自己分配的資源則通常由任務(wù)自身進(jìn)行釋放如任務(wù)的堆??臻g,以及其他一些任務(wù)申請的資源,信號量、timer、文件系統(tǒng)資源、I/O設(shè)備和使用malloc等函數(shù)動態(tài)獲得的內(nèi)存空間等。
第84頁/共150頁刪除任務(wù)任務(wù)刪除通常需要進(jìn)行以下工作:根據(jù)指定的ID,獲得對應(yīng)任務(wù)的TCB把任務(wù)的TCB從隊(duì)列中取出來,掛入空閑TCB隊(duì)列釋放任務(wù)所占用的資源第85頁/共150頁INT8UOSTaskDel(INT8Uprio){OS_EVENT*pevent;OS_TCB*ptcb;BOOLEANself;if(OSIntNesting>0){/*SeeiftryingtodeletefromISR*/return(OS_TASK_DEL_ISR);}
OS_ENTER_CRITICAL();if(prio==OS_PRIO_SELF){/*Seeifrequestingtodeleteself*/prio=OSTCBCur->OSTCBPrio;/*Setprioritytodeletetocurrent*/}ptcb=OSTCBPrioTbl[prio];if(ptcb!=(OS_TCB*)0){/*Tasktodeletemustexist*/if((OSRdyTbl[ptcb->OSTCBY]&=~ptcb->OSTCBBitX)==0x00){/*Maketasknotready*/OSRdyGrp&=~ptcb->OSTCBBitY;}
pevent=ptcb->OSTCBEventPtr;
if(pevent!=(OS_EVENT*)0){/*Iftaskiswaitingonevent*/
if((pevent->OSEventTbl[ptcb->OSTCBY]&=~ptcb->OSTCBBitX)==0){
/*...removetaskfromeventctrlblock*/
pevent->OSEventGrp&=~ptcb->OSTCBBitY;}}
ptcb->OSTCBDly=0;/*PreventOSTimeTick()fromupdating*/
ptcb->OSTCBStat=OS_STAT_RDY;
/*Preventtaskfrombeingresumed*/
if(OSLockNesting<255){
OSLockNesting++;
}
OS_EXIT_CRITICAL();OSTaskDelinucOS第86頁/共150頁
OS_Dummy();/*...DummyensuresthatINTswillbe*/OS_ENTER_CRITICAL();/*...disabledHERE!*/
if(OSLockNesting>0){OSLockNesting--;
}OSTaskDelHook(ptcb);/*Calluserdefinedhook*/OSTaskCtr--;/*Onelesstaskbeingmanaged*/OSTCBPrioTbl[prio]=(OS_TCB*)0;/*Clearoldpriorityentry*/if(ptcb->OSTCBPrev==(OS_TCB*)0){/*RemovefromTCBchain*/ptcb->OSTCBNext->OSTCBPrev=(OS_TCB*)0;OSTCBList=ptcb->OSTCBNext;}else{ptcb->OSTCBPrev->OSTCBNext=ptcb->OSTCBNext;ptcb->OSTCBNext->OSTCBPrev=ptcb->OSTCBPrev;}ptcb->OSTCBNext=OSTCBFreeList;/*ReturnTCBtofreeTCBlist*/OSTCBFreeList=ptcb;OS_EXIT_CRITICAL();OS_Sched();/*Findnewhighestprioritytask*/return(OS_NO_ERR);}OS_EXIT_CRITICAL();return(OS_TASK_DEL_ERR);}第87頁/共150頁掛起任務(wù)
掛起指定任務(wù),直到通過喚醒任務(wù)對任務(wù)進(jìn)行解掛。一個(gè)任務(wù)可以把自己掛起當(dāng)任務(wù)把自己掛起后,會引起任務(wù)的調(diào)度,實(shí)時(shí)內(nèi)核將選取另外一個(gè)合適的任務(wù)進(jìn)行執(zhí)行。任務(wù)被掛起后,該任務(wù)將處于等待狀態(tài)掛起任務(wù)通常需要進(jìn)行以下工作:根據(jù)指定的ID,獲得對應(yīng)任務(wù)的TCB把任務(wù)的狀態(tài)變?yōu)榈却隣顟B(tài),并把TCB放置到等待隊(duì)列如果任務(wù)自己掛起自己,進(jìn)行任務(wù)調(diào)度第88頁/共150頁INT8UOSTaskSuspend(INT8Uprio){BOOLEANself;OS_TCB*ptcb;
OS_ENTER_CRITICAL();if(prio==OS_PRIO_SELF){
/*SeeifsuspendSELF*/prio=OSTCBCur->OSTCBPrio;self=TRUE;}elseif(prio==OSTCBCur->OSTCBPrio){/*Seeifsuspendingself*/self=TRUE;}else{self=FALSE;
/*Nosuspendinganothertask*/}ptcb=OSTCBPrioTbl[prio];if(ptcb==(OS_TCB*)0){
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 生產(chǎn)預(yù)測管理制度
- 監(jiān)理安全生產(chǎn)監(jiān)管制度
- 粘結(jié)劑對球團(tuán)生產(chǎn)制度
- 生產(chǎn)車間產(chǎn)前評審制度
- 洗臉巾生產(chǎn)制度
- 養(yǎng)雞生產(chǎn)制度
- 生產(chǎn)每天例會制度
- 生產(chǎn)條件變更管理制度
- 廚具安全生產(chǎn)管理制度
- 供電所生產(chǎn)制度
- 云南省2025年高二上學(xué)期普通高中學(xué)業(yè)水平合格性考試《信息技術(shù)》試卷(解析版)
- 2025年山東青島西海岸新區(qū)“千名人才進(jìn)新區(qū)”集中引才模擬試卷及一套完整答案詳解
- 四川省成都市樹德實(shí)驗(yàn)中學(xué)2026屆九年級數(shù)學(xué)第一學(xué)期期末監(jiān)測試題含解析
- 與業(yè)主溝通技巧培訓(xùn)
- 普惠托育服務(wù)機(jī)構(gòu)申請表、承諾書、認(rèn)定書
- 幼兒園小班數(shù)學(xué)《好吃的》課件
- 《海洋生物學(xué)》課程教學(xué)大綱
- 對公賬戶收款變更協(xié)議書
- 低壓控制基本知識培訓(xùn)課件
- 萬科施工管理辦法
- 2025至2030中國養(yǎng)老健康行業(yè)深度發(fā)展研究與企業(yè)投資戰(zhàn)略規(guī)劃報(bào)告
評論
0/150
提交評論