ucosii實時操作系統(tǒng)分析-任務(wù)管理及調(diào)度_第1頁
ucosii實時操作系統(tǒng)分析-任務(wù)管理及調(diào)度_第2頁
ucosii實時操作系統(tǒng)分析-任務(wù)管理及調(diào)度_第3頁
ucosii實時操作系統(tǒng)分析-任務(wù)管理及調(diào)度_第4頁
ucosii實時操作系統(tǒng)分析-任務(wù)管理及調(diào)度_第5頁
已閱讀5頁,還剩32頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、1C/OS-IIC/OS-II操作系統(tǒng)中進(jìn)程調(diào)操作系統(tǒng)中進(jìn)程調(diào)度模塊分析度模塊分析2背背 景景 1 1、課程任務(wù):、課程任務(wù): 分析分析C/OS-IIC/OS-II操作系統(tǒng)中的進(jìn)程調(diào)度模塊的源代碼操作系統(tǒng)中的進(jìn)程調(diào)度模塊的源代碼2 2、任務(wù)說明:結(jié)合課堂上講授的進(jìn)程的定義、進(jìn)程控制塊、進(jìn)、任務(wù)說明:結(jié)合課堂上講授的進(jìn)程的定義、進(jìn)程控制塊、進(jìn)程的創(chuàng)建以及處理機(jī)調(diào)度算法等知識點,分析程的創(chuàng)建以及處理機(jī)調(diào)度算法等知識點,分析C/OS-IIC/OS-II操作操作系統(tǒng)中的進(jìn)程調(diào)度模塊的源碼實現(xiàn)。進(jìn)而理解進(jìn)程控制塊的結(jié)系統(tǒng)中的進(jìn)程調(diào)度模塊的源碼實現(xiàn)。進(jìn)而理解進(jìn)程控制塊的結(jié)構(gòu),理解進(jìn)程運行的并發(fā)性,掌握進(jìn)程

2、調(diào)度的方法。構(gòu),理解進(jìn)程運行的并發(fā)性,掌握進(jìn)程調(diào)度的方法。3 3、任務(wù)要求:、任務(wù)要求:(1 1)熟悉相關(guān)的理論知識;)熟悉相關(guān)的理論知識;(2 2)分析)分析C/OS-IIC/OS-II操作系統(tǒng)中的進(jìn)程調(diào)度模塊的代碼實現(xiàn),并操作系統(tǒng)中的進(jìn)程調(diào)度模塊的代碼實現(xiàn),并輔以圖表的形式描述實現(xiàn)流程;輔以圖表的形式描述實現(xiàn)流程;(3 3)對核心代碼作注釋說明。)對核心代碼作注釋說明。(4 4)按照模板撰寫分析報告,以小組為單位參加答辯。)按照模板撰寫分析報告,以小組為單位參加答辯。31、uC/OS的任務(wù)控制塊的任務(wù)控制塊-0.8 ( 2.3 ) 2、任務(wù)就緒表的結(jié)構(gòu)、任務(wù)就緒表的結(jié)構(gòu)-0.9 (2.4.

3、1)3、對任務(wù)就緒表的操作(將就緒任務(wù)狀態(tài)填入就緒表)、對任務(wù)就緒表的操作(將就緒任務(wù)狀態(tài)填入就緒表)-0.9 (2.4.2)4、根據(jù)就緒表確定最高優(yōu)先級(采用查表法確定高優(yōu)先級任務(wù))、根據(jù)就緒表確定最高優(yōu)先級(采用查表法確定高優(yōu)先級任務(wù))-1 ( 2.4.2)5、任務(wù)調(diào)度器實現(xiàn)流程圖表述、任務(wù)調(diào)度器實現(xiàn)流程圖表述-1 (2.4.3)6、任務(wù)調(diào)度器實現(xiàn)及源代碼分析、任務(wù)調(diào)度器實現(xiàn)及源代碼分析-1 (2.4.3 )7、任務(wù)切換的過程描述、任務(wù)切換的過程描述-0.8(可選)(可選) (2.4.3 )8、用戶任務(wù)的實現(xiàn)(編寫一個示例程序驗證調(diào)度算法)、用戶任務(wù)的實現(xiàn)(編寫一個示例程序驗證調(diào)度算法)-

4、1 (例(例2-7)9、任務(wù)狀態(tài)切換(掛起和恢復(fù)任務(wù))示例程序演示、任務(wù)狀態(tài)切換(掛起和恢復(fù)任務(wù))示例程序演示-0.9(可選)(可選) (例(例2-8)10、用信號量實現(xiàn)任務(wù)間同步和互斥示例程序演示、用信號量實現(xiàn)任務(wù)間同步和互斥示例程序演示-0.9(可選)(可選) (例(例4-4,例,例4-5)11、用消息郵箱實現(xiàn)任務(wù)間通信示例程序演示、用消息郵箱實現(xiàn)任務(wù)間通信示例程序演示-0.9(可選)(例(可選)(例4-8)任任 務(wù)務(wù) 4實時操作系統(tǒng)實時操作系統(tǒng)C/OS-II C/OS-II概述概述任務(wù)概念任務(wù)概念任務(wù)調(diào)度核心問題分析任務(wù)調(diào)度核心問題分析5C/OS簡介l美國人美國人Jean Labross

5、e 1992Jean Labrosse 1992年完成年完成l應(yīng)用面覆蓋了諸多領(lǐng)域,如照相機(jī)、醫(yī)療器械、音應(yīng)用面覆蓋了諸多領(lǐng)域,如照相機(jī)、醫(yī)療器械、音響設(shè)備、發(fā)動機(jī)控制、高速公路電話系統(tǒng)、自動提響設(shè)備、發(fā)動機(jī)控制、高速公路電話系統(tǒng)、自動提款機(jī)等款機(jī)等 l19981998年年 C/OSC/OS-II-II,目前的版本,目前的版本 C/OSC/OS -II V2.61 -II V2.61,2.722.72l20002000年,得到美國航空管理局(年,得到美國航空管理局(FAAFAA)的認(rèn)證,可)的認(rèn)證,可以用于飛行器中以用于飛行器中l(wèi)網(wǎng)站網(wǎng)站www.ucos-II.comwww.ucos-II.c

6、om()6數(shù)數(shù) 據(jù)據(jù) 類類 型型typedef unsigned char INT8U;typedef signed char INT8S;typedef unsigned int INT16U;typedef signed int INT16S;typedef unsigned long INT32U;typedef signed long INT32S;typedef float FP32;typedef double FP64;7實時操作系統(tǒng)實時操作系統(tǒng)C/OS-II C/OS-II概述概述任務(wù)概念任務(wù)概念任務(wù)調(diào)度核心問題分析任務(wù)調(diào)度核心問題分析8任務(wù)調(diào)度概念任務(wù)調(diào)度概念l任務(wù)控制塊任務(wù)

7、控制塊l任務(wù)代碼結(jié)構(gòu)任務(wù)代碼結(jié)構(gòu)l任務(wù)優(yōu)先級任務(wù)優(yōu)先級l一個任務(wù)的實現(xiàn)一個任務(wù)的實現(xiàn)9任務(wù)控制塊任務(wù)控制塊TCBTCBq一旦任務(wù)建立,一個任務(wù)控制塊一旦任務(wù)建立,一個任務(wù)控制塊OS_TCBOS_TCB就被賦值。就被賦值。q任務(wù)控制塊是一個數(shù)據(jù)結(jié)構(gòu),保存該任務(wù)的相關(guān)參數(shù),包括任務(wù)任務(wù)控制塊是一個數(shù)據(jù)結(jié)構(gòu),保存該任務(wù)的相關(guān)參數(shù),包括任務(wù)堆棧指針,任務(wù)的當(dāng)前狀態(tài),任務(wù)的優(yōu)先級等。堆棧指針,任務(wù)的當(dāng)前狀態(tài),任務(wù)的優(yōu)先級等。q任務(wù)任務(wù)CPUCPU使用權(quán)被剝奪時,使用權(quán)被剝奪時,TCBTCB保存該時刻任務(wù)狀態(tài);任務(wù)重新得保存該時刻任務(wù)狀態(tài);任務(wù)重新得到到CPUCPU控制權(quán)時,控制權(quán)時,TCBTCB確保任務(wù)

8、從當(dāng)時被中斷的那一點絲毫不差地確保任務(wù)從當(dāng)時被中斷的那一點絲毫不差地繼續(xù)執(zhí)行。繼續(xù)執(zhí)行。qOS_TCBOS_TCB全部駐留在全部駐留在RAMRAM中。中。任務(wù)控制塊就相當(dāng)于一個任務(wù)的身份證,沒有任務(wù)控制塊的任務(wù)是不能被系統(tǒng)承認(rèn)和管理的。 PCB:標(biāo)識符、父進(jìn)程標(biāo)識符、:標(biāo)識符、父進(jìn)程標(biāo)識符、程序計數(shù)器、棧指針、程序計數(shù)器、棧指針、進(jìn)程狀態(tài)、優(yōu)先級進(jìn)程狀態(tài)、優(yōu)先級10任務(wù)控制塊任務(wù)控制塊TCB TCB uCOS_II.H 第第370行行typedef struct os_tcb OS_STK *OSTCBStkPtr; /指向任務(wù)堆棧棧頂?shù)闹羔樦赶蛉蝿?wù)堆棧棧頂?shù)闹羔?struct os_tcb

9、*OSTCBNext; /指向后一個任務(wù)控制塊的指針指向后一個任務(wù)控制塊的指針 struct os_tcb *OSTCBPrev; /指向前一個任務(wù)控制塊的指針指向前一個任務(wù)控制塊的指針 INT16U OSTCBDly; /任務(wù)等待的時限(節(jié)拍數(shù))任務(wù)等待的時限(節(jié)拍數(shù)) INT8U OSTCBStat;/任務(wù)的當(dāng)前狀態(tài)標(biāo)志任務(wù)的當(dāng)前狀態(tài)標(biāo)志 INT8U OSTCBPrio; /任務(wù)的優(yōu)先級別任務(wù)的優(yōu)先級別 OS_TCB; 11任務(wù)控制塊鏈表任務(wù)控制塊鏈表空任務(wù)塊鏈表空任務(wù)塊鏈表OSTCBNextOSTCBPrevOSTCBPrioOSTCBNextOSTCBPrevOSTCBPrioOSTC

10、BNextOSTCBPrevOSTCBPrioOSTCBNextOSTCBPrevOSTCBPrioOSTCBTbl0OSTCBTbl0OSTCBTbl1OSTCBTbl1OSTCBTblOS_MAX_TASKS+OS_N_SYS_TASK_-2OSTCBTblOS_MAX_TASKS+OS_N_SYS_TASK_-2OSTCBTblOS_MAX_TASKS+OS_N_SYS_TASK_-1OSTCBTblOS_MAX_TASKS+OS_N_SYS_TASK_-1OSTCBFreeListOSTCBFreeList系統(tǒng)在調(diào)用函數(shù)系統(tǒng)在調(diào)用函數(shù)OSInit()OSInit()對對uC/OS-II

11、uC/OS-II系統(tǒng)進(jìn)行初始化時,先在系統(tǒng)進(jìn)行初始化時,先在RAMRAM中中建立一個建立一個OS_TCBOS_TCB結(jié)構(gòu)類型的數(shù)組結(jié)構(gòu)類型的數(shù)組OSTCBTbl ,OSTCBTbl ,每個數(shù)組元素就是一每個數(shù)組元素就是一個任務(wù)控制塊,然后把這些控制塊鏈接成一個如圖所示的鏈表。由個任務(wù)控制塊,然后把這些控制塊鏈接成一個如圖所示的鏈表。由于鏈表中的這些控制塊還沒有與具體任務(wù)相關(guān)聯(lián),因此這個鏈表叫于鏈表中的這些控制塊還沒有與具體任務(wù)相關(guān)聯(lián),因此這個鏈表叫做空任務(wù)塊鏈表。做空任務(wù)塊鏈表。每當(dāng)應(yīng)用程序調(diào)用系統(tǒng)函數(shù)每當(dāng)應(yīng)用程序調(diào)用系統(tǒng)函數(shù)OSTaskCreate()OSTaskCreate()創(chuàng)建一個任務(wù)

12、時,系統(tǒng)創(chuàng)建一個任務(wù)時,系統(tǒng)就會將任務(wù)控制塊鏈表頭指針就會將任務(wù)控制塊鏈表頭指針OSTCBFreeListOSTCBFreeList指向的任務(wù)控制塊分配指向的任務(wù)控制塊分配給該任務(wù)。在給任務(wù)控制塊中的各成員賦值后,就按任務(wù)控制塊鏈給該任務(wù)。在給任務(wù)控制塊中的各成員賦值后,就按任務(wù)控制塊鏈表的頭指針表的頭指針OSTCBListOSTCBList將其加入到任務(wù)控制塊鏈表中。將其加入到任務(wù)控制塊鏈表中。12uC/OSuC/OS的任務(wù)的任務(wù)uC/OS-IIuC/OS-II的任務(wù)有兩種:用戶任務(wù)和系統(tǒng)任務(wù)。由應(yīng)用程序設(shè)的任務(wù)有兩種:用戶任務(wù)和系統(tǒng)任務(wù)。由應(yīng)用程序設(shè)計者編寫的任務(wù)叫做用戶任務(wù),由系統(tǒng)提供的

13、任務(wù)叫做系統(tǒng)任計者編寫的任務(wù)叫做用戶任務(wù),由系統(tǒng)提供的任務(wù)叫做系統(tǒng)任務(wù)。用戶任務(wù)是為解決應(yīng)用問題而編寫的,系統(tǒng)任務(wù)是為應(yīng)用務(wù)。用戶任務(wù)是為解決應(yīng)用問題而編寫的,系統(tǒng)任務(wù)是為應(yīng)用程序來提供某種服務(wù)的。程序來提供某種服務(wù)的。目前,目前,uC/OS-II最多可以對最多可以對64個任務(wù)(包括用戶任務(wù)和系統(tǒng)任個任務(wù)(包括用戶任務(wù)和系統(tǒng)任務(wù))進(jìn)行管理。務(wù))進(jìn)行管理。13空閑任務(wù)和統(tǒng)計任務(wù)空閑任務(wù)和統(tǒng)計任務(wù)l內(nèi)核總是創(chuàng)建一個內(nèi)核總是創(chuàng)建一個空閑任務(wù)空閑任務(wù)OSTaskIdle()OSTaskIdle();w總是設(shè)置為最低優(yōu)先級,總是設(shè)置為最低優(yōu)先級,OS_LOWEST_PRIOROS_LOWEST_PRIO

14、R;w當(dāng)所有其他任務(wù)都未在執(zhí)行時,空閑任務(wù)開始當(dāng)所有其他任務(wù)都未在執(zhí)行時,空閑任務(wù)開始執(zhí)行;執(zhí)行;w應(yīng)用程序不能刪除該任務(wù);應(yīng)用程序不能刪除該任務(wù);w空閑任務(wù)的工作就是把空閑任務(wù)的工作就是把3232位計數(shù)器位計數(shù)器OSIdleCtrOSIdleCtr加加1 1,該計數(shù)器被統(tǒng)計任務(wù)所使用;,該計數(shù)器被統(tǒng)計任務(wù)所使用;l統(tǒng)計任務(wù)統(tǒng)計任務(wù)OSTaskStat()OSTaskStat(),提供運行時間統(tǒng)計。每,提供運行時間統(tǒng)計。每秒鐘運行一次,計算當(dāng)前的秒鐘運行一次,計算當(dāng)前的CPUCPU利用率。其優(yōu)先級利用率。其優(yōu)先級是是OS_LOWEST_PRIOR-1OS_LOWEST_PRIOR-1,可選。,

15、可選。14任務(wù)的優(yōu)先級任務(wù)的優(yōu)先級q uC/OS-II分為分為64個優(yōu)先級別,每一個級別都用一個數(shù)字個優(yōu)先級別,每一個級別都用一個數(shù)字表示。表示。 數(shù)字?jǐn)?shù)字0的級別最高,數(shù)字越大優(yōu)先級別越低。的級別最高,數(shù)字越大優(yōu)先級別越低。q 通常,一個應(yīng)用程序的任務(wù)數(shù)小于通常,一個應(yīng)用程序的任務(wù)數(shù)小于64,用戶可根據(jù)應(yīng)用,用戶可根據(jù)應(yīng)用程序的需要,在程序的需要,在OS_CFG.H中設(shè)置中設(shè)置OS_LOWEST_PRIO,即定義了可供使用的優(yōu)先級別共即定義了可供使用的優(yōu)先級別共OS_LOWEST_PRIO +1個。個。q 固定地,系統(tǒng)總是把最低優(yōu)先級別自動賦給空閑任務(wù),固定地,系統(tǒng)總是把最低優(yōu)先級別自動賦給

16、空閑任務(wù),如果系統(tǒng)中還有統(tǒng)計任務(wù),則其優(yōu)先級別為如果系統(tǒng)中還有統(tǒng)計任務(wù),則其優(yōu)先級別為OS_LOWEST_PRIO -1。任務(wù)的優(yōu)先級同樣也是它的標(biāo)識號任務(wù)的優(yōu)先級同樣也是它的標(biāo)識號ID。問題問題1:如果創(chuàng)建如果創(chuàng)建2個相同優(yōu)先級的任務(wù)會怎么執(zhí)行?個相同優(yōu)先級的任務(wù)會怎么執(zhí)行?15任務(wù)的實現(xiàn)任務(wù)的實現(xiàn)創(chuàng)建任務(wù)的系統(tǒng)服務(wù)創(chuàng)建任務(wù)的系統(tǒng)服務(wù)lOSTaskCreate()INT8U OSTaskCreate (void (*task)(void *pd), /任務(wù)代碼指針任務(wù)代碼指針 void *pdata, /任務(wù)參數(shù)指針任務(wù)參數(shù)指針OS_STK *ptos, /任務(wù)棧的棧頂指針任務(wù)棧的棧頂指針

17、INT8U prio /任務(wù)的優(yōu)先級任務(wù)的優(yōu)先級);16用戶任務(wù)代碼的一用戶任務(wù)代碼的一般結(jié)構(gòu)般結(jié)構(gòu)void MyTask(void void MyTask(void * *pdata)pdata) for ( ; ; ) for ( ; ; ) 可以被中斷的任務(wù)代碼;可以被中斷的任務(wù)代碼;OS_ENTER_CRITICAL();OS_ENTER_CRITICAL(); /進(jìn)入臨界段進(jìn)入臨界段(關(guān)中斷)(關(guān)中斷) 不可以被中斷不可以被中斷的任務(wù)代碼;的任務(wù)代碼;OS_EXIT_CRITICAL();OS_EXIT_CRITICAL();/退出臨界段退出臨界段 ( (開中斷開中斷) ) 可以被中

18、斷的任務(wù)代碼;可以被中斷的任務(wù)代碼; OSTimeDly(10);OSTimeDly(10); 根據(jù)嵌入式系統(tǒng)任務(wù)的工作特點,任務(wù)的執(zhí)根據(jù)嵌入式系統(tǒng)任務(wù)的工作特點,任務(wù)的執(zhí)行代碼通常是一個無限循環(huán)結(jié)構(gòu),并且在這行代碼通常是一個無限循環(huán)結(jié)構(gòu),并且在這個循環(huán)中可以響應(yīng)中斷,這種結(jié)構(gòu)也叫超循個循環(huán)中可以響應(yīng)中斷,這種結(jié)構(gòu)也叫超循環(huán)結(jié)構(gòu)。環(huán)結(jié)構(gòu)。為了有效的對中斷進(jìn)行控制,在任務(wù)的代為了有效的對中斷進(jìn)行控制,在任務(wù)的代碼里可使用碼里可使用UC/OS-IIUC/OS-II定義的宏定義的宏OS_ENTER_CRITICAL()OS_ENTER_CRITICAL()和和OS_EXIT_CRITICAL()OS

19、_EXIT_CRITICAL()來控制何時響應(yīng)中斷,來控制何時響應(yīng)中斷,何時屏蔽中斷。在運行這兩個宏之間的代何時屏蔽中斷。在運行這兩個宏之間的代碼時是不會響應(yīng)中斷的,這種受保護(hù)的代碼時是不會響應(yīng)中斷的,這種受保護(hù)的代碼段叫臨界段。碼段叫臨界段。17用戶應(yīng)用程序一般結(jié)構(gòu)用戶應(yīng)用程序一般結(jié)構(gòu)( (續(xù)續(xù)) )void Task1(void void Task1(void * *pdata)pdata)/ / 定義用戶任務(wù)定義用戶任務(wù)1 1 for (;) for (;) void Task2(void void Task2(void * *pdata)pdata) / / 定義用戶任務(wù)定義用戶任務(wù)2

20、 2 for (;) for (;) void main()void main() OSInit(); OSInit(); / / 初始化初始化uC/OS-IIuC/OS-II OSTaskCreate(Task1,); OSTaskCreate(Task1,);/ / 創(chuàng)建用戶任務(wù)創(chuàng)建用戶任務(wù)1 1 OSTaskCreate(Task2,); OSTaskCreate(Task2,);/ / 創(chuàng)建用戶任務(wù)創(chuàng)建用戶任務(wù)2 2 OSStart(); OSStart();/ / 啟動任務(wù)啟動任務(wù) 是一個任務(wù)。因此它是一個任務(wù)。因此它不是被主函數(shù)或其它不是被主函數(shù)或其它函數(shù)調(diào)用的,主函數(shù)函數(shù)調(diào)用的,

21、主函數(shù)main()main()只負(fù)責(zé)只負(fù)責(zé)創(chuàng)建和創(chuàng)建和啟動它們啟動它們,而由操作,而由操作系統(tǒng)負(fù)責(zé)來系統(tǒng)負(fù)責(zé)來調(diào)度運行調(diào)度運行它們它們。使用函數(shù)使用函數(shù)OSStart()OSStart()啟動任務(wù)之后,任務(wù)啟動任務(wù)之后,任務(wù)就交由操作系統(tǒng)管理就交由操作系統(tǒng)管理和調(diào)度了。和調(diào)度了。18一個具體的應(yīng)用任務(wù)實例一個具體的應(yīng)用任務(wù)實例 代碼代碼19實時操作系統(tǒng)實時操作系統(tǒng)C/OS-II C/OS-II概述概述任務(wù)概念任務(wù)概念任務(wù)調(diào)度核心問題分析任務(wù)調(diào)度核心問題分析20v 多任務(wù)操作系統(tǒng)的核心:多任務(wù)操作系統(tǒng)的核心:任務(wù)調(diào)度任務(wù)調(diào)度。v 調(diào)度定義:就是通過一個算法在多個任務(wù)中確定哪個任務(wù)來調(diào)度定義:就是

22、通過一個算法在多個任務(wù)中確定哪個任務(wù)來運行。做這項工作的就是運行。做這項工作的就是調(diào)度器調(diào)度器。v 調(diào)度器的主要工作:一是在任務(wù)就緒表中查找具有最高優(yōu)先調(diào)度器的主要工作:一是在任務(wù)就緒表中查找具有最高優(yōu)先級別的就緒任務(wù);二是實現(xiàn)任務(wù)的切換。級別的就緒任務(wù);二是實現(xiàn)任務(wù)的切換。v調(diào)度算法:可搶占的高優(yōu)先級調(diào)度算法調(diào)度算法:可搶占的高優(yōu)先級調(diào)度算法v調(diào)度條件:它在系統(tǒng)或用戶任務(wù)調(diào)用系統(tǒng)函數(shù)及執(zhí)行中斷服調(diào)度條件:它在系統(tǒng)或用戶任務(wù)調(diào)用系統(tǒng)函數(shù)及執(zhí)行中斷服務(wù)程序結(jié)束時來調(diào)用調(diào)度器,以確定該運行的任務(wù)并運行它。務(wù)程序結(jié)束時來調(diào)用調(diào)度器,以確定該運行的任務(wù)并運行它。v uC/OS-II進(jìn)行任務(wù)調(diào)度的依據(jù):

23、進(jìn)行任務(wù)調(diào)度的依據(jù):任務(wù)就緒表任務(wù)就緒表。就緒任務(wù)表及任務(wù)調(diào)度就緒任務(wù)表及任務(wù)調(diào)度為了能使系統(tǒng)清楚地知道系統(tǒng)中哪些任務(wù)為了能使系統(tǒng)清楚地知道系統(tǒng)中哪些任務(wù)已經(jīng)就緒,哪些還沒有就緒,已經(jīng)就緒,哪些還沒有就緒,UC/OS-IIUC/OS-II在在RAMRAM中設(shè)立了一個記錄表,系統(tǒng)中的每個任中設(shè)立了一個記錄表,系統(tǒng)中的每個任務(wù)都在這個表占據(jù)一個位置,并用這個位務(wù)都在這個表占據(jù)一個位置,并用這個位置的狀態(tài)(置的狀態(tài)(1 1或者或者0 0)來表示任務(wù)是否處于)來表示任務(wù)是否處于就緒狀態(tài)。這個表就叫做任務(wù)就緒表。就緒狀態(tài)。這個表就叫做任務(wù)就緒表。21 C/OSC/OS任務(wù)調(diào)度器實現(xiàn)及源代碼分析任務(wù)調(diào)度器

24、實現(xiàn)及源代碼分析void OSSched (void) INT8U y; OS_ENTER_CRITICAL(); if (OSLockNesting | OSIntNesting) = 0) y = OSUnMapTblOSRdyGrp; OSPrioHighRdy = (INT8U)(y 3;OSRdyTblprio3 | = OSMapTblprio & 0 x07;其中,其中,OSMapTbl是是uC/OS-II為加快運算速度定義的一個數(shù)為加快運算速度定義的一個數(shù)組,各元素為:組,各元素為: OSMapTbl0 = 0000 0001BOSMapTbl0 = 0000 0001

25、B OSMapTbl1 = 0000 0010B OSMapTbl1 = 0000 0010B OSMapTbl2 = 0000 0100B OSMapTbl2 = 0000 0100B OSMapTbl3 = 0000 1000B OSMapTbl3 = 0000 1000B OSMapTbl4 = 0001 0000B OSMapTbl4 = 0001 0000B OSMapTbl5 = 0010 0000B OSMapTbl5 = 0010 0000B OSMapTbl6 = 0100 0000B OSMapTbl6 = 0100 0000B OSMapTbl7 = 1000 0000B

26、 OSMapTbl7 = 1000 0000B如果要使一個優(yōu)先級為如果要使一個優(yōu)先級為prio的任務(wù)脫離就緒態(tài),則可使用如下代碼:的任務(wù)脫離就緒態(tài),則可使用如下代碼: If(OSRdyTblprio3 &= If(OSRdyTblprio3 &= OSMapTblprio & 0 x07)=0)OSMapTblprio & 0 x07)=0) OSRdyGrp &= OSRdyGrp &= OSMapTblprio3;OSMapTblprio3;脫離就緒態(tài):將任務(wù)就緒脫離就緒態(tài):將任務(wù)就緒表表OSRdyTblprio3OSRdyTblprio3相

27、相應(yīng)元素的相應(yīng)位清零,而應(yīng)元素的相應(yīng)位清零,而且當(dāng)且當(dāng)OSRdyTblprio3OSRdyTblprio3中的所有位都為零時,即中的所有位都為零時,即全組任務(wù)中沒有一個進(jìn)入全組任務(wù)中沒有一個進(jìn)入就緒態(tài)時,就緒態(tài)時,OSRdyGrpOSRdyGrp的的相應(yīng)位才為零。相應(yīng)位才為零。25對任務(wù)就緒表的操作對任務(wù)就緒表的操作( (續(xù)續(xù)) )例:欲使例:欲使優(yōu)先級為優(yōu)先級為1212的任務(wù)進(jìn)入就緒態(tài),設(shè)置就緒表。的任務(wù)進(jìn)入就緒態(tài),設(shè)置就緒表。答:優(yōu)先級為答:優(yōu)先級為1212,即,即00001100B00001100B。OSRdyGrp | = OSMapTblprio3 OSMapTblprio3 ; (

28、 (OSMapTbl1 = 0000 0010)OSRdyTbl1 | = OSMapTblprio &0 x07 OSMapTblprio &0 x07 ;( (OSMapTbl4 = 0001 0000)例:欲使例:欲使優(yōu)先級為優(yōu)先級為1212的任務(wù)脫離就緒態(tài),設(shè)置就緒表。的任務(wù)脫離就緒態(tài),設(shè)置就緒表。答:優(yōu)先級為答:優(yōu)先級為1212,即,即00001100B00001100B。 OSMapTblprio & 0 x07 = OSMapTblprio & 0 x07 = OSMapTbl4 = 11101111OSMapTbl4 = 11101111 OSM

29、apTblprio3 = OSMapTblprio3 = OSMapTbl1 = 11111101OSMapTbl1 = 11111101如果如果OSRdyTblprio3 &= OSRdyTblprio3 &= OSMapTblprio & 0 x07 = 0 OSMapTblprio & 0 x07 = 0 (該行所有(該行所有任務(wù)都是非就緒態(tài))任務(wù)都是非就緒態(tài))則則OSRdyGrp = OSRdyGrp & OSRdyGrp = OSRdyGrp & OSMapTblprio3 = 0OSMapTblprio3 = 0問題問題2 2:優(yōu)先級

30、為:優(yōu)先級為2222的的任務(wù)進(jìn)入任務(wù)進(jìn)入/ /脫離就緒態(tài)脫離就緒態(tài)26根據(jù)就緒表確定最高優(yōu)先級根據(jù)就緒表確定最高優(yōu)先級兩個關(guān)鍵兩個關(guān)鍵: :l將優(yōu)先級數(shù)將優(yōu)先級數(shù)分解分解為高三位和低三位分別確為高三位和低三位分別確定;定;l高優(yōu)先級有著小的優(yōu)先級號;高優(yōu)先級有著小的優(yōu)先級號;27從任務(wù)就緒表中獲取優(yōu)先級別最高的就緒任務(wù)可用如下代碼:從任務(wù)就緒表中獲取優(yōu)先級別最高的就緒任務(wù)可用如下代碼:采用查表法確定高優(yōu)先級任務(wù)采用查表法確定高優(yōu)先級任務(wù)Y = OSUnMapTblOSRdyGrp;/獲得優(yōu)先級別的獲得優(yōu)先級別的D5、D4、D3位位X = OSUnMapTblOSRdyTblY; /獲得優(yōu)先級別

31、的獲得優(yōu)先級別的D2、D1、D0位位Prio =(Y3)+X; /獲得就緒任務(wù)的優(yōu)先級別獲得就緒任務(wù)的優(yōu)先級別其中,其中,OSUnMapTbl同樣是同樣是uC/OS-II為加快運算速度定為加快運算速度定義的一個數(shù)組,共有義的一個數(shù)組,共有256個元素:個元素:INT8U const OSUnMapTbl16*16 = 0, 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,

32、 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, 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,

33、 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, 0, 2, 0, 1,

34、 0, 3, 0, 1, 0, 2, 0, 1, 0;舉例:如已知如已知OSRdyGrpOSRdyGrp的值為的值為01101000B01101000B,即,即104104,則查得則查得OSUnMapTblOSRdyGrpOSUnMapTblOSRdyGrp的值是的值是3 3。如已知如已知OSRdyTbl3OSRdyTbl3的值是的值是11100100B11100100B,即,即228228,則查則查OSUnMapTblOSRdyTbl3OSUnMapTblOSRdyTbl3的值是的值是2 2。則進(jìn)入就緒態(tài)的最高任務(wù)優(yōu)先級。則進(jìn)入就緒態(tài)的最高任務(wù)優(yōu)先級。 Prio=Prio=(3333)+2=

35、26+2=26 UC/OS-IIUC/OS-II經(jīng)常使用類似于就緒表的經(jīng)常使用類似于就緒表的形式來記錄任務(wù)的某種狀態(tài),因此形式來記錄任務(wù)的某種狀態(tài),因此一定要熟悉這種表的結(jié)構(gòu)以及對這一定要熟悉這種表的結(jié)構(gòu)以及對這種表的基本操作。種表的基本操作。28源代碼中使用了查表法n查表法具有確定的時間,增加了系統(tǒng)的可查表法具有確定的時間,增加了系統(tǒng)的可預(yù)測性,預(yù)測性,uC/OSuC/OS中所有的系統(tǒng)調(diào)用時間都是中所有的系統(tǒng)調(diào)用時間都是確定的確定的n以空間換時間以空間換時間Y = OSUnMapTblOSRdyGrp;X = OSUnMapTblOSRdyTblY;Prio = (Y3) + X;參參見見O

36、S_CORE.C29void OSSched (void) INT8U y;OS_ENTER_CRITICAL(); if (OSLockNesting | OSIntNesting) = 0)(1) y = OSUnMapTblOSRdyGrp;(2) OSPrioHighRdy = (INT8U)(y 3) + OSUnMapTblOSRdyTbly); if (OSPrioHighRdy != OSPrioCur)(3)OSTCBHighRdy = OSTCBPrioTblOSPrioHighRdy;(4)OSCtxSwCtr+; (5)OS_TASK_SW(); (6) 開始開始因處理全局變量而關(guān)中斷因處理全局變量而關(guān)中斷找出準(zhǔn)備就緒且優(yōu)先級最高的任務(wù)找出準(zhǔn)備就緒且優(yōu)先級最高的任務(wù)將準(zhǔn)備就緒的最高優(yōu)先級任務(wù)將準(zhǔn)備就緒的最高優(yōu)先級任務(wù)指向該任務(wù)的控制塊指向該任務(wù)的控制塊該任務(wù)是否為該任務(wù)是否為當(dāng)前運行任務(wù)當(dāng)前運行任務(wù)是否中斷嵌套是否中斷嵌套或調(diào)度上鎖或調(diào)

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論