第四講ucOSII內(nèi)核結(jié)構(gòu)_03_第1頁
第四講ucOSII內(nèi)核結(jié)構(gòu)_03_第2頁
第四講ucOSII內(nèi)核結(jié)構(gòu)_03_第3頁
第四講ucOSII內(nèi)核結(jié)構(gòu)_03_第4頁
第四講ucOSII內(nèi)核結(jié)構(gòu)_03_第5頁
已閱讀5頁,還剩49頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、ucOS-II內(nèi)核結(jié)構(gòu)內(nèi)核結(jié)構(gòu)臨界段臨界段(Critical Sections) nC/OS-為了處理臨界段代碼需要關(guān)中斷,處理完為了處理臨界段代碼需要關(guān)中斷,處理完后再開中斷。后再開中斷。 nC/OS-定義兩個宏定義兩個宏(macros) OS_ENTER_CRITICAL()和和OS_EXIT_CRITICAL()來關(guān)中斷和開中斷,以便避開不同來關(guān)中斷和開中斷,以便避開不同C編譯器廠商選擇編譯器廠商選擇不同的方法來處理關(guān)中斷和開中斷。不同的方法來處理關(guān)中斷和開中斷。n這兩個宏的定義取決于所用的微處理器,在文件這兩個宏的定義取決于所用的微處理器,在文件OS_CPU.H中可以找到相應宏定義(每

2、種微處理器都中可以找到相應宏定義(每種微處理器都有自己的有自己的OS_CPU.H文件)。文件)。 任務任務 n一個任務通常是一個無限的循環(huán),而且一一個任務通常是一個無限的循環(huán),而且一個任務的返回參數(shù)必須定義成個任務的返回參數(shù)必須定義成void。n任務完成以后,任務可以調(diào)用任務完成以后,任務可以調(diào)用OSTaskDel()自我刪除,自我刪除,C/OS-不再不再理會這個任務,任務的代碼也不會再運理會這個任務,任務的代碼也不會再運行。行。 一個無限循環(huán)任務的程序一個無限循環(huán)任務的程序nvoid YourTask (void *pdata) (1) for (;) (2) /* 用戶代碼用戶代碼 */

3、調(diào)用調(diào)用uC/OS-II的某種系統(tǒng)服務的某種系統(tǒng)服務: OSMboxPend(); /任務進入等待狀態(tài)任務進入等待狀態(tài) OSQPend(); /任務進入等待狀態(tài)任務進入等待狀態(tài) OSSemPend(); /任務進入等待狀態(tài)任務進入等待狀態(tài) OSTaskDel(OS_PRIO_SELF); /任務完成后自我刪除任務完成后自我刪除 OSTaskSuspend(OS_PRIO_SELF); /任務掛起等待任務掛起等待 OSTimeDly(); /延遲一段時間延遲一段時間 OSTimeDlyHMSM(); /延遲一段時間延遲一段時間 /* 用戶代碼用戶代碼 */ 任務控制塊(任務控制塊(Task Co

4、ntrol Blocks, OS_TCBs) n任務一旦建立,任務控制塊任務一旦建立,任務控制塊OS_TCBs將被賦值。將被賦值。n任務控制塊是一個數(shù)據(jù)結(jié)構(gòu),全部駐留在任務控制塊是一個數(shù)據(jù)結(jié)構(gòu),全部駐留在RAM中。中。n當任務的當任務的CPU使用權(quán)被剝奪時,使用權(quán)被剝奪時,C/OS-用它用它來保存該任務的狀態(tài)。當任務重新得到來保存該任務的狀態(tài)。當任務重新得到CPU使用使用權(quán)時,任務控制塊能確保任務從當時被中斷的那權(quán)時,任務控制塊能確保任務從當時被中斷的那一點開始繼續(xù)向下執(zhí)行。一點開始繼續(xù)向下執(zhí)行。n任務建立的時候,任務建立的時候,OS_TCBs被初始化。被初始化。C/OS-II任務控制塊程序任

5、務控制塊程序 ntypedef struct os_tcb OS_STK *OSTCBStkPtr;/ 指向當前任務棧頂?shù)闹羔?,是指向當前任務棧頂?shù)闹羔槪荗S_TCB數(shù)據(jù)結(jié)構(gòu)中唯一一個能用數(shù)據(jù)結(jié)構(gòu)中唯一一個能用匯編語言來處置的變量(在任務切換段的代碼匯編語言來處置的變量(在任務切換段的代碼Context-switching code之中)之中) #if OS_TASK_CREATE_EXT_EN void *OSTCBExtPtr;/指向用戶定義的任務控制塊擴展,只在函數(shù)指向用戶定義的任務控制塊擴展,只在函數(shù)OstaskCreateExt()中中使用,故使用時要將使用,故使用時要將OS_TA

