




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、嵌入式系統(tǒng)(xtng)及應(yīng)用共一百五十四頁(yè)第五章任務(wù)管理(gunl)與調(diào)度共一百五十四頁(yè)主要(zhyo)內(nèi)容任務(wù)任務(wù)管理(gunl)任務(wù)調(diào)度優(yōu)先級(jí)反轉(zhuǎn)共一百五十四頁(yè)High Priority TaskLow Priority TaskTaskTaskTaskTaskTaskTaskEventEventEach TaskInfinite LoopImportanceSplitting an application into Tasks共一百五十四頁(yè)int main(void) / Initialize uCOS-II. OSInit(); / Create the first task OSTa
2、skCreate(TestTask1, (void *) 11, &TestTaskStk1TASK_STK_SIZE, 11); / Start multitasking. OSStart(); return 0;void TestTask1(void *pdata) printf(%4u: * Test Task 1 First call *n, OSTime); /Create 3 other tasks OSTaskCreate(TestTask2, (void *) 22, &TestTaskStk2TASK_STK_SIZE, 22); OSTaskCreate(TestTask3
3、, (void *) 33, &TestTaskStk3TASK_STK_SIZE, 33); OSTaskCreate(TestTask4, (void *) 10, &TestTaskStk3TASK_STK_SIZE, 10); while (1) printf(%4u: * Test Task 11 *n, OSTime); OSTimeDly(1); Task demo based on uCOS共一百五十四頁(yè)void TestTask2(void *pdata) while (1) printf(%4u: * Test Task 22 *n, OSTime); OSTimeDly(
4、1); void TestTask3(void *pdata) while (1) printf(%4u: * Test Task 33 *n, OSTime); OSTimeDly(1); void TestTask4(void *pdata) while (1) printf(%4u: + Test Task 10 +n, OSTime); OSTaskSuspend(10); /Suspend yourself 程序運(yùn)行結(jié)果(ji gu)共一百五十四頁(yè)采用多任務(wù)的好處:任務(wù)的規(guī)模較小每個(gè)任務(wù)更容易編碼(bin m)和調(diào)試,其質(zhì)量也更容易得到保證不少應(yīng)用本身就是由多個(gè)任務(wù)構(gòu)成的如一個(gè)應(yīng)用可
5、能需要進(jìn)行以下任務(wù)的處理:計(jì)算、從網(wǎng)絡(luò)獲取數(shù)據(jù)和刷新顯示屏幕采用多任務(wù)的處理方式是應(yīng)用問(wèn)題的一個(gè)非常自然的解決方式任務(wù)之間具有較高的獨(dú)立性,耦合性小通過(guò)增加新的任務(wù)就能方便的擴(kuò)充系統(tǒng)功能實(shí)時(shí)性強(qiáng)保證緊急事件得到優(yōu)先處理成為可能共一百五十四頁(yè)在嵌入式實(shí)時(shí)系統(tǒng)中任務(wù)(task)通常為進(jìn)程(process)和線程(thread)的統(tǒng)稱(chēng)任務(wù)是調(diào)度的基本單位進(jìn)程最初由Multics的設(shè)計(jì)者在60年代提出來(lái)的,主要包括以下內(nèi)容: 一個(gè)正在執(zhí)行的程序;計(jì)算機(jī)中正在運(yùn)行的程序的一個(gè)實(shí)例;可以分配給處理器,并由處理器執(zhí)行的一個(gè)實(shí)體;由一個(gè)順序的執(zhí)行線程、一個(gè)當(dāng)前狀態(tài)和一組相關(guān)(xinggun)的系統(tǒng)資源所刻畫(huà)的
6、活動(dòng)單元。共一百五十四頁(yè)進(jìn)程由代碼、數(shù)據(jù)、堆棧和進(jìn)程控制塊構(gòu)成。進(jìn)程控制塊包含了操作系統(tǒng)用來(lái)控制進(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)程作為(zuwi)操作系統(tǒng)的調(diào)度實(shí)體,是調(diào)度的基本單位。共一百五十四頁(yè)隨著操作系統(tǒng)的發(fā)展,進(jìn)程所包含的兩個(gè)方面的內(nèi)容逐漸被分開(kāi):輕量級(jí)進(jìn)程或線程:調(diào)度執(zhí)行的單位進(jìn)程:資源分配的單位線程是進(jìn)程內(nèi)部(nib)一個(gè)相對(duì)獨(dú)立的控制流,由線程上下文和需要執(zhí)行的一段程序指令構(gòu)成在進(jìn)程
7、中,所有線程共享該進(jìn)程的狀態(tài)和資源,可以訪問(wèn)相同的數(shù)據(jù)共一百五十四頁(yè)使用線程的優(yōu)勢(shì):創(chuàng)建:在一個(gè)已有進(jìn)程中創(chuàng)建一個(gè)新線程比創(chuàng)建一個(gè)全新的進(jìn)程所需的時(shí)間開(kāi)銷(xiāo)少;終止:終止一個(gè)線程比終止一個(gè)進(jìn)程所花費(fèi)的時(shí)間少;切換:線程切換比進(jìn)程切換所花費(fèi)的時(shí)間少;通信:使同一(tngy)進(jìn)程內(nèi)部不同線程之間的通信效率得到顯著提高。在大多數(shù)操作系統(tǒng)中,不同進(jìn)程之間的通信需要內(nèi)核的干預(yù),而同一進(jìn)程內(nèi)部不同線程之間則可直接通信。 共一百五十四頁(yè)引入線程的概念后,可把進(jìn)程和線程的使用分為以下幾種模型:?jiǎn)芜M(jìn)程/單線程模型(如MS-DOS):整個(gè)系統(tǒng)只有一個(gè)進(jìn)程、一個(gè)線程 單進(jìn)程/多線程模型:在單進(jìn)程/多線程模型中,整個(gè)系
8、統(tǒng)有一個(gè)進(jìn)程、多個(gè)線程 多進(jìn)程/單線程模型(如傳統(tǒng)(chuntng)的UNIX):在多進(jìn)程/單線程模型中,整個(gè)系統(tǒng)有多個(gè)進(jìn)程,每個(gè)進(jìn)程只有一個(gè)線程 多進(jìn)程/多線程模型(如Windows NT、Solaris、Mach等):在多進(jìn)程/多線程模型中,系統(tǒng)有多個(gè)進(jìn)程,每個(gè)進(jìn)程又可包含多個(gè)線程 共一百五十四頁(yè)單進(jìn)程/單線程模型單進(jìn)程/多線程模型多進(jìn)程/多線程模型多進(jìn)程/單線程模型共一百五十四頁(yè)大多數(shù)嵌入式實(shí)時(shí)內(nèi)核:?jiǎn)芜M(jìn)程(jnchng)/多線程模型,或簡(jiǎn)單地稱(chēng)為任務(wù)模型把整個(gè)應(yīng)用當(dāng)作一個(gè)沒(méi)有定義的進(jìn)程來(lái)對(duì)待;應(yīng)用則被劃分為多個(gè)任務(wù)的形式來(lái)進(jìn)行處理。適用于實(shí)時(shí)性要求較高的、相對(duì)簡(jiǎn)單的應(yīng)用也有一些嵌入式實(shí)
9、時(shí)操作系統(tǒng)采用了多進(jìn)程/多線程模型:系統(tǒng)中包含多個(gè)進(jìn)程,每個(gè)進(jìn)程對(duì)應(yīng)又包含多個(gè)線程適合于處理復(fù)雜的應(yīng)用共一百五十四頁(yè)第一節(jié)任 務(wù) 任務(wù)的定義及其主要特性任務(wù)的內(nèi)容(nirng)任務(wù)的分類(lèi)任務(wù)參數(shù)共一百五十四頁(yè)任務(wù)的定義及其主要(zhyo)特性任務(wù)是一個(gè)具有獨(dú)立功能的無(wú)限循環(huán)的程序段的一次運(yùn)行活動(dòng),是實(shí)時(shí)內(nèi)核調(diào)度的單位,具有以下特性(txng):動(dòng)態(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ù)
10、運(yùn)行情況共一百五十四頁(yè)任務(wù)(rn wu)的內(nèi)容任務(wù)(rn wu)主要包含以下內(nèi)容: 代碼:一段可執(zhí)行的程序數(shù)據(jù):程序所需要的相關(guān)數(shù)據(jù)(變量、工作空間、緩沖區(qū)等)堆棧程序執(zhí)行的上下文環(huán)境共一百五十四頁(yè)任務(wù)(rn wu)的內(nèi)容任務(wù)通常包含一個(gè)(y )具有無(wú)限循環(huán)的程序/*ioTask implements data obtaining and handling continuously*/void ioTask(void)int data; initial();/*The following sentences get data and handle data continuously*/whil
11、e(TRUE)data = getData();handleData(data);共一百五十四頁(yè) void YourTask (void *pdata) for (;) /* USER CODE */ Call one of uC/OS-IIs services: OSFlagPend(); OSMboxPend(); OSMutexPend(); OSQPend(); OSSemPend(); OSTaskDel(OS_PRIO_SELF); OSTaskSuspend(OS_PRIO_SELF); OSTimeDly(); OSTimeDlyHMSM(); /* USER CODE */
12、void YourTask (void *pdata) /* USER CODE */ OSTaskDel(OS_PRIO_SELF); 共一百五十四頁(yè)void TestTask2(void *pdata) while (1) printf(%4u: * Test Task 22 *n, OSTime); OSTimeDly(1); void TestTask3(void *pdata) while (1) printf(%4u: * Test Task 33 *n, OSTime); OSTimeDly(1); void TestTask4(void *pdata) while (1) pr
13、intf(%4u: + Test Task 10 +n, OSTime); OSTaskSuspend(10); /Suspend yourself 共一百五十四頁(yè)任務(wù)(rn wu)的內(nèi)容任務(wù)與程序的區(qū)別: 任務(wù)能真實(shí)(zhnsh)地描述工作內(nèi)容的并發(fā)性,而程序不能;程序是任務(wù)的組成部分除程序外,任務(wù)還包括數(shù)據(jù)、堆棧及其上下文環(huán)境等內(nèi)容;程序是靜態(tài)的,任務(wù)是動(dòng)態(tài)的;任務(wù)有生命周期,有誕生、有消亡,是短暫的;而程序是相對(duì)長(zhǎng)久的;一個(gè)程序可對(duì)應(yīng)多個(gè)任務(wù),反之亦然;任務(wù)具有創(chuàng)建其他任務(wù)的功能,而程序沒(méi)有。 共一百五十四頁(yè)任務(wù)(rn wu)的內(nèi)容任務(wù)上下文環(huán)境(context)包括(boku)了實(shí)時(shí)內(nèi)
14、核管理任務(wù)、以及處理器執(zhí)行任務(wù)所需要的所有信息。任務(wù)優(yōu)先級(jí)任務(wù)的狀態(tài)等實(shí)時(shí)內(nèi)核所需要的信息以及處理器的各種寄存器的內(nèi)容(hardware context):程序計(jì)數(shù)器、堆棧指針、通用寄存器等的內(nèi)容任務(wù)的上下文環(huán)境通過(guò)任務(wù)控制塊(Task Control Block,TCB)來(lái)體現(xiàn)。共一百五十四頁(yè)任務(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)(xtng)示意圖共一百五十四頁(yè)任務(wù)(rn wu)的分類(lèi)按照(nzho)到達(dá)情況的可預(yù)測(cè)性,任務(wù)可以劃分為:周期任務(wù)(periodic task)非周期任務(wù)按照重要程度,可分為:
15、關(guān)鍵任務(wù)(critical task)非關(guān)鍵任務(wù)(noncritical task)共一百五十四頁(yè)任務(wù)(rn wu)的分類(lèi)周期任務(wù)與非周期任務(wù)周期任務(wù)每隔一個(gè)固定的時(shí)間間隔就會(huì)執(zhí)行一次。舉例:飛行器可能需要每隔100ms獲得一次關(guān)于(guny)飛行器的速度、高度和姿態(tài)數(shù)據(jù),控制傳感器獲取這些數(shù)據(jù)就需要通過(guò)周期任務(wù)來(lái)進(jìn)行。非周期任務(wù)執(zhí)行的間隔時(shí)間則為不確定的。舉例:移動(dòng)通信設(shè)備中的通信任務(wù),該任務(wù)只有在需要進(jìn)行通信的情況下才會(huì)得到執(zhí)行。非周期任務(wù)分為:sporadic task:有最小到達(dá)間隔時(shí)間限制aperiodic task:沒(méi)有到達(dá)時(shí)間限制共一百五十四頁(yè)任務(wù)(rn wu)的分類(lèi)關(guān)鍵任務(wù)與非
16、關(guān)鍵任務(wù)關(guān)鍵任務(wù):為需要得到及時(shí)執(zhí)行的任務(wù),否則將出現(xiàn)災(zāi)難性的后果舉例:飛行器中用于處理生命(shngmng)支持系統(tǒng)和穩(wěn)定性控制系統(tǒng)的任務(wù)非關(guān)鍵任務(wù):如果沒(méi)有得到及時(shí)執(zhí)行,則不會(huì)產(chǎn)生嚴(yán)重后果 共一百五十四頁(yè)任務(wù)(rn wu)參數(shù)任務(wù)參數(shù):優(yōu)先級(jí)(priority)周期(period)計(jì)算(j sun)時(shí)間(computation time)就緒時(shí)間(ready time)截止時(shí)間(deadline)共一百五十四頁(yè)任務(wù)(rn wu)參數(shù)任務(wù)的優(yōu)先級(jí)表示任務(wù)對(duì)應(yīng)工作內(nèi)容在處理(chl)上的優(yōu)先程度優(yōu)先級(jí)越高,表明任務(wù)越需要得到優(yōu)先處理飛行器中處理穩(wěn)定性控制的任務(wù),就需要具有較高的優(yōu)先級(jí),一旦執(zhí)行
17、條件得到滿足,應(yīng)及時(shí)得到執(zhí)行任務(wù)的優(yōu)先級(jí)分為靜態(tài)優(yōu)先級(jí)和動(dòng)態(tài)優(yōu)先級(jí)。靜態(tài)優(yōu)先級(jí):任務(wù)的優(yōu)先級(jí)被確定后,在系統(tǒng)運(yùn)行過(guò)程中將不再發(fā)生變化;動(dòng)態(tài)優(yōu)先級(jí):系統(tǒng)運(yùn)行過(guò)程中,任務(wù)的優(yōu)先級(jí)是可以動(dòng)態(tài)變化的。 返回共一百五十四頁(yè)任務(wù)(rn wu)參數(shù)周期周期任務(wù)所具有的參數(shù),表示任務(wù)周期性執(zhí)行的間隔時(shí)間任務(wù)的計(jì)算時(shí)間任務(wù)在特定硬件環(huán)境下被完整執(zhí)行所需要的時(shí)間,也被稱(chēng)為是任務(wù)的執(zhí)行時(shí)間(execution time)。由于任務(wù)每次執(zhí)行的軟件環(huán)境的差異性,導(dǎo)致任務(wù)在各次具體執(zhí)行過(guò)程(guchng)中的計(jì)算時(shí)間各有不同。通常用最壞情況下的執(zhí)行時(shí)間(worst case time)或是需要的最長(zhǎng)執(zhí)行時(shí)間來(lái)表示,也可用
18、統(tǒng)計(jì)時(shí)間(statistical time)來(lái)表示。 返回共一百五十四頁(yè)任務(wù)(rn wu)參數(shù)任務(wù)的就緒時(shí)間任務(wù)具備了在處理器上被執(zhí)行(zhxng)所需要條件時(shí)的時(shí)間。 任務(wù)的截止時(shí)間意味著任務(wù)需要在該時(shí)間到來(lái)之前被執(zhí)行完成。截止時(shí)間可以通過(guò)絕對(duì)截止時(shí)間(absolute deadline)和相對(duì)截止時(shí)間(relative time)兩種方式來(lái)表示相對(duì)截止時(shí)間為任務(wù)的絕對(duì)截止時(shí)間減去任務(wù)的就緒時(shí)間。截止時(shí)間可以分為強(qiáng)截止時(shí)間(hard deadline)和弱截止時(shí)間(soft deadline)兩種情況:具有強(qiáng)截止時(shí)間的任務(wù)即為關(guān)鍵任務(wù),如果截止時(shí)間不能得到滿足,就會(huì)出現(xiàn)嚴(yán)重的后果。擁有關(guān)鍵任
19、務(wù)的實(shí)時(shí)系統(tǒng)又被稱(chēng)為強(qiáng)實(shí)時(shí)(hard real-time)系統(tǒng),否則稱(chēng)為弱實(shí)時(shí)(soft real-time)系統(tǒng)。 共一百五十四頁(yè)第二節(jié)任務(wù)(rn wu)管理任務(wù)狀態(tài)與變遷空閑任務(wù)任務(wù)控制(kngzh)塊任務(wù)切換任務(wù)隊(duì)列優(yōu)先級(jí)位圖算法任務(wù)管理機(jī)制共一百五十四頁(yè)任務(wù)狀態(tài)(zhungti)與變遷任務(wù)(rn wu)擁有的資源情況是不斷變化的,導(dǎo)致任務(wù)狀態(tài)也表現(xiàn)出不斷變化的特性。不同的實(shí)時(shí)內(nèi)核實(shí)現(xiàn)方式對(duì)任務(wù)狀態(tài)的定義不盡相同,但是都可以概括為三種基本的狀態(tài):等待(waiting):任務(wù)在等待某個(gè)事件的發(fā)生;就緒(ready): 任務(wù)等待獲得處理器資源;執(zhí)行(running):任務(wù)獲得處理器資源,所包
20、含的代碼內(nèi)容正在被執(zhí)行。 共一百五十四頁(yè)任務(wù)(rn wu)狀態(tài)與變遷在單處理器系統(tǒng)中:任何時(shí)候都只有一個(gè)任務(wù)在CPU中執(zhí)行如果沒(méi)有任何事情可做,就運(yùn)行空閑任務(wù)執(zhí)行空操作任何一個(gè)可以執(zhí)行的任務(wù)都必須處于就緒狀態(tài)調(diào)度程序從任務(wù)的就緒隊(duì)列中選擇(xunz)下一個(gè)需要執(zhí)行的任務(wù)。處于就緒狀態(tài)的任務(wù)擁有除CPU以外的其他所有需要的資源。任務(wù)還可能處于等待狀態(tài)如果任務(wù)在需要等待I/O設(shè)備或其他任務(wù)提供的數(shù)據(jù),而數(shù)據(jù)又還沒(méi)有到達(dá)該任務(wù)的情況下,就處于等待狀態(tài)共一百五十四頁(yè)任務(wù)(rn wu)狀態(tài)與變遷任務(wù)會(huì)在不同(b tn)的狀態(tài)之間進(jìn)行轉(zhuǎn)換,即任務(wù)狀態(tài)的變遷就緒態(tài)運(yùn)行態(tài)等待態(tài)獲得CPU被高優(yōu)先級(jí)任務(wù)搶占或超
21、時(shí)獲得資源需要資源任務(wù)狀態(tài)變遷共一百五十四頁(yè)任務(wù)1任務(wù)2任務(wù)3調(diào)度程序05101520253035404550運(yùn)行等待就緒三個(gè)任務(wù)進(jìn)行狀態(tài)轉(zhuǎn)換(zhunhun)的過(guò)程 包含三個(gè)任務(wù)和一個(gè)調(diào)度程序。調(diào)度程序用來(lái)確定下一個(gè)需要投入運(yùn)行的任務(wù),因此調(diào)度程序本身也需要占用一定的處理時(shí)間。 共一百五十四頁(yè)Task states and transition of uCOSOSMBoxPOST()OSQPost()OSQPostFront()OSSemPost()OSTASKResume()OSTimeDlyResume()OSTimeTick()OSMBoxPend()OSQPend()OSSemPen
22、d()OSTaskSuspend()OSTimeDly()OSTimeDlyHMSM()InterruptOSIntExit()OSStart()OSIntExit()OS_TASK_SW()OSTaskDel()OSTaskCreate()OSTaskCreateExt()OSTaskDel()Task is PreemptedOSTaskDel()WAITINGDORMANTREADYRUNNINGISR共一百五十四頁(yè)空閑(kngxin)任務(wù)Which is executed when none of the other tasks is ready to run. The idle ta
23、sk is always set to the lowest priority. The idle task can never be deleted by application software. Idle Task is created by OS共一百五十四頁(yè)void OS_TaskIdle (void *pdata) /* Prevent compiler warning for not using pdata */ pdata = pdata; for (;) OS_ENTER_CRITICAL(); OSIdleCtr+; OS_EXIT_CRITICAL(); /* Call
24、user definable HOOK */ OSTaskIdleHook(); Idle Task of uCOSOSIdleCtr is used by the statistics task to determine how much CPU time (in percentage) is actually being consumed by the application software. 共一百五十四頁(yè)任務(wù)(rn wu)控制塊任務(wù)管理是通過(guò)對(duì)任務(wù)控制塊(Task Control Block,TCB)的操作來(lái)實(shí)現(xiàn)的。 任務(wù)控制塊是包含任務(wù)相關(guān)信息的數(shù)據(jù)結(jié)構(gòu)包含了任務(wù)執(zhí)行過(guò)程中所需要的
25、所有信息。任務(wù)控制塊大都包括以下信息:任務(wù)的名字(mng zi)任務(wù)執(zhí)行的起始地址任務(wù)的優(yōu)先級(jí)任務(wù)的狀態(tài)任務(wù)的硬件上下文(堆棧指針、PC和寄存器等)任務(wù)的隊(duì)列指針等內(nèi)容 共一百五十四頁(yè)task nametask IDtask statustask prioritytask context(registers and flags of CPU)任務(wù)(rn wu)控制塊示意圖共一百五十四頁(yè)任務(wù)(rn wu)控制塊為節(jié)約內(nèi)存,任務(wù)數(shù)量通常需要進(jìn)行預(yù)先配置按照配置的任務(wù)數(shù)量初始化任務(wù)控制塊,一個(gè)任務(wù)對(duì)應(yīng)一個(gè)初始的任務(wù)控制塊,形成一個(gè)空閑任務(wù)控制塊鏈。在任務(wù)創(chuàng)建時(shí),實(shí)時(shí)內(nèi)核從空閑任務(wù)控制塊鏈中為任務(wù)分配
26、一個(gè)任務(wù)控制塊。隨后(suhu)對(duì)任務(wù)的操作,都是基于對(duì)應(yīng)的任務(wù)控制塊來(lái)進(jìn)行的。當(dāng)任務(wù)被刪除后,對(duì)應(yīng)的任務(wù)控制塊又會(huì)被實(shí)時(shí)內(nèi)核回收到空閑任務(wù)控制塊鏈。 共一百五十四頁(yè)typedef struct os_tcb OS_STK *OSTCBStkPtr; /* Pointer to current top of stack*/#if OS_TASK_CREATE_EXT_EN 0 void *OSTCBExtPtr; /* Pointer to user definable data for TCB extension */ OS_STK *OSTCBStkBottom; /* Pointer t
27、o bottom of stack */ INT32U OSTCBStkSize; /* Size of task stack (in number of stack elements) */ INT16U OSTCBOpt; /* Task options as passed by OSTaskCreateExt() */ INT16U OSTCBId; /* Task ID (0.65535) */#endif struct os_tcb *OSTCBNext;/* Pointer to next TCB in the TCB list */ struct os_tcb *OSTCBPre
28、v;/* Pointer to previous TCB in the TCB list*/TCB of uCOS共一百五十四頁(yè)#if (OS_Q_EN0)&(OS_MAX_QS0)|(OS_MBOX_EN0)|(OS_SEM_EN0)|(OS_MUTEX_EN0) OS_EVENT *OSTCBEventPtr; /* Pointer to event control block */#endif#if (OS_Q_EN 0) & (OS_MAX_QS 0) | (OS_MBOX_EN 0) void *OSTCBMsg; /* Message received from OSMboxPos
29、t() or OSQPost()*/#endifTCB of uCOS共一百五十四頁(yè)#if (OS_VERSION = 251) & (OS_FLAG_EN 0) & (OS_MAX_FLAGS 0)#if OS_TASK_DEL_EN 0 OS_FLAG_NODE *OSTCBFlagNode; /* Pointer to event flag node*/#endif OS_FLAGS OSTCBFlagsRdy; /* Event flags that made task ready to run*/#endif INT16U OSTCBDly; /* Nbr ticks to dela
30、y task or, timeout waiting for event*/ INT8U OSTCBStat;/* Task status */ INT8U OSTCBPrio;/* Task priority (0 = highest, 63 = lowest) */TCB of uCOS共一百五十四頁(yè)INT8U OSTCBX;/* Bit position in group corresponding to task priority (0.7)*/ INT8U OSTCBY;/* Index into ready table corresponding to task priority
31、*/ INT8U OSTCBBitX; /* Bit mask to access bit position in ready table */ INT8U OSTCBBitY; /* Bit mask to access bit position in ready group */#if OS_TASK_DEL_EN 0 BOOLEAN OSTCBDelReq; /* Indicates whether a task needs to delete itself */#endif OS_TCB;TCB of uCOS共一百五十四頁(yè)任務(wù)(rn wu)切換任務(wù)切換(context switchi
32、ng)保存當(dāng)前任務(wù)的上下文,并恢復(fù)需要(xyo)執(zhí)行的任務(wù)的上下文的過(guò)程。當(dāng)發(fā)生任務(wù)切換時(shí):當(dāng)前正在運(yùn)行的任務(wù)的上下文就需要通過(guò)該任務(wù)的任務(wù)控制塊保存起來(lái);把需要投入運(yùn)行的任務(wù)的上下文從對(duì)應(yīng)的任務(wù)控制塊中恢復(fù)出來(lái)。共一百五十四頁(yè)任務(wù)1任務(wù)2任務(wù)3調(diào)度程序05101520253035404550運(yùn)行等待就緒在時(shí)刻8即發(fā)生了任務(wù)切換,任務(wù)1的上下文需要保存到任務(wù)1的任務(wù)控制塊中去。經(jīng)過(guò)調(diào)度程序的處理,在時(shí)刻10任務(wù)2投入運(yùn)行,需要把任務(wù)2的任務(wù)控制塊中關(guān)于上下文的內(nèi)容(nirng)恢復(fù)到CPU的寄存器中。 共一百五十四頁(yè)任務(wù)(rn wu)1任務(wù)(rn wu)2實(shí)時(shí)內(nèi)核調(diào)度程序保存任務(wù)1的上下文到T
33、CB1從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í)行。 共一百五十四頁(yè)任務(wù)(rn wu)切換任務(wù)切換(qi hun)將導(dǎo)致任
34、務(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)。共一百五十四頁(yè)任務(wù)(rn wu)切換 任務(wù)切換(qi hun)基本步驟 1 保存任務(wù)上下文環(huán)境2 更新當(dāng)前運(yùn)行任務(wù)的控制塊內(nèi)容,將其狀態(tài)改為就緒或等待狀態(tài)3 將任務(wù)控制塊移到相應(yīng)隊(duì)列(就緒隊(duì)列或等待隊(duì)列)4 選擇另一個(gè)任務(wù)進(jìn)行執(zhí)行(調(diào)度)5 改變需投入運(yùn)行任務(wù)的控制塊內(nèi)容,將其狀態(tài)變?yōu)檫\(yùn)行狀態(tài)6 恢復(fù)需投入運(yùn)行任務(wù)的上下文環(huán)境共一百五十四頁(yè)任務(wù)(rn wu)切換任務(wù)切換(qi hun)時(shí)機(jī)中斷、自陷運(yùn)行任務(wù)因缺乏資源而被阻塞時(shí)間片輪轉(zhuǎn)調(diào)度時(shí)高優(yōu)先級(jí)任務(wù)處于就緒時(shí)退出共一百五十四頁(yè)任務(wù)
35、(rn wu)切換中斷、自陷如當(dāng)I/O中斷發(fā)生的時(shí)候如果I/O活動(dòng)是一個(gè)或多個(gè)任務(wù)正在等待的事件,內(nèi)核(ni h)將把相應(yīng)的處于等待狀態(tài)的任務(wù)轉(zhuǎn)換為就緒狀態(tài)同時(shí),內(nèi)核還將確定是否繼續(xù)執(zhí)行當(dāng)前處于運(yùn)行狀態(tài)的任務(wù),或是用高優(yōu)先級(jí)的就緒任務(wù)搶占該任務(wù)自陷由于執(zhí)行任務(wù)中當(dāng)前指令所引起,將導(dǎo)致實(shí)時(shí)內(nèi)核處理相應(yīng)的錯(cuò)誤或異常事件,并根據(jù)事件類(lèi)型,確定是否進(jìn)行任務(wù)的切換返回共一百五十四頁(yè)任務(wù)(rn wu)切換運(yùn)行任務(wù)因缺乏資源而被阻塞如,任務(wù)執(zhí)行過(guò)程中進(jìn)行I/O操作(cozu)時(shí)(如打開(kāi)文件),如果此前該文件已被其他任務(wù)打開(kāi),將導(dǎo)致當(dāng)前任務(wù)處于等待狀態(tài),而不能繼續(xù)執(zhí)行返回共一百五十四頁(yè)任務(wù)(rn wu)切換時(shí)
36、間片輪轉(zhuǎn)調(diào)度時(shí)內(nèi)核將在時(shí)鐘中斷處理程序中確定當(dāng)前正在運(yùn)行的任務(wù)的執(zhí)行時(shí)間是否(sh fu)已經(jīng)超過(guò)了設(shè)定的時(shí)間片;如果超過(guò)了時(shí)間片,實(shí)時(shí)內(nèi)核將停止當(dāng)前任務(wù)的運(yùn)行,把當(dāng)前任務(wù)的狀態(tài)變?yōu)榫途w狀態(tài),并把另一個(gè)任務(wù)投入運(yùn)行返回共一百五十四頁(yè)任務(wù)(rn wu)切換高優(yōu)先級(jí)任務(wù)處于就緒時(shí)如果采用基于優(yōu)先級(jí)的搶占式調(diào)度算法,將導(dǎo)致當(dāng)前任務(wù)停止(tngzh)運(yùn)行,使更高優(yōu)先級(jí)的任務(wù)處于運(yùn)行狀態(tài)共一百五十四頁(yè)void OS_Sched (void) INT8U y; OS_ENTER_CRITICAL(); if (OSIntNesting = 0) & (OSLockNesting = 0) /* Sched
37、. only if all ISRs done & not locked */ y = OSUnMapTblOSRdyGrp; /*Get pointer to HPT ready*/ OSPrioHighRdy = (INT8U)(y OSTCBStkPtr = SP; OSTCBCur = OSTCBHighRdy; SP = OSTCBHighRdy-OSTCBStkPtr; POP R4, R3, R2 and R1 from the new stack; Execute a return from interrupt instruction;OS_TASK_SW()共一百五十四頁(yè)Co
38、ntext-switch in uCOSData structures before context-switchCPULOW MEMORYHIGH MEMORYLOW MEMORYHIGH MEMORYOSTCBCurOSTCBHighRdyStack GrowthspR1R2R3R4PCPSW(1)(5)(4)(2)(3)OS_TCBOS_TCBLow Priority TaskHigh Priority TaskR3R4R2R1PCPSW共一百五十四頁(yè)Data structures after saving the context of current taskCPULOW MEMORY
39、HIGH MEMORYLOW MEMORYHIGH MEMORYOSTCBCurOSTCBHighRdyStack GrowthspR1R2R3R4PCPSW(1)(3)OS_TCBOS_TCBLow Priority TaskHigh Priority TaskPSWPCR1R2R3R4R4R3R2R1PCPSW(2)(3)共一百五十四頁(yè)CPULOW MEMORYHIGH MEMORYLOW MEMORYHIGH MEMORYOSTCBHighRdyspR1R2R3R4PCPSWOS_TCBOS_TCBLow Priority TaskHigh Priority TaskPSWPCR1R2R
40、3R4R4R3R2R1PCPSWData structures after restoring the context of high priority taskOSTCBCur(1)(2)(3)(4)(4)Stack Growth共一百五十四頁(yè)LOW MEMORYHIGH MEMORYSWSEG_taskOFF_taskAXCXDXBXSPBPSIDIESDSLOW MEMORYHIGH MEMORYSWSEG_taskOFF_taskAXCXDXBXSPBPSIDIESDSSWSSSPAXBXDXDSESSIDIBPCSIPCXOS_TCBOS_TCBOSTCBCurOSTCBHighRd
41、yOSTCBCur-OSTCBStkPtr80 x86 CPU(Real Mode)OSTCBHighRdy-OSTCBStkPtrPUSH ESPUSH DSPUSHAOS_TASK_SW() (INT 128 )POP DSPOP ESPOPAIRETStack GrowthStack Growth(1)(2)(3)(4)(1)(2)(3)(4)(5)(6) (7) (8) (9)(10)(7)(8)(9)(10)Context-switch in ucOSBased on 80X86CPU real mode共一百五十四頁(yè)_OSCtxSw PROC FAR PUSHA ; Save cu
42、rrent tasks context PUSH ES ; PUSH DS ; ; MOV AX, SEG _OSTCBCur ; Reload DS in case it was altered MOV DS, AX ; ; LES BX, DWORD PTR DS:_OSTCBCur ; OSTCBCur-OSTCBStkPtr = SS:SP MOV ES:BX+2, SS ; MOV ES:BX+0, SP ; ; CALL FAR PTR _OSTaskSwHook ; MOV AX, WORD PTR DS:_OSTCBHighRdy+2 ; OSTCBCur = OSTCBHig
43、hRdy MOV DX, WORD PTR DS:_OSTCBHighRdy ; MOV WORD PTR DS:_OSTCBCur+2, AX ; MOV WORD PTR DS:_OSTCBCur, DX ; ; MOV AL, BYTE PTR DS:_OSPrioHighRdy ; OSPrioCur = OSPrioHighRdy MOV BYTE PTR DS:_OSPrioCur, AL ; LES BX, DWORD PTR DS:_OSTCBHighRdy ; SS:SP = OSTCBHighRdy-OSTCBStkPtr MOV SS, ES:BX+2 ; MOV SP,
44、 ES:BX ; ; POP DS ; Load new tasks context POP ES ; POPA ; ; IRET ; Return to new task ;_OSCtxSw ENDPContext-switch under 80 x86共一百五十四頁(yè)任務(wù)調(diào)度及上下文切換(qi hun)時(shí)間 保 存 調(diào) 度 恢 復(fù) 保存當(dāng)前運(yùn)行任務(wù)(rn wu)上下文的時(shí)間選擇下一個(gè)任務(wù)的調(diào)度時(shí)間將要運(yùn)行任務(wù)的上下文的恢復(fù)時(shí)間取決于任務(wù)上下文的定義和處理器的速度。不同種類(lèi)的處理器,任務(wù)上下文的定義不同,其內(nèi)容有多有少。 任務(wù)上下文切換的時(shí)間與調(diào)度(即選擇下一個(gè)運(yùn)行任務(wù))的過(guò)程有關(guān)。強(qiáng)實(shí)時(shí)內(nèi)核
45、要求調(diào)度過(guò)程所花費(fèi)的時(shí)間是確定的,即不能隨系統(tǒng)中就緒任務(wù)的數(shù)目而變化。與具體實(shí)現(xiàn)調(diào)度算法時(shí)所采用的數(shù)據(jù)結(jié)構(gòu)有關(guān)。共一百五十四頁(yè)任務(wù)(rn wu)隊(duì)列任務(wù)(rn wu)隊(duì)列通過(guò)任務(wù)(rn wu)控制塊實(shí)現(xiàn)對(duì)系統(tǒng)中所有任務(wù)(rn wu)的管理。新任務(wù)CPU就緒隊(duì)列等待隊(duì)列超時(shí)調(diào)度等待資源獲得資源釋放CPU單就緒隊(duì)列和單等待隊(duì)列共一百五十四頁(yè)任務(wù)(rn wu)隊(duì)列隊(duì)列由任務(wù)(rn wu)控制塊構(gòu)成 task nametask IDtask statustask prioritytask contexttask nametask IDtask statustask prioritytask conte
46、xttask nametask IDtask statustask prioritytask contextHead隊(duì)列TCB1TCB2TCBnNULL任務(wù)隊(duì)列共一百五十四頁(yè)任務(wù)(rn wu)隊(duì)列單等待隊(duì)列資源對(duì)應(yīng)的事件發(fā)生時(shí),實(shí)時(shí)內(nèi)核需要掃描整個(gè)等待隊(duì)列,搜索等待該資源的任務(wù),并按照一定的策略選取任務(wù),把任務(wù)的任務(wù)控制塊放置到就緒隊(duì)列。如果系統(tǒng)(xtng)的資源和任務(wù)比較多,搜索等待該資源的任務(wù)所需要的時(shí)間就比較長(zhǎng),會(huì)影響整個(gè)系統(tǒng)(xtng)的實(shí)時(shí)性??刹捎靡环N多等待隊(duì)列的處理方式資源對(duì)應(yīng)的事件發(fā)生時(shí),能夠在較短的時(shí)間內(nèi)確立等待該資源的任務(wù)等待隊(duì)列。 共一百五十四頁(yè)新任務(wù)CPU就緒隊(duì)列資源1
47、等待隊(duì)列超時(shí)調(diào)度等待資源1獲得資源1釋放CPU資源2等待隊(duì)列等待資源2獲得資源2資源n等待隊(duì)列等待資源n獲得資源n單就緒隊(duì)列(duli)和多等待隊(duì)列(duli)共一百五十四頁(yè)任務(wù)(rn wu)隊(duì)列對(duì)于就緒任務(wù),如果采用上述隊(duì)列方式進(jìn)行管理,在基于優(yōu)先級(jí)的調(diào)度處理中,要獲得當(dāng)前(dngqin)具有最高優(yōu)先級(jí)的就緒任務(wù):方式一:任務(wù)就緒時(shí),把就緒任務(wù)的任務(wù)控制塊放在就緒隊(duì)列的末尾。調(diào)度程序需要從就緒隊(duì)列的頭部到尾部進(jìn)行一次遍歷,才能獲得就緒隊(duì)列中具有最高優(yōu)先級(jí)的任務(wù);方式二:就緒隊(duì)列按照優(yōu)先級(jí)從高到低的順序排列。新的就緒任務(wù)到達(dá)時(shí),需要插入到就緒隊(duì)列的合適位置,確保就緒隊(duì)列保持優(yōu)先級(jí)從高到低排列的
48、順序性。共一百五十四頁(yè)任務(wù)(rn wu)隊(duì)列在這兩種處理方式中,所花費(fèi)的時(shí)間與任務(wù)(rn wu)數(shù)量有密切的關(guān)系,具有不確定性。為提高實(shí)時(shí)內(nèi)核的確定性,可采用一種被稱(chēng)為優(yōu)先級(jí)位圖的就緒任務(wù)處理算法。 共一百五十四頁(yè)Free TCBs after OS_TCBInit() in uCOS共一百五十四頁(yè)優(yōu)先級(jí)位圖算法(sun f) OSRdyGrp: 優(yōu)先級(jí)就緒(jix)組OSRdyTbl: 優(yōu)先級(jí)就緒表35: 00100011char OSRdyGrp;char OSRdyTbl8;共一百五十四頁(yè)下標(biāo)二進(jìn)制值00000000110000001020000010030000100040001000
49、0500100000601000000710000000優(yōu)先級(jí)映射(yngsh)表OSMapTblchar OSMapTbl8 = 0 x01, 0 x02, 0 x04, 0 x08, 0 x10, 0 x20, 0 x40, 0 x80;OSMapTbl的數(shù)組元素的下標(biāo)與任務(wù)優(yōu)先級(jí)的高三位或低三位相對(duì)應(yīng)。 OSMapTbl的數(shù)組元素對(duì)應(yīng)的二進(jìn)制值中,位為1的位表示(biosh)OSRdyGrp或是OSRdyTbl的對(duì)應(yīng)位也為1。35: 00100011共一百五十四頁(yè)INT8U const OSUnMapTbl = 0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2,
50、 0, 1, 0,4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,4, 0, 1,
51、0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,4, 0, 1, 0, 2, 0, 1, 0, 3,
52、0, 1, 0, 2, 0, 1, 0,5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,/* 0 x00 to 0 x0F */* 0 x00 to 0 x1F */* 0 x00 to 0 x6F */* 0 x00 to 0 x7F */* 0 x00 to 0 x8F */* 0 x00 to 0 x9F */* 0 x00 to 0 xAF */* 0 x00 to 0 xBF */* 0 x00 to 0 xCF */* 0 x00 to 0 x
53、DF */* 0 x00 to 0 xEF */* 0 x00 to 0 x2F */* 0 x00 to 0 x3F */* 0 x00 to 0 x4F */ /* 0 x00 to 0 x5F */* 0 x00 to 0 xFF */OSRdyTbl3 contains 0 xE4OSRdyGrp contains 0 x68;3 = OSUnMapTbl 0 x68 ;2 = OSUnMapTbl 0 xE4 ;26 = (3 3;OSRdyTblpriority 3 |= OSMapTblpriority & 0 x07;35: 00100 011OSRdyGrp765432107
54、654321015141312111098232221201918171631302928272625243938373635343332474645544342414055545352515049486362616059585756OSRdyTblOSRdyTbl0OSRdyTbl1OSRdyTbl2OSRdyTbl3OSRdyTbl4OSRdyTbl5OSRdyTbl6OSRdyTbl70001000000001000共一百五十四頁(yè)任務(wù)退出(tuch)就緒態(tài) if(OSRdyTblpriority 3 &= OSMapTblpriority & 0 x07) = = 0)OSRdyGrp
55、&= OSMapTblpriority 3; 35: 00100 011OSRdyGrp765432101514131211109823222120191817163130292827262524393837363534333247464554434241405554535251504948636261605958575676543210OSRdyTbl 00001000-11110111 00010000-11101111OSRdyTbl0OSRdyTbl1OSRdyTbl2OSRdyTbl3OSRdyTbl4OSRdyTbl5OSRdyTbl6OSRdyTbl7共一百五十四頁(yè)獲取(huq)
56、進(jìn)入就緒態(tài)的最高優(yōu)先級(jí) high3Bit = OSUnMapTblOSRdyGrp;low3Bit = OSUnMapTblOSRdyTblhigh3Bit; priority = (high3Bit 4/high3Bit 0 x88-3/low3BitOSRdyTbl0OSRdyTbl1OSRdyTbl2OSRdyTbl3OSRdyTbl4OSRdyTbl5OSRdyTbl6OSRdyTbl7共一百五十四頁(yè)任務(wù)(rn wu)管理機(jī)制任務(wù)管理用來(lái)實(shí)現(xiàn)對(duì)任務(wù)狀態(tài)的直接控制和訪問(wèn)。內(nèi)核的任務(wù)管理是通過(guò)系統(tǒng)調(diào)用來(lái)體現(xiàn),主要包括(boku)任務(wù)創(chuàng)建、任務(wù)刪除、任務(wù)掛起、任務(wù)喚醒、設(shè)置任務(wù)屬性等內(nèi)容 。
57、創(chuàng)建任務(wù)刪除任務(wù)掛起任務(wù)喚醒任務(wù)設(shè)置任務(wù)屬性改變?nèi)蝿?wù)優(yōu)先級(jí)獲取任務(wù)信息任務(wù)管理功能共一百五十四頁(yè)任務(wù)(rn wu)管理機(jī)制創(chuàng)建任務(wù)的過(guò)程即為分配任務(wù)控制塊的過(guò)程。在創(chuàng)建任務(wù)時(shí),通常需要確定任務(wù)的名字和任務(wù)的優(yōu)先級(jí)等內(nèi)容,確立(qul)任務(wù)所能使用的堆棧區(qū)域。任務(wù)創(chuàng)建成功后,通常會(huì)為用戶返回一個(gè)標(biāo)識(shí)該任務(wù)的ID,以實(shí)現(xiàn)對(duì)任務(wù)的引用管理。刪除任務(wù)把任務(wù)從系統(tǒng)中去掉,釋放對(duì)應(yīng)的任務(wù)控制塊。掛起/喚醒任務(wù)把任務(wù)變?yōu)榈却隣顟B(tài),可通過(guò)喚醒任務(wù)操作把任務(wù)轉(zhuǎn)換為就緒狀態(tài)。共一百五十四頁(yè)任務(wù)(rn wu)管理機(jī)制設(shè)置任務(wù)屬性可以用來(lái)設(shè)置任務(wù)的搶占、時(shí)間片等特性,以確定是否允許(ynx)任務(wù)在執(zhí)行過(guò)程中被搶占或是
58、對(duì)同優(yōu)先級(jí)任務(wù)采用時(shí)間片輪轉(zhuǎn)方式運(yùn)行等。改變?nèi)蝿?wù)優(yōu)先級(jí)用來(lái)根據(jù)需要改變?nèi)蝿?wù)的當(dāng)前優(yōu)先級(jí)。獲取任務(wù)信息獲得任務(wù)的當(dāng)前優(yōu)先級(jí)、任務(wù)的屬性、任務(wù)的名字、任務(wù)的上下文、任務(wù)的狀態(tài)等內(nèi)容,便于用戶進(jìn)行決策。共一百五十四頁(yè)創(chuàng)建(chungjin)任務(wù)任務(wù)創(chuàng)建為任務(wù)分配和初始化相關(guān)的數(shù)據(jù)結(jié)構(gòu)。任務(wù)創(chuàng)建時(shí)通常需要使用如下信息:任務(wù)的名字任務(wù)的初始優(yōu)先級(jí)任務(wù)棧任務(wù)屬性任務(wù)對(duì)應(yīng)的函數(shù)入口(r ku)地址任務(wù)對(duì)應(yīng)函數(shù)的參數(shù)任務(wù)刪除時(shí)的回調(diào)函數(shù) 共一百五十四頁(yè)創(chuàng)建(chungjin)任務(wù)??臻g:由于不同任務(wù)運(yùn)行時(shí)需要的的大小不同,由內(nèi)核進(jìn)行任務(wù)棧的分配就不能適應(yīng)應(yīng)用任務(wù)的多樣性需求。通常由用戶指定任務(wù)運(yùn)行過(guò)程中需要使
59、用的??臻g。確定任務(wù)到底需要多少??臻g是一個(gè)比較困難的事情。大都需要進(jìn)行一個(gè)反復(fù)修正的過(guò)程:在最開(kāi)始的時(shí)候(sh hou),根據(jù)應(yīng)用的類(lèi)型,為任務(wù)分配一個(gè)比預(yù)期估計(jì)更大的??臻g;使用棧檢測(cè)函數(shù),定期監(jiān)控任務(wù)對(duì)棧的使用情況,并據(jù)此對(duì)任務(wù)棧的大小進(jìn)行調(diào)整。共一百五十四頁(yè)創(chuàng)建(chungjin)任務(wù)任務(wù)可以包含多種屬性任務(wù)是否可被搶占是否采用時(shí)間片輪轉(zhuǎn)調(diào)度方式調(diào)度是否響應(yīng)異步信號(hào)任務(wù)中開(kāi)放的中斷級(jí)別是否使用數(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ù)(huf)數(shù)字協(xié)處理器的上下文內(nèi)容。任務(wù)對(duì)應(yīng)函數(shù)的入口地址表示所創(chuàng)建任務(wù)起始執(zhí)行
60、的入口共一百五十四頁(yè)創(chuàng)建(chungjin)任務(wù)任務(wù)創(chuàng)建通常需要完成以下工作:獲得任務(wù)控制塊TCB根據(jù)實(shí)時(shí)內(nèi)核用戶提供的信息初始化TCB為任務(wù)分配一個(gè)可以唯一標(biāo)識(shí)任務(wù)的ID使任務(wù)處于就緒狀態(tài),把任務(wù)放置到就緒隊(duì)列(duli)進(jìn)行任務(wù)調(diào)度處理共一百五十四頁(yè)INT8U OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio) OS_STK *psp; INT8U err; OS_ENTER_CRITICAL(); if (OSTCBPrioTblprio = (OS_TCB *)0) /* Make s
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 開(kāi)展團(tuán)建活動(dòng)增強(qiáng)團(tuán)隊(duì)凝聚力計(jì)劃
- 情況分析在管理中的重要性計(jì)劃
- 前臺(tái)文員如何進(jìn)行自我提升計(jì)劃
- II型腎小管性酸中毒的臨床護(hù)理
- 鹽城師范學(xué)院《水聲測(cè)量技術(shù)》2023-2024學(xué)年第二學(xué)期期末試卷
- 師生關(guān)系與學(xué)習(xí)共同體建設(shè)計(jì)劃
- 鹽城市阜寧縣2025屆四下數(shù)學(xué)期末質(zhì)量檢測(cè)模擬試題含解析
- 2025年湖南貨運(yùn)從業(yè)資格證考試試題及答案大全解析
- 2025年達(dá)州貨運(yùn)上崗證模擬考試題
- 新質(zhì)生產(chǎn)力本質(zhì)是什么生產(chǎn)力
- 2025屆福建省多地市聯(lián)考高三下學(xué)期二模物理試題(原卷版+解析版)
- 2025年傳染病護(hù)理
- 2025年上半年池州市園林局招考專(zhuān)業(yè)技術(shù)人員易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 武漢市2025屆高中畢業(yè)生四月調(diào)研考試 試卷與解析
- 第18課《井岡翠竹》 課件
- 質(zhì)量信譽(yù)考核自評(píng)報(bào)告3篇
- 胃腸炎護(hù)理教學(xué)查房
- 護(hù)士站管理制度
- 藥物服用指導(dǎo)與患者教育試題及答案
- 2025新外研社版英語(yǔ)七年級(jí)下單詞默寫(xiě)表
- 大部分分校:地域文化形考任務(wù)二-國(guó)開(kāi)(CQ)-國(guó)開(kāi)期末復(fù)習(xí)資料
評(píng)論
0/150
提交評(píng)論