




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第五章
任務管理與調度
1主要內容概述任務任務管理任務調度優(yōu)先級反轉25.1概述TaskdemobasedonucOSintmain(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);}}3voidTestTask2(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
}}
4采用多任務的好處任務的規(guī)模較小
每個任務更容易編碼和調試,其質量也更容易得到保證
不少應用本身就是由多個任務構成的如一個應用可能需要進行以下任務的處理:計算、從網絡獲取數據和刷新顯示屏幕采用多任務的處理方式是應用問題的一個非常自然的解決方式任務之間具有較高的獨立性,耦合性小
通過增加新的任務就能方便的擴充系統功能實時性強保證緊急事件得到優(yōu)先處理成為可能5在嵌入式實時系統中任務(task)通常為進程(process)和線程(thread)的統稱任務是調度的基本單位進程最初由Multics的設計者在60年代提出來的,主要包括以下內容:一個正在執(zhí)行的程序;計算機中正在運行的程序的一個實例;可以分配給處理器,并由處理器執(zhí)行的一個實體;由一個順序的執(zhí)行線程、一個當前狀態(tài)和一組相關的系統資源所刻畫的活動單元。6進程由代碼、數據、堆棧和進程控制塊構成。進程控制塊包含了操作系統用來控制進程所需要的信息:進程狀態(tài)CPU寄存器調度信息內存管理信息I/O狀態(tài)信息等早期的進程,包含了以下兩個方面的內容:資源。進程是資源分配的基本單位,一個進程包括一個保存進程映像的虛擬地址空間、主存、I/O設備和文件等資源。調度執(zhí)行。進程作為操作系統的調度實體,是調度的基本單位。7隨著操作系統的發(fā)展,進程所包含的兩個方面的內容逐漸被分開:輕量級進程或線程:調度執(zhí)行的單位
進程:資源分配的單位
線程是進程內部一個相對獨立的控制流,由線程上下文和需要執(zhí)行的一段程序指令構成在進程中,所有線程共享該進程的狀態(tài)和資源,可以訪問相同的數據使用線程的優(yōu)勢:
創(chuàng)建:在一個已有進程中創(chuàng)建一個新線程比創(chuàng)建一個全新的進程所需的時間開銷少;終止:終止一個線程比終止一個進程所花費的時間少;切換:線程切換比進程切換所花費的時間少;通信:使同一進程內部不同線程之間的通信效率得到顯著提高。在大多數操作系統中,不同進程之間的通信需要內核的干預,而同一進程內部不同線程之間則可直接通信。8引入線程的概念后,可把進程和線程的使用分為以下幾種模型:單進程/單線程模型(如MS-DOS):整個系統只有一個進程、一個線程單進程/多線程模型:在單進程/多線程模型中,整個系統有一個進程、多個線程多進程/單線程模型(如傳統的UNIX):在多進程/單線程模型中,整個系統有多個進程,每個進程只有一個線程多進程/多線程模型(如WindowsNT、Solaris、Mach等):在多進程/多線程模型中,系統有多個進程,每個進程又可包含多個線程9圖5.1進程和線程的使用模型10大多數嵌入式實時內核:單進程/多線程模型,或簡單地稱為任務模型
把整個應用當作一個沒有定義的進程來對待;應用則被劃分為多個任務的形式來進行處理。也有一些嵌入式實時操作系統采用了多進程/多線程模型:系統中包含多個進程,每個進程對應又包含多個線程多進程/多線程模型適合于處理復雜的應用任務模型則適用于實時性要求較高的、相對簡單的應用11任務劃分程序在CPU中是以任務的方式在運行,所以要將系統的處理框圖轉化為多任務流程圖,對處理進行任務劃分。任務劃分存在這樣一對矛盾:如果任務太多,必然增加系統任務切換的開銷;如果任務太少,系統的并行度就降低了,實時性就比較差。在任務劃分時要遵循以下原則:◆I/O原則:不同的外設執(zhí)行不同任務。◆優(yōu)先級原則:不同優(yōu)先級處理不同的任務?!舸罅窟\算:歸為一個任務?!艄δ荞詈希簹w為一個任務。◆偶然耦合:歸為一個任務?!纛l率組合:對于周期時間,不同任務處理不同的頻率。如果在具體分析一個系統時發(fā)生原則沖突,則要為每一個原則針對具體的系統設定“權重”,必要時可以通過計算“權重”來最終確定如何劃分任務。125.2任務任務的定義及其主要特性任務的內容任務的分類任務參數135.2.1任務的定義及其主要特性
任務是一個具有獨立功能的無限循環(huán)的程序段的一次運行活動,是實時內核調度的單位,具有以下特性:動態(tài)性:任務狀態(tài)是不斷變化的。
一般分為就緒態(tài)、運行態(tài)和等待態(tài)。在多任務系統中,任務的狀態(tài)將隨著系統的需要不斷進行變化。并行性:系統中同時存在多個任務,這些任務在宏觀上是同時運行的。異步獨立性:
每個任務各自按相互獨立的不可預知的速度運行,走走停停。
14任務的實現創(chuàng)建任務的系統服務OSTaskCreate()INT8UOSTaskCreate(
void(*task)(void*pd),//任務代碼指針
void*pdata,//任務參數指針
OS_STK*ptos,//任務棧的棧頂指針
INT8Uprio//任務的優(yōu)先級
);OSTaskCreateExt()提問:C/OS-II中的任務是進程還是線程?15任務主函數一個任務通常是一個無限循環(huán)(返回值類型void)voidMyTask(void*pdata){while(1){dosomething;waiting; dosomething; }}16任務也可以自我刪除(并非真的刪除,只是內核不再知道該任務)voidMyTask(void*pdata){....../*用戶代碼*/OSTaskDel(OS_PRIO_SELF);}175.2.2任務的內容
任務主要包含以下內容:代碼:一段可執(zhí)行的程序數據:程序所需要的相關數據(變量、工作空間、緩沖區(qū)等)堆棧
程序執(zhí)行的上下文環(huán)境18任務的內容
/﹡ioTaskimplementsdataobtainingandhandlingcontinuously﹡/voidioTask(void){ intdata;
initial(); /﹡Thefollowingsentencesgetdataandhandledatacontinuously﹡/
while(TRUE)
{ data=getData(); handleData(data); }}任務所包含的程序通常為一個具有無限循環(huán)的程序
19voidYourTask(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);}20voidTestTask2(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
}}21任務的內容
任務與程序的區(qū)別:任務能真實地描述工作內容的并發(fā)性,而程序不能;程序是任務的組成部分除程序外,任務還包括數據、堆棧及其上下文環(huán)境等內容;程序是靜態(tài)的,任務是動態(tài)的;任務有生命周期,有誕生、有消亡,是短暫的;而程序是相對長久的;一個程序可對應多個任務,反之亦然;任務具有創(chuàng)建其他任務的功能,而程序沒有。22任務的內容
任務上下文環(huán)境(context)包括了實時內核管理任務、以及處理器執(zhí)行任務所需要的所有信息。任務優(yōu)先級任務的狀態(tài)等實時內核所需要的信息以及處理器的各種寄存器的內容(hardwarecontext):程序計數器、堆棧指針、通用寄存器等的內容
任務的上下文環(huán)境通過任務控制塊(taskcontrolblock,TCB)來體現。
23多任務系統示意圖
245.2.3任務的分類
按照到達情況的可預測性,任務可以劃分為:周期任務(periodictask)非周期任務按照重要程度,可分為:關鍵任務(criticaltask)非關鍵任務(noncriticaltask)25任務的分類
周期任務與非周期任務
周期任務每隔一個固定的時間間隔就會執(zhí)行一次。飛行器可能需要每隔100ms獲得一次關于飛行器的速度、高度和姿態(tài)數據,控制傳感器獲取這些數據就需要通過周期任務來進行。非周期任務執(zhí)行的間隔時間則為不確定的。移動通信設備中的通信任務,該任務只有在需要進行通信的情況下才會得到執(zhí)行。非周期任務分為:sporadictask:有最小到達間隔時間限制aperiodictask:沒有到達時間限制26任務的分類
關鍵任務與非關鍵任務
關鍵任務:為需要得到及時執(zhí)行的任務,否則將出現災難性的后果飛行器中用于處理生命支持系統和穩(wěn)定性控制系統的任務非關鍵任務:
如果沒有得到及時執(zhí)行,則不會產生嚴重后果27任務參數
任務參數:優(yōu)先級(priority)周期(period)計算時間(computationtime)就緒時間(readytime)截止時間(deadline)28任務參數
任務的優(yōu)先級
表示任務對應工作內容在處理上的優(yōu)先程度優(yōu)先級越高,表明任務越需要得到優(yōu)先處理飛行器中處理穩(wěn)定性控制的任務,就需要具有較高的優(yōu)先級,一旦執(zhí)行條件得到滿足,應及時得到執(zhí)行任務的優(yōu)先級分為靜態(tài)優(yōu)先級和動態(tài)優(yōu)先級。靜態(tài)優(yōu)先級:任務的優(yōu)先級被確定后,在系統運行過程中將不再發(fā)生變化;動態(tài)優(yōu)先級:系統運行過程中,任務的優(yōu)先級是可以動態(tài)變化的。
29任務參數
周期
周期任務所具有的參數,表示任務周期性執(zhí)行的間隔時間任務的計算時間
任務在特定硬件環(huán)境下被完整執(zhí)行所需要的時間,也被稱為是任務的執(zhí)行時間(executiontime)。由于任務每次執(zhí)行的軟件環(huán)境的差異性,導致任務在各次具體執(zhí)行過程中的計算時間各有不同。通常用最壞情況下的執(zhí)行時間(worstcasetime)或是需要的最長執(zhí)行時間來表示,也可用統計時間(statisticaltime)來表示。30任務參數
任務的就緒時間
任務具備了在處理器上被執(zhí)行所需要條件時的時間任務的截止時間意味著任務需要在該時間到來之前被執(zhí)行完成。截止時間可以通過絕對截止時間(absolutedeadline)和相對截止時間(relativetime)兩種方式來表示相對截止時間為任務的絕對截止時間減去任務的就緒時間。截止時間可以分為強截止時間(harddeadline)和弱截止時間(softdeadline)兩種情況:具有強截止時間的任務即為關鍵任務,如果截止時間不能得到滿足,就會出現嚴重的后果。擁有關鍵任務的實時系統又被稱為強實時(hardreal-time)系統,否則稱為弱實時(softreal-time)31μC/OS-Ⅱ可以管理多達64個任務;每個任務被賦以不同的優(yōu)先級,取值從0到OS_LOWEST_PRIO-2,數值越小,優(yōu)先級越高;系統保留了優(yōu)先級為0、1、2、3、OS_LOWEST_PRIO-3、OS_LOWEST_PRI0-2,OS_LOWEST_PRI0-1以及OS_LOWEST_PRI0這8個任務以被將來使用,用戶可以有56個應用任務;任務的優(yōu)先級同樣也是它的標識號ID。OS_CFG.H
中定義=63325.3任務管理
任務狀態(tài)與變遷空閑任務任務控制塊任務切換任務隊列任務管理機制335.3.1任務狀態(tài)與變遷
任務擁有的資源情況是不斷變化的,導致任務狀態(tài)也表現出不斷變化的特性。不同的實時內核實現方式對任務狀態(tài)的定義不盡相同,但是都可以概括為三種基本的狀態(tài):等待(waiting):任務在等待某個事件的發(fā)生;就緒(ready):任務等待獲得處理器資源;執(zhí)行(running):任務獲得處理器資源,所包含的代碼內容正在被執(zhí)行。34任務狀態(tài)與變遷
在單處理器系統中:任何時候都只有一個任務在CPU中執(zhí)行
如果沒有任何事情可做,就運行空閑任務執(zhí)行空操作任何一個可以執(zhí)行的任務都必須處于就緒狀態(tài)
調度程序從任務的就緒隊列中選擇下一個需要執(zhí)行的任務。處于就緒狀態(tài)的任務擁有除CPU以外的其他所有需要的資源。任務還可能處于等待狀態(tài)如任務在需要等待I/O設備或其他任務提供的數據,而數據又還沒有到達該任務的情況下,就處于等待狀態(tài)35任務狀態(tài)與變遷
任務會在不同的狀態(tài)之間進行轉換,即任務狀態(tài)的變遷對于處于就緒狀態(tài)的任務,獲得CPU后,就處于執(zhí)行狀態(tài)。處于執(zhí)行狀態(tài)的任務如果被高優(yōu)先級任務所搶占,任務又會回到就緒狀態(tài)。處于執(zhí)行狀態(tài)的任務如果需要等待資源,任務會被切換到等待狀態(tài)。對處于等待狀態(tài)的任務,如果需要的資源得到滿足,就會轉換為就緒狀態(tài),等待被調度執(zhí)行。36任務狀態(tài)變遷37三個任務進行狀態(tài)轉換的過程
包含三個任務和一個調度程序。調度程序用來確定下一個需要投入運行的任務,因此調度程序本身也需要占用一定的處理時間。38刪除任務TaskstatesandtransitionofuCOS
39空閑任務(Idletask)
內核總是創(chuàng)建一個空閑任務OSTaskIdle();總是設置為最低優(yōu)先級,OS_LOWEST_PRIOR;當所有其他任務都未在執(zhí)行時,空閑任務開始執(zhí)行;應用程序不能刪除該任務;空閑任務的工作就是把32位計數器OSIdleCtr加1,該計數器被統計任務所使用;40voidOS_TaskIdle(void*pdata){/*Preventcompilerwarningfornotusing'pdata‘*/pdata=pdata;for(;;){OS_ENTER_CRITICAL();OSIdleCtr++;OS_EXIT_CRITICAL();/*CalluserdefinableHOOK*/OSTaskIdleHook();}}OSIdleCtrisusedbythestatisticstasktodeterminehowmuchCPUtime(inpercentage)isactuallybeingconsumedbytheapplicationsoftware.
IdleTaskofuCOS415.3.2任務控制塊
任務管理是通過對任務控制塊(taskcontrolblock,TCB)的操作來實現的。任務控制塊是包含任務相關信息的數據結構包含了任務執(zhí)行過程中所需要的所有信息。任務控制塊大都包括以下信息:任務的名字任務執(zhí)行的起始地址任務的優(yōu)先級任務的狀態(tài)任務的硬件上下文(堆棧指針、PC和寄存器等)
任務的隊列指針等內容42圖5.7任務控制塊示意圖
TasknameTaskIDTaskstatusTaskpriorityTaskcontext(registersandflagsofCPU)…43任務控制塊
為節(jié)約內存,任務數量通常需要進行預先配置按照配置的任務數量初始化任務控制塊,一個任務對應一個初始的任務控制塊,形成一個空閑任務控制塊鏈。在任務創(chuàng)建時,實時內核從空閑任務控制塊鏈中為任務分配一個任務控制塊。隨后對任務的操作,都是基于對應的任務控制塊來進行的。當任務被刪除后,對應的任務控制塊又會被實時內核回收到空閑任務控制塊鏈。44TCBofucOS
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*/
45TCBofucOS
#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()*/#endif46#if(OS_VERSION>=251)&&(OS_FLAG_EN>0)&&(OS_MAX_FLAGS>0)#ifOS_TASK_DEL_EN>0OS_FLAG_NODE*OSTCBFlagNode;/*Pointertoeventflagnode*/#endifOS_FLAGSOSTCBFlagsRdy;/*Eventflagsthatmadetaskreadytorun*/#endifINT16UOSTCBDly;/*Nbrtickstodelaytaskor,timeoutwaitingforevent*/INT8UOSTCBStat;/*Taskstatus*/INT8UOSTCBPrio;/*Taskpriority(0==highest,63==lowest)*/47OSTCBX;/*Bitpositioningroupcorrespondingtotaskpriority(0..7)*/INT8UOSTCBY;/*Indexintoreadytablecorrespondingtotaskpriority*/INT8UOSTCBBitX;/*Bitmasktoaccessbitpositioninreadytable*/INT8UOSTCBBitY;/*Bitmasktoaccessbitpositioninreadygroup*/#ifOS_TASK_DEL_EN>0BOOLEANOSTCBDelReq;/*Indicateswhetherataskneedstodeleteitself*/#endif}OS_TCB;485.3.3任務切換
任務切換當多任務內核決定運行另外的任務時,它把正在運行任務的當前狀態(tài)(即CPU寄存器中的全部內容)保存到任務自己的棧區(qū)之中。然后把下一個將要運行的任務的當前狀態(tài)從該任務的棧中重新裝入CPU的寄存器,并開始下一個任務的運行。這個過程就稱為任務切換。任務切換時間任務切換所需要的時間取決于CPU有多少寄存器要入棧。CPU的寄存器越多,額外負荷就越重。495.3.3任務切換
任務切換(contextswitching)保存當前任務的上下文,并恢復需要執(zhí)行的任務的上下文的過程。當發(fā)生任務切換時:當前正在運行的任務的上下文就需要通過該任務的任務控制塊保存起來;把需要投入運行的任務的上下文從對應的任務控制塊中恢復出來。50在時刻8即發(fā)生了任務切換,任務1的上下文需要保存到任務1的任務控制塊中去。經過調度程序的處理,在時刻10任務2投入運行,需要把任務2的任務控制塊中關于上下文的內容恢復到CPU的寄存器。51任務1執(zhí)行一段時間后,由于某種原因,需要進行任務切換,進入實時內核的調度程序。調度程序首先把當前的上下文內容保存到任務1的任務控制塊TCB1中,然后又把任務2的上下文從TCB2中恢復到CPU寄存器,隨后任務2得到執(zhí)行。任務2執(zhí)行一段時間后,由于某種原因,需要進行任務切換,進入實時內核的調度程序。調度程序首先把當前的上下文內容保存到任務2的任務控制塊TCB2中,然后又把任務1的上下文從TCB1中恢復到CPU寄存器,隨后任務1得到執(zhí)行。
52任務切換
任務切換將導致任務狀態(tài)發(fā)生變化:當前正在運行的任務將由運行狀態(tài)變?yōu)榫途w或是等待狀態(tài);需要投入運行的任務則由就緒狀態(tài)變?yōu)檫\行狀態(tài)。53任務切換
任務切換具有如下基本步驟:
保存任務上下文環(huán)境;更新當前處于運行狀態(tài)的任務的任務控制塊的內容,如把任務的狀態(tài)由運行狀態(tài)改變?yōu)榫途w或是等待狀態(tài);把任務的任務控制塊移到相應的隊列(就緒隊列或是等待隊列);選擇另一個任務進行執(zhí)行:調度;改變需要投入運行的任務的任務控制塊的內容,把任務的狀態(tài)變?yōu)檫\行狀態(tài);根據任務控制塊,恢復需要投入運行的任務的上下文環(huán)境。54任務切換
任務切換的時機:
中斷、自陷如當I/O中斷發(fā)生的時候如果I/O活動是一個或多個任務正在等待的事件,內核將把相應的處于等待狀態(tài)的任務轉換為就緒狀態(tài)同時,內核還將確定是否繼續(xù)執(zhí)行當前處于運行狀態(tài)的任務,或是用高優(yōu)先級的就緒任務搶占該任務
自陷由于執(zhí)行任務中當前指令所引起,將導致實時內核處理相應的錯誤或異常事件,并根據事件類型,確定是否進行任務的切換55任務切換
運行任務因缺乏資源而被阻塞如,任務執(zhí)行過程中進行I/O操作時(如打開文件),如果此前該文件已被其他任務打開,將導致當前任務處于等待狀態(tài),而不能繼續(xù)執(zhí)行時間片輪轉調度時內核將在時鐘中斷處理程序中確定當前正在運行的任務的執(zhí)行時間是否已經超過了設定的時間片;如果超過了時間片,實時內核將停止當前任務的運行,把當前任務的狀態(tài)變?yōu)榫途w狀態(tài),并把另一個任務投入運行56任務切換
高優(yōu)先級任務處于就緒時如果采用基于優(yōu)先級的搶占式調度算法,將導致當前任務停止運行,使更高優(yōu)先級的任務處于運行狀態(tài)57voidOS_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();
TaskschedulingofucOS58voidOSCtxSw(void){PUSHR1,R2,R3andR4ontothecurrentstack;OSTCBCur->OSTCBStkPtr=SP;OSTCBCur=OSTCBHighRdy;SP=OSTCBHighRdy->OSTCBStkPtr;POPR4,R3,R2andR1fromthenewstack;Executeareturnfrominterruptinstruction;
}OS_TASK_SW()59調用OS_TASK_SW()前的數據結構低優(yōu)先級任務OS_TCBOSTCBCur(1)存貯器低地址存貯器高地址堆棧方向SPR1R2R3R4PCPSW存貯器低地址存貯器高地址高優(yōu)先級任務OS_TCBOSTCBHighRdy(3)(2)CPU(4)(5)Context-switchinucOS
60保存當前CPU寄存器的值低優(yōu)先級任務OS_TCBOSTCBCurPSWPCR1R2R3R4存貯器低地址存貯器高地址堆棧方向SPR1R2R3R4PCPSW存貯器低地址存貯器高地址高優(yōu)先級任務OS_TCBOSTCBHighRdy(3)(2)CPU(4)(5)(1)(3)61重新裝入要運行的任務低優(yōu)先級任務OS_TCBOSTCBCurPSWPCR1R2R3R4存貯器低地址存貯器高地址堆棧方向SPR1R2R3R4PCPSWPSWPCR1R2R3R4存貯器低地址存貯器高地址高優(yōu)先級任務OS_TCBOSTCBHighRdyOSTCBCur(1)(2)CPU(4)(4)(1)(3)(3)(4)62任務上下文切換時間
任務上下文切換時間:保存:保存當前運行任務上下文的時間;調度:選擇下一個任務的調度時間;
恢復:將要運行任務的上下文的恢復時間。保存和恢復上下文的時間:取決于任務上下文的定義和處理器的速度。不同種類的處理器,任務上下文的定義不同,其內容有多有少。任務上下文切換的時間與調度(即選擇下一個運行任務)的過程有關。強實時內核要求調度過程所花費的時間是確定的,即不能隨系統中就緒任務的數目而變化。
與具體實現調度算法時所采用的數據結構有關。
635.3.4任務隊列
任務隊列通過任務控制塊實現對系統中所有任務的管理。
單就緒隊列和單等待隊列
64任務隊列
隊列由任務控制塊構成
65任務隊列
單等待隊列資源對應的事件發(fā)生時,實時內核需要掃描整個等待隊列,搜索等待該資源的任務,并按照一定的策略選取任務,把任務的任務控制塊放置到就緒隊列。如果系統的資源和任務比較多,搜索等待該資源的任務所需要的時間就比較長,會影響整個系統的實時性??刹捎靡环N多等待隊列的處理方式資源對應的事件發(fā)生時,能夠在較短的時間內確立等待該資源的任務等待隊列。66任務隊列
單就緒隊列和多等待隊列
67任務隊列
對于就緒任務,如果采用上述隊列方式進行管理,在基于優(yōu)先級的調度處理中,要獲得當前具有最高優(yōu)先級的就緒任務:方式一:任務就緒時,把就緒任務的任務控制塊放在就緒隊列的末尾。調度程序需要從就緒隊列的頭部到尾部進行一次遍歷,才能獲得就緒隊列中具有最高優(yōu)先級的任務;方式二:就緒隊列按照優(yōu)先級從高到低的順序排列。新的就緒任務到達時,需要插入到就緒隊列的合適位置,確保就緒隊列保持優(yōu)先級從高到低排列的順序性。68任務隊列
在這兩種處理方式中,所花費的時間與任務數量有密切的關系,具有不確定性。為提高實時內核的確定性,可采用一種被稱為優(yōu)先級位圖的就緒任務處理算法。69FreeTCBsafterOS_TCBInit()inucOS
705.3.5任務管理機制
任務管理用來實現對任務狀態(tài)的直接控制和訪問。內核的任務管理是通過系統調用來體現,主要包括任務創(chuàng)建、任務刪除、任務掛起、任務喚醒、設置任務屬性等內容。創(chuàng)建任務刪除任務掛起任務喚醒任務設置任務屬性改變任務優(yōu)先級獲取任務信息
…….任務管理功能
71任務管理機制
創(chuàng)建任務的過程即為分配任務控制塊的過程。在創(chuàng)建任務時,通常需要確定任務的名字和任務的優(yōu)先級等內容,確立任務所能使用的堆棧區(qū)域。任務創(chuàng)建成功后,通常會為用戶返回一個標識該任務的ID,以實現對任務的引用管理。刪除任務把任務從系統中去掉,釋放對應的任務控制塊。掛起/喚醒任務把任務變?yōu)榈却隣顟B(tài),可通過喚醒任務操作把任務轉換為就緒狀態(tài)。72任務管理機制
設置任務屬性可以用來設置任務的搶占、時間片等特性,以確定是否允許任務在執(zhí)行過程中被搶占或是對同優(yōu)先級任務采用時間片輪轉方式運行等。改變任務優(yōu)先級用來根據需要改變任務的當前優(yōu)先級。獲取任務信息獲得任務的當前優(yōu)先級、任務的屬性、任務的名字、任務的上下文、任務的狀態(tài)等內容,便于用戶進行決策。731.創(chuàng)建任務
任務創(chuàng)建為任務分配和初始化相關的數據結構。任務創(chuàng)建時通常需要使用如下信息:任務的名字任務的初始優(yōu)先級任務棧任務屬性任務對應的函數入口地址任務對應函數的參數任務刪除時的回調函數
74創(chuàng)建任務
??臻g:由于不同任務運行時需要的大小不同,由內核進行任務棧的分配就不能適應應用任務的多樣性需求。通常由用戶指定任務運行過程中需要使用的??臻g。確定任務到底需要多少??臻g是一個比較困難的事情。大都需要進行一個反復修正的過程:在最開始的時候,根據應用的類型,為任務分配一個比預期估計更大的??臻g;使用棧檢測函數,定期監(jiān)控任務對棧的使用情況,并據此對任務棧的大小進行調整。75創(chuàng)建任務
任務可以包含多種屬性任務是否可被搶占是否采用時間片輪轉調度方式調度是否響應異步信號任務中開放的中斷級別是否使用數字協處理器等內容如果任務需要進行浮點運算,在創(chuàng)建任務時實時內核應為任務分配浮點堆??臻g,以在任務切換時保存或是恢復數字協處理器的上下文內容。任務對應函數的入口地址
表示所創(chuàng)建任務起始執(zhí)行的入口76創(chuàng)建任務
任務創(chuàng)建通常需要完成以下工作:獲得任務控制塊TCB根據實時內核用戶提供的信息初始化TCB為任務分配一個可以唯一標識任務的ID使任務處于就緒狀態(tài),把任務放置到就緒隊列進行任務調度處理77OSTaskCreateinucOSINT8UOSTaskCreate(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;/*Reservetheprioritytopreventothersfromdoingthesamethinguntiltaskiscreated.*/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);}
78TaskdemobasedonucOS
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);}}79voidTestTask2(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
}}802.刪除任務
內核根據任務創(chuàng)建時獲得的ID刪除指定的任務。在刪除一個任務時,需要釋放該任務所擁有的資源。釋放任務所擁有的資源通常由內核和任務共同完成。內核通常只釋放那些由內核為任務分配的資源如任務名字和TCB等內容所占用的空間。由任務自己分配的資源則通常由任務自身進行釋放如任務的堆??臻g,以及其他一些任務申請的資源,信號量、timer、文件系統資源、I/O設備和使用malloc等函數動態(tài)獲得的內存空間等。81刪除任務
任務刪除通常需要進行以下工作:根據指定的ID,獲得對應任務的TCB把任務的TCB從隊列中取出來,掛入空閑TCB隊列釋放任務所占用的資源82OSTaskDelinucOS
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();
83OS_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);}843.掛起任務
掛起指定任務,直到通過喚醒任務對任務進行解掛。一個任務可以把自己掛起當任務把自己掛起后,會引起任務的調度,實時內核將選取另外一個合適的任務進行執(zhí)行。任務被掛起后,該任務將處于等待狀態(tài)掛起任務通常需要進行以下工作:根據指定的ID,獲得對應任務的TCB把任務的狀態(tài)變?yōu)榈却隣顟B(tài),并把TCB放置到等待隊列如果任務自己掛起自己,進行任務調度85OSTaskSuspendinucOS
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){/*Tasktosuspendmustexist*/OS_EXIT_CRITICAL();return(OS_TASK_SUSPEND_PRIO);}if((OSRdyTbl[ptcb->OSTCBY]&=~ptcb->OSTCBBitX)==0x00){/*Maketasknotready*/OSRdyGrp&=~ptcb->OSTCBBitY;}ptcb->OSTCBStat|=OS_STAT_SUSPEND;/*Statusoftaskis'SUSPENDED'*/OS_EXIT_CRITICAL();if(self==TRUE){/*ContextswitchonlyifSELF*/OS_Sched();}return(OS_NO_ERR);}864.喚醒任務
根據任務ID解掛指定的任務。如果任務還在等待其他資源,任務解掛后仍然處于等待狀態(tài);否則,解掛后的任務將處于就緒狀態(tài)。解掛任務通常需要進行以下工作:根據指定的ID,獲得對應任務的TCB如果任務在等待其他資源,任務將仍然處于等待狀態(tài);否則,把任務的狀態(tài)變?yōu)榫途w狀態(tài),并把TCB放置到就緒隊列進行任務調度87OSTaskResumeinucOS
INT8UOSTaskResume(INT8Uprio){OS_TCB*ptcb;OS_ENTER_CRITICAL();ptcb=OSTCBPrioTbl[prio];if(ptcb==(OS_TCB*)0){/*Tasktosuspendmustexist*/OS_EXIT_CRITICAL();return(OS_TASK_RESUME_PRIO);}if((ptcb->OSTCBStat&OS_STAT_SUSPEND)!=OS_STAT_RDY){/*Taskmustbesuspended*/if(((ptcb->OSTCBStat&=~OS_STAT_SUSPEND)==OS_STAT_RDY)&&/*Removesuspension*/(ptcb->OSTCBDly==0)){/*Mustnotbedelayed*/OSRdyGrp|=ptcb->OSTCBBitY;/*Maketaskreadytorun*/OSRdyTbl[ptcb->OSTCBY]|=ptcb->OSTCBBitX;OS_EXIT_CRITICAL();OS_Sched();}else{OS_EXIT_CRITICAL();}return(OS_NO_ERR);}OS_EXIT_CRITICAL();return(OS_TASK_NOT_SUSPENDED);}
885.任務睡眠
使當前任務睡眠一段指定的時間,時間到后,任務又重新回到就緒狀態(tài)。任務睡眠通常需要進行以下工作:修改任務狀態(tài),把任務狀態(tài)變?yōu)榈却隣顟B(tài)把任務TCB放置到時間等待鏈進行任務調度896.關于任務擴展
任務擴展便于應用能夠向系統中添加一些關于任務的附加操作為應用提供在系統運行的關鍵點上進行干預的手段可把應用提供的函數掛接到系統中去在創(chuàng)建任務、任務上下文發(fā)生切換或是任務被刪除的時候這些被掛接的函數能夠得到執(zhí)行90關于任務擴展
任務擴展的時機通常包含以下情況:任務創(chuàng)建時任務刪除時任務上下文切換時任務擴展功能實現方式:任務擴展表
應用編程接口91任務擴展表處理
typedefvoid(*extensionRoutine)(void);typedefstruct{ extensionRoutineextensionOfTaskCreate; extensionRoutineextensionOfTaskDelete; extensionRoutineextensionOfTaskSwitch;}taskExtensionTable;statusCodeextensionCreate(taskExtensionTable*extensionTable,int
statusCodeextensionDelete(intextensionTableID);在任務擴展表處理方式中,任務擴展表用來存放實現任務擴展處理的例程,實時內核通過查找任務擴展表來獲取擴展處理的入口函數。通過創(chuàng)建任務擴展表,把任務擴展例程添加到系統中去,通過刪除任務擴展表則可把任務擴展例程刪除掉。
92為任務創(chuàng)建、任務刪除和任務上下文切換分別提供了添加和刪除任務擴展處理例程。
API 描述extensionRoutineOfTaskCreateAdd(); /*為任務創(chuàng)建時提供擴展處理例程*/extensionRoutineOfTaskCreateDelete(); /*刪除為任務創(chuàng)建提供的擴展處理例程*/extensionRoutineOfTaskDeleteAdd(); /*為任務刪除時提供擴展處理例程*/extensionRoutineOfTaskDeleteDelete(); /*刪除為任務刪除提供的擴展處理例程*/extensionRoutineOfTaskSwitchAdd(); /*為任務上下文切換時提供擴展處理例程*/extensionRoutineOfTaskSwitchDelete(); /*刪除為任務上下文切換提供的擴展處理例程*/通過單獨的API實現任務擴展
93HOOKinucOS
voidOSIntCtxSw(void);voidOSStartHighRdy(void);voidOSTaskCreateHook(OS_TCB*ptcb);voidOSTaskDelHook(OS_TCB*ptcb);voidOSTaskStatHook(void);OS_STK*OSTaskStkInit(void(*task)(void*pd),void*pdata,OS_STK*ptos,INT16Uopt);voidOSTaskSwHook(void);voidOSTimeTickHook(void);94HOOKusedinOSInitinucOS
voidOSInit(void){ OSInitHookBegin();/*Callportspecificinitializationcode*/ OS_InitMisc();/*Initializemiscellaneousvariables*/ OS_InitRdyList();/*InitializetheReadyList*/ OS_InitTCBList();/*InitializethefreelistofOS_TCBs*/ OS_InitEventList();/*InitializethefreelistofOS_EVENTs*/ OS_InitTaskIdle();/*CreatetheIdleTask*/ OSInitHookEnd();/*Callportspecificinit.code*/
955.4任務調度
基于優(yōu)先級的可搶占調度時間片輪轉調度靜態(tài)調度*動態(tài)調度*靜態(tài)調度與動態(tài)調度之間的比較*96任務調度要解決的問題WHAT:按什么原則分配CPU任務調度算法HOW:如何分配CPU任務調度的時機WHEN:何時分配CPU
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度環(huán)保設備生產企業(yè)代理記賬人員設備成本保密協議
- 荷花可行性研究報告
- 皮飾整飾行業(yè)深度研究報告
- 2024-2027年中國采購管理軟件市場規(guī)模預測及投資戰(zhàn)略咨詢報告
- 2025-2030年中國能源行業(yè)市場發(fā)展分析及投資前景與投資策略研究報告
- 購買噴霧設備的申請報告
- 2025年度音樂會現場場記聘用合同
- 2025年度智能家居租賃服務合同二零二五版
- 13《寒號鳥》教學設計-2024-2025學年語文二年級上冊統編版
- 《小數除法-用計算器探索規(guī)律》教學設計-2024-2025學年五年級上冊數學人教版
- 矯形器裝配工(四級)職業(yè)技能鑒定考試題庫(含答案)
- 2025年全國100所名校高三3月起點調研考試-數學試題含解析
- 小學語文教學評一致性論文
- SF-36生活質量調查表(SF-36-含評分細則)
- 術后鎮(zhèn)痛泵的使用與護理
- GB 19522-2024車輛駕駛人員血液、呼氣酒精含量閾值與檢驗
- 2024年成都新都投資集團有限公司招聘筆試沖刺題(帶答案解析)
- 危險預知訓練表(KYT)
- 《書籍裝幀設計》 課件 項目1 走進書籍裝幀設計
- ASTM標準全部目錄(中文版)
- 《汽車電氣設備構造與維修》 第4版 課件 第3、4章 電源系統、發(fā)動機電器
評論
0/150
提交評論