6、SK_CREAT_EN設為設為1,以允許建立任務函數(shù)的擴展,以允許建立任務函數(shù)的擴展 OS_STK *OSTCBStkBottom;/指向任務棧底的指針,通過指向任務棧底的指針,通過OSTaskCreateExt()函數(shù)建立函數(shù)建立任務時才能實現(xiàn)任務時才能實現(xiàn)OSTaskStkChk() 功能,要求是將功能,要求是將OS_TASK_CREATE_EXT_EN設為設為1。 INT32U OSTCBStkSize;/存放棧中可容納的指針數(shù)目而不是用字節(jié)(存放棧中可容納的指針數(shù)目而不是用字節(jié)(Byte)表示的棧容量)表示的棧容量總數(shù),在函數(shù)總數(shù),在函數(shù)OSStakChk()中調(diào)用,同樣要將中調(diào)用,同

7、樣要將OS_TASK_CREAT_EXT_EN設為設為1。 INT16U OSTCBOpt;/把把OS_TASK_OTP_STK_CHK, OS_TASK_OPT_STK_CLR和和OS_TASK_OPT_SAVE_FP 三個三個“選擇項選擇項”傳給傳給OSTaskCreateExt()。 INT16U OSTCBId;/存儲任務的識別碼,現(xiàn)在暫時沒有使用存儲任務的識別碼,現(xiàn)在暫時沒有使用 #endif /用于任務控制塊用于任務控制塊OS_TCBs的雙重鏈接,該鏈表在時鐘節(jié)拍函數(shù)的雙重鏈接,該鏈表在時鐘節(jié)拍函數(shù)OSTimeTick()中使用,用于刷中使用,用于刷新各個任務的任務延遲變量新各個任

8、務的任務延遲變量.OSTCBDly,每個任務的任務控制塊,每個任務的任務控制塊OS_TCB在任務建立的時候被鏈在任務建立的時候被鏈接到鏈表中,在任務刪除的時候從鏈表中被刪除。雙重連接的鏈表使得任一成員都能被快速插入接到鏈表中,在任務刪除的時候從鏈表中被刪除。雙重連接的鏈表使得任一成員都能被快速插入或刪除?;騽h除。 struct os_tcb *OSTCBNext; struct os_tcb *OSTCBPrev;#if (OS_Q_EN & (OS_MAX_QS = 2) | OS_MBOX_EN | OS_SEM_EN OS_EVENT *OSTCBEventPtr;/指向事件控制

9、塊的指針指向事件控制塊的指針 #endifC/OS-II任務控制塊程序任務控制塊程序 #if (OS_Q_EN & (OS_MAX_QS = 2) | OS_MBOX_EN void *OSTCBMsg;/指向傳給任務的消息的指針指向傳給任務的消息的指針 #endif INT16U OSTCBDly;/當需要把任務延時若干時鐘節(jié)拍時要用到這個變量,或者需要當需要把任務延時若干時鐘節(jié)拍時要用到這個變量,或者需要把任務掛起一段時間以等待某事件的發(fā)生,這種等待是有超時限制的。如果這個變量為把任務掛起一段時間以等待某事件的發(fā)生,這種等待是有超時限制的。如果這個變量為0,表示任務不延時,或者表示

10、等待事件發(fā)生的時間沒有限制。表示任務不延時,或者表示等待事件發(fā)生的時間沒有限制。 INT8U OSTCBStat;/任務的狀態(tài)字,當任務的狀態(tài)字,當.OSTCBStat為為0,任務進入就緒態(tài)。,任務進入就緒態(tài)。 INT8U OSTCBPrio;/任務優(yōu)先級,高優(yōu)先級任務的任務優(yōu)先級,高優(yōu)先級任務的.OSTCBPrio值小。值小。 INT8U OSTCBX; INT8U OSTCBY; INT8U OSTCBBitX; INT8U OSTCBBitY; /以上四個變量用于加速任務進入就緒態(tài)的過程或進入等待事件發(fā)生狀態(tài)的過程(避免在運以上四個變量用于加速任務進入就緒態(tài)的過程或進入等待事件發(fā)生狀態(tài)的

11、過程(避免在運行中去計算這些值)。這些值是在任務建立時算好的,或者是在改變?nèi)蝿諆?yōu)先級時算出的。行中去計算這些值)。這些值是在任務建立時算好的,或者是在改變?nèi)蝿諆?yōu)先級時算出的。 #if OS_TASK_DEL_EN BOOLEAN OSTCBDelReq;/一個布爾量,用于表示該任務是否需要刪除一個布爾量,用于表示該任務是否需要刪除 #endif OS_TCB;.OSTCBX, .OSTCBY, .OSTCBBitX和和 .OSTCBBitY的計算的計算n任務控制塊任務控制塊OS_TCB中幾個成員的算法程中幾個成員的算法程序序nOSTCBY= priority 3;nOSTCBBitY= OSM

12、apTblpriority 3;nOSTCBX= priority & 0 x07;nOSTCBBitX= OSMapTblpriority & 0 x07;n應用程序中可以有的最多任務數(shù)(應用程序中可以有的最多任務數(shù)(OS_MAX_TASKS)是)是在文件在文件OS_CFG.H中定義的。這個最多任務數(shù)也是中定義的。這個最多任務數(shù)也是C/OS-分配給用戶程序的最多任務控制塊分配給用戶程序的最多任務控制塊OS_TCBs的數(shù)目。的數(shù)目。n將將OS_MAX_TASKS的數(shù)目設置為用戶應用程序?qū)嶋H需要的數(shù)目設置為用戶應用程序?qū)嶋H需要的任務數(shù)可以減小的任務數(shù)可以減小RAM的需求量。所有的

13、任務控制塊的需求量。所有的任務控制塊OS_TCBs都是放在任務控制塊列表數(shù)組都是放在任務控制塊列表數(shù)組OSTCBTbl中的。中的。n請注意,請注意,C/OS-分配給系統(tǒng)任務分配給系統(tǒng)任務OS_N_SYS_TASKS若若干個任務控制塊,見文件干個任務控制塊,見文件C/OS-.H,供其內(nèi)部使用。目,供其內(nèi)部使用。目前,一個用于空閑任務,另一個用于任務統(tǒng)計(如果前,一個用于空閑任務,另一個用于任務統(tǒng)計(如果OS_TASK_STAT_EN是設為是設為1的)。的)??杖蝿真湵砜杖蝿真湵?在在C/OS-初始化的時候,所有任務控制塊初始化的時候,所有任務控制塊OS_TCBs被鏈接成單向空任務鏈表。當任務一旦

14、建立,空任務控被鏈接成單向空任務鏈表。當任務一旦建立,空任務控制塊指針制塊指針OSTCBFreeList指向的任務控制塊便賦給了該指向的任務控制塊便賦給了該任務,然后任務,然后OSTCBFreeList的值調(diào)整為指向下個鏈表中的值調(diào)整為指向下個鏈表中下一個空的任務控制塊。一旦任務被刪除,任務控制塊下一個空的任務控制塊。一旦任務被刪除,任務控制塊就被還給空任務鏈表。就被還給空任務鏈表。 就緒表(就緒表(Ready List)nC/OS-初始化的時候,最低優(yōu)先級初始化的時候,最低優(yōu)先級OS_LOWEST_PRIO總是被賦給空閑任務總是被賦給空閑任務idle task。n每個任務的就緒態(tài)標志都放入就

15、緒表中的,就緒表中每個任務的就緒態(tài)標志都放入就緒表中的,就緒表中有兩個變量有兩個變量OSRedyGrp和和OSRdyTbl。在。在OSRdyGrp中,任務按優(yōu)先級分組,中,任務按優(yōu)先級分組,8個任務為一組。個任務為一組。OSRdyGrp中的每一位表示中的每一位表示8組任務中每一組中是否組任務中每一組中是否有進入就緒態(tài)的任務。任務進入就緒態(tài)時,就緒表有進入就緒態(tài)的任務。任務進入就緒態(tài)時,就緒表OSRdyTbl中的相應元素的相應位也置位。中的相應元素的相應位也置位。n就緒表就緒表OSRdyTbl數(shù)組的大小取決于數(shù)組的大小取決于OS_LOWEST_PRIO(見文件見文件OS_CFG.H)。 OSRd

16、yGrp和和OSRdyTbl之間的關(guān)系圖之間的關(guān)系圖 任務進入就緒態(tài)程序任務進入就緒態(tài)程序 nOSRdyGrp |= OSMapTblprio 3;nOSRdyTblprio 3 |= OSMapTblprio & 0 x07;OSMapTblOSMapTbl的值的值IndexBit Mask (Binary)000000001100000010200000100300001000400010000500100000601000000710000000任務優(yōu)先級的低三位用于任務優(yōu)先級的低三位用于確定任務在總就緒表確定任務在總就緒表OSRdyTbl中的所在位。中的所在位。接下去的三位用于

17、確定是接下去的三位用于確定是在在OSRdyGrp數(shù)組的第數(shù)組的第幾個元素。幾個元素。 例如:例如:prio=00110001(prio=49)從就緒表中刪除一個任務程序從就緒表中刪除一個任務程序nif (OSRdyTblprio 3 &= OSMapTblprio & 0 x07) = 0) OSRdyGrp &= OSMapTblprio 3;將就緒任務表數(shù)組將就緒任務表數(shù)組OSRdyTbl中相應元素的相應位中相應元素的相應位清零,而對于清零,而對于OSRdyGrp,只有當被刪除任務所在任,只有當被刪除任務所在任務組中全組任務一個都沒有進入就緒態(tài)時,才將相應務組中全組

18、任務一個都沒有進入就緒態(tài)時,才將相應位清零。也就是說位清零。也就是說OSRdyTblprio3所有的位都所有的位都是零時,是零時,OSRdyGrp的相應位才清零。的相應位才清零。 找到進入就緒態(tài)的優(yōu)先級最高的任務找到進入就緒態(tài)的優(yōu)先級最高的任務 n不需要從不需要從OSRdyTbl0開始掃描整個就緒任開始掃描整個就緒任務表,只需要查另外一張表,即優(yōu)先級判定表務表,只需要查另外一張表,即優(yōu)先級判定表OSUnMapTbl(256)(見文件見文件OS_CORE.C)。nOSRdyTbl中每個字節(jié)的中每個字節(jié)的8位代表這一組的位代表這一組的8個任務哪些進入就緒態(tài)了,低位的優(yōu)先級高于個任務哪些進入就緒態(tài)了

19、,低位的優(yōu)先級高于高位。利用這個字節(jié)為下標來查高位。利用這個字節(jié)為下標來查OSUnMapTbl這張表,返回的字節(jié)就是該組這張表,返回的字節(jié)就是該組任務中就緒態(tài)任務中優(yōu)先級最高的那個任務所任務中就緒態(tài)任務中優(yōu)先級最高的那個任務所在的位置。這個返回值在在的位置。這個返回值在0到到7之間。之間。 找出進入就緒態(tài)的優(yōu)先級最高的任務程序找出進入就緒態(tài)的優(yōu)先級最高的任務程序ny = OSUnMapTblOSRdyGrp;nx = OSUnMapTblOSRdyTbly;nprio = (y 0,或者由于用戶至少調(diào)用了一次給任務調(diào)度上鎖函數(shù),或者由于用戶至少調(diào)用了一次給任務調(diào)度上鎖函數(shù)OSSchedLock

20、(),使,使OSLockNesting0 y = OSUnMapTblOSRdyGrp; (2) /找出那個進入就緒態(tài)且優(yōu)先級最高的任找出那個進入就緒態(tài)且優(yōu)先級最高的任務務 OSPrioHighRdy = (INT8U)(y 0) OSLockNesting-; if (OSLockNesting | OSIntNesting) = 0) (1) OS_EXIT_CRITICAL(); OSSched(); (2)/當當OSLockNesting減到零的時候,減到零的時候,OSSchedUnlock()調(diào)用調(diào)用OSSched else OS_EXIT_CRITICAL(); else OS_E

21、XIT_CRITICAL(); 空閑任務空閑任務(Idle Task) nC/OS-總是建立一個空閑任務,這個任務總是建立一個空閑任務,這個任務在沒有其它任務進入就緒態(tài)時投入運行。在沒有其它任務進入就緒態(tài)時投入運行。n這個空閑任務這個空閑任務OSTaskIdle()永遠設為最低永遠設為最低優(yōu)先級,即優(yōu)先級,即OS_LOWEST_PRI0。n空閑任務空閑任務OSTaskIdle()什么也不做,只是在什么也不做,只是在不停地給一個不停地給一個32位的名叫位的名叫OSIdleCtr的計數(shù)器的計數(shù)器加加1,統(tǒng)計任務使用這個計數(shù)器以確定現(xiàn)行應,統(tǒng)計任務使用這個計數(shù)器以確定現(xiàn)行應用軟件實際消耗的用軟件實際

22、消耗的CPU時間。時間。C/OS-的空閑任務程序的空閑任務程序nvoid OSTaskIdle (void *pdata) pdata = pdata; for (;) OS_ENTER_CRITICAL(); OSIdleCtr+; OS_EXIT_CRITICAL(); 空閑任務不可能被應用軟件刪除??臻e任務不可能被應用軟件刪除。 統(tǒng)計任務統(tǒng)計任務OSTaskStat()n提供運行時間統(tǒng)計的任務。如果用戶將系統(tǒng)定義常提供運行時間統(tǒng)計的任務。如果用戶將系統(tǒng)定義常數(shù)數(shù)OS_TASK_STAT_EN(見文件(見文件OS_CFG.H)設)設為為1,這個任務就會建立。,這個任務就會建立。n一旦得到了

23、允許,一旦得到了允許,OSTaskStat()每秒鐘運行一次每秒鐘運行一次(見文件(見文件OS_CORE.C),計算當前的),計算當前的CPU利用率,利用率,用百分比表示,這個值放在一個有符號用百分比表示,這個值放在一個有符號8位整數(shù)位整數(shù)OSCPUsage中,精度是中,精度是1個百分點。個百分點。n如果應用程序打算使用統(tǒng)計任務,用戶必須在初始如果應用程序打算使用統(tǒng)計任務,用戶必須在初始化時建立一個唯一的任務,在這個任務中調(diào)用化時建立一個唯一的任務,在這個任務中調(diào)用OSStatInit()(見文件(見文件OS_CORE.C),然后再建),然后再建立應用程序中的其它任務。立應用程序中的其它任務。

24、 初始化統(tǒng)計任務程序初始化統(tǒng)計任務程序nvoid main (void) nOSInit(); /*初始化初始化uC/OS-II (1)*/ n/*安裝安裝uC/OS-II的任務切換向量的任務切換向量*/ n/*創(chuàng)建用戶起始任務創(chuàng)建用戶起始任務(為了方便討論,這為了方便討論,這里以里以TaskStart()作為起始任務作為起始任務) (2)*/ nOSStart(); /*開始多任務調(diào)度開始多任務調(diào)度 (3)*/初始化統(tǒng)計任務程序初始化統(tǒng)計任務程序nvoid TaskStart (void *pdata) n/* 安裝并啟動安裝并啟動uC/OS-II的時鐘節(jié)拍的時鐘節(jié)拍 (4)*/ nOSSt

25、atInit(); /* 初始化統(tǒng)計任務初始化統(tǒng)計任務 (5)*/ n/* 創(chuàng)建用戶應用程序任務創(chuàng)建用戶應用程序任務*/ nfor (;) /* 這里是這里是TaskStart()的代碼的代碼!*/ 空閑任務的優(yōu)先級設為最低,統(tǒng)計任務的優(yōu)空閑任務的優(yōu)先級設為最低,統(tǒng)計任務的優(yōu)先級設為次低,啟動任務先級設為次低,啟動任務TaskStart()總是總是優(yōu)先級最高的任務。優(yōu)先級最高的任務。 統(tǒng)計任務的初始化程序統(tǒng)計任務的初始化程序nvoid OSStatInit (void) n OSTimeDly(2); n OS_ENTER_CRITICAL(); n OSIdleCtr = 0L; n OS_

26、EXIT_CRITICAL(); n OSTimeDly(OS_TICKS_PER_SEC); n OS_ENTER_CRITICAL(); n OSIdleCtrMax = OSIdleCtr; n OSStatRdy = TRUE; n OS_EXIT_CRITICAL();統(tǒng)計任務程序統(tǒng)計任務程序nvoid OSTaskStat (void *pdata) INT32U run; INT8S usage; pdata = pdata; while (OSStatRdy = FALSE) (1) /等待統(tǒng)計任務就緒等待統(tǒng)計任務就緒 OSTimeDly(2 * OS_TICKS_PER_SE

27、C); for (;) OS_ENTER_CRITICAL(); OSIdleCtrRun = OSIdleCtr; run = OSIdleCtr; OSIdleCtr = 0L; OS_EXIT_CRITICAL(); if (OSIdleCtrMax 0L) /CPU利用率利用率 usage = (INT8S)(100L - 100L * run / OSIdleCtrMax); (2) if (usage 100) OSCPUUsage = 100; else if (usage 0),),C/OS-將返回到被中斷了的任務。將返回到被中斷了的任務。 在有些情況下,從在有些情況下,從OS

28、IntEnter()返回時,會把中斷打開。返回時,會把中斷打開。此時,在調(diào)用此時,在調(diào)用OSIntEnter()之前要先清中斷源,否則,中之前要先清中斷源,否則,中斷將連續(xù)反復打入,用戶應用程序就會崩潰!斷將連續(xù)反復打入,用戶應用程序就會崩潰! 注意注意 n用戶中斷服務中做的事要盡可能地少,要把大部分工用戶中斷服務中做的事要盡可能地少,要把大部分工作留給任務去做。作留給任務去做。n中斷服務子程序通知某任務去做事的手段是調(diào)用以下中斷服務子程序通知某任務去做事的手段是調(diào)用以下函數(shù)之一:函數(shù)之一:OSMboxPost(),OSQPost(),OSQPostFront(),OSSemPost()。n中

29、斷發(fā)生并由上述函數(shù)發(fā)出消息時,接收消息的任務中斷發(fā)生并由上述函數(shù)發(fā)出消息時,接收消息的任務可能是,也可能不是掛起在郵箱、隊列或信號量上的可能是,也可能不是掛起在郵箱、隊列或信號量上的任務。任務。n用戶中斷服務完成以后,要調(diào)用用戶中斷服務完成以后,要調(diào)用OSIntExit()。n對被中斷了的任務說來,如果沒有高優(yōu)先級的任務被對被中斷了的任務說來,如果沒有高優(yōu)先級的任務被中斷服務子程序激活而進入就緒態(tài),中斷服務子程序激活而進入就緒態(tài),OSIntExit()只只占用很短的運行時間。如果中斷服務子程序使一個高占用很短的運行時間。如果中斷服務子程序使一個高優(yōu)先級的任務進入了就緒態(tài),則優(yōu)先級的任務進入了就

30、緒態(tài),則OSIntExit()將占用將占用較長的運行時間,因為這時要做任務切換,新任務的較長的運行時間,因為這時要做任務切換,新任務的寄存器內(nèi)容要恢復并執(zhí)行中斷返回指令。寄存器內(nèi)容要恢復并執(zhí)行中斷返回指令。進入中斷的函數(shù)進入中斷的函數(shù)OSIntEnter() 代碼代碼 nvoid OSIntEnter (void)OS_ENTER_CRITICAL(); OSIntNesting+; /使中斷嵌使中斷嵌套層數(shù)加套層數(shù)加1 OS_EXIT_CRITICAL();退出中斷服務的函數(shù)退出中斷服務的函數(shù)OSIntExit() 代碼代碼 nvoid OSIntExit (void) OS_ENTER_C

31、RITICAL(); (1) if (-OSIntNesting | OSLockNesting) = 0) (2) / 使中斷嵌套層數(shù)減使中斷嵌套層數(shù)減1 OSIntExitY = OSUnMapTblOSRdyGrp; (3) / OSRdyTbl所需的檢索值所需的檢索值Y是保存在全局變量是保存在全局變量OSIntExitY中中 OSPrioHighRdy = (INT8U)(OSIntExitY OSTCBPrio != OS_IDLE_PRIO) (3) /直到空閑任務直到空閑任務 OS_ENTER_CRITICAL(); if (ptcb-OSTCBDly != 0) if (-pt

32、cb-OSTCBDly = 0) if (!(ptcb-OSTCBStat & OS_STAT_SUSPEND) (4) /被被任務掛起的函數(shù)任務掛起的函數(shù)OSTaskSuspend()掛起的任務則不會進入就緒態(tài)掛起的任務則不會進入就緒態(tài) OSRdyGrp |= ptcb-OSTCBBitY; (5) /當某任務的任務控制塊當某任務的任務控制塊中的時間延時項中的時間延時項OSTCBDly減到了零,這個任務就進入了就緒態(tài)減到了零,這個任務就進入了就緒態(tài) OSRdyTblptcb-OSTCBY |= ptcb-OSTCBBitX; else ptcb-OSTCBDly = 1; ptcb

33、= ptcb-OSTCBNext; OS_EXIT_CRITICAL(); OS_ENTER_CRITICAL(); (6) OSTime+; (7) /調(diào)用調(diào)用OSTime()累加從開機以來的時間累加從開機以來的時間 OS_EXIT_CRITICAL(); nOSTimTick()的執(zhí)行時間與應用程序中建的執(zhí)行時間與應用程序中建立了多少個任務成正比。立了多少個任務成正比。n用戶也可以從任務級調(diào)用用戶也可以從任務級調(diào)用OSTimeTick(),首先要建立一個高于應用程序中所有其它任首先要建立一個高于應用程序中所有其它任務優(yōu)先級的任務,然后,時鐘節(jié)拍中斷服務務優(yōu)先級的任務,然后,時鐘節(jié)拍中斷服務

34、子程序利用信號量或郵箱發(fā)信號給這個高優(yōu)子程序利用信號量或郵箱發(fā)信號給這個高優(yōu)先級的任務。先級的任務。 時鐘節(jié)拍任務時鐘節(jié)拍任務 TickTask() 作為時鐘節(jié)拍中斷服務子程序作為時鐘節(jié)拍中斷服務子程序 nvoid TickTask (void *pdata) pdata = pdata; for (;) OSMboxPend(.); /* 等待從時鐘節(jié)拍中斷服務程序發(fā)來的信號等待從時鐘節(jié)拍中斷服務程序發(fā)來的信號 */ OSTimeTick(); 用戶要先建立一個郵箱(初始化成用戶要先建立一個郵箱(初始化成NULL),),用于發(fā)信號給上述任務告知時鐘節(jié)拍中斷已經(jīng)用于發(fā)信號給上述任務告知時鐘節(jié)拍

35、中斷已經(jīng)發(fā)生了發(fā)生了 。時鐘節(jié)拍中斷服務函數(shù)時鐘節(jié)拍中斷服務函數(shù)OSTickISR()做節(jié)拍服務程序做節(jié)拍服務程序 nvoid OSTickISR(void)n 保存處理器寄存器的值;保存處理器寄存器的值; n 調(diào)用調(diào)用OSIntEnter()或是將或是將OSIntNesting加加1; n 發(fā)送一個發(fā)送一個空空消息消息(例如,例如, (void *)1)到到時鐘節(jié)拍的郵箱時鐘節(jié)拍的郵箱; n 調(diào)用調(diào)用OSIntExit(); n 恢復處理器寄存器的值恢復處理器寄存器的值; n 執(zhí)行中斷返回指令執(zhí)行中斷返回指令; C/OS-初始化初始化 n在調(diào)用在調(diào)用C/OS-的任何其它服務之前,的任何其它服

36、務之前,C/OS-要求用戶首先調(diào)用系統(tǒng)初始化函數(shù)要求用戶首先調(diào)用系統(tǒng)初始化函數(shù)OSIint() 初始化初始化C/OS-所有的變量和數(shù)據(jù)所有的變量和數(shù)據(jù)結(jié)構(gòu)(見結(jié)構(gòu)(見OS_CORE.C)。)。nOSInit()建立空閑任務建立空閑任務idle task,這個任務,這個任務總是處于就緒態(tài)的。空閑任務總是處于就緒態(tài)的。空閑任務OSTaskIdle()()的優(yōu)先級總是設成最低,即的優(yōu)先級總是設成最低,即OS_LOWEST_PRIO。n如果統(tǒng)計任務允許如果統(tǒng)計任務允許OS_TASK_STAT_EN和任和任務建立擴展允許都設為務建立擴展允許都設為1,則,則OSInit()還得建還得建立統(tǒng)計任務立統(tǒng)計任務

37、OSTaskStat()并且讓其進入就緒并且讓其進入就緒態(tài)。態(tài)。OSTaskStat的優(yōu)先級總是設為的優(yōu)先級總是設為OS_LOWEST_PRIO-1。C/OS-初始化初始化 n調(diào)用調(diào)用OSInit()之后,一些之后,一些C/OS-變量和數(shù)據(jù)結(jié)構(gòu)之間的關(guān)變量和數(shù)據(jù)結(jié)構(gòu)之間的關(guān)系如下圖所示。假設:系如下圖所示。假設:n在文件在文件OS_CFG.H中,中,OS_TASK_STAT_EN是設為是設為1的。的。n在文件在文件OS_CFG.H中,中,OS_LOWEST_PRIO是設為是設為63的。的。n在文件在文件OS_CFG.H中,最多任務數(shù)中,最多任務數(shù)OS_MAX_TASKS是設成大是設成大于于2的

38、。的。n以上兩個任務(空閑與統(tǒng)計)的任務控制塊(以上兩個任務(空閑與統(tǒng)計)的任務控制塊(OS_TCBs)是用)是用雙向鏈表鏈接在一起的,雙向鏈表鏈接在一起的,OSTCBList指向這個鏈表的起始處。指向這個鏈表的起始處。當建立一個任務時,這個任務總是被放在這個鏈表的起始處。當建立一個任務時,這個任務總是被放在這個鏈表的起始處。即即OSTCBList總是指向最后建立的那個任務,鏈的終點指向空總是指向最后建立的那個任務,鏈的終點指向空字符字符NULL(也就是零也就是零)。1.因為這兩個任務都處在就緒態(tài),在就緒任務表因為這兩個任務都處在就緒態(tài),在就緒任務表OSRdyTbl中的中的相應位是設為相應位是

39、設為1的,在的,在OSRdyGrp中也只有中也只有1位是設為位是設為1的。的。調(diào)用調(diào)用OSInit()之后一些之后一些C/OS-變量和變量和數(shù)據(jù)結(jié)構(gòu)之間的關(guān)系數(shù)據(jù)結(jié)構(gòu)之間的關(guān)系C/OS-初始化初始化 nC/OS-還初始化了還初始化了4個空數(shù)據(jù)結(jié)構(gòu)緩沖區(qū),如下圖所示。個空數(shù)據(jù)結(jié)構(gòu)緩沖區(qū),如下圖所示。n每個緩沖區(qū)都是單向鏈表,允許每個緩沖區(qū)都是單向鏈表,允許C/OS-從緩沖區(qū)中迅從緩沖區(qū)中迅速得到或釋放一個緩沖區(qū)中的元素。注意,空任務控制塊速得到或釋放一個緩沖區(qū)中的元素。注意,空任務控制塊在空緩沖區(qū)中的數(shù)目取決于最多任務數(shù)在空緩沖區(qū)中的數(shù)目取決于最多任務數(shù)OS_MAX_TASKS,這個最多任務數(shù)是在這個最多任務數(shù)是在OS_CFG.H文件中定義的。文件中定義的。nC/OS-自動安排總的系統(tǒng)任務數(shù)自動安排總的系統(tǒng)任務數(shù)OS_N_SYS_TASKS(見文件見文件C/OS-.H),控制塊,控制塊OS_TCB的數(shù)目也就自動確定了。其中包括分配給統(tǒng)計任的數(shù)目也就自動確定了。其中包括分配給統(tǒng)計任務和空閑任務的任務控制塊。務和空閑任務的任務控制塊。n指向空事件表指向空事件表OSEventFreeList和空隊列表和空隊列表OSFreeList的的指針用于任務間通訊與同步。指針用于任務間通訊與同步。n指向空存儲區(qū)的指針表指向空存儲區(qū)的指針表OSMem

溫馨提示

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

評論

0/150

提交評論