【正文】
A Free sample background from Slide 102 ? 說明 ? 任務代碼并非真的刪除了 , μC/OS Ⅱ 只是簡單地不再理會這個任務了 , 這個任務的代碼也不會再運行 , 即使任務調(diào)用了 OSTaskDel(),這個任務絕不會返回 。 ? 形式參數(shù)變量是由用戶代碼在第一次執(zhí)行的時候帶入的 。 該變量的類型是一個指向 void的指針 。 這是為了允許用戶應用程序傳遞任何類型的數(shù)據(jù)給任務 。 A Free sample background from Slide 103 任務的狀態(tài) ? μC/OS Ⅱ 中每個任務 5種 狀態(tài) , 下圖為 μC/OS Ⅱ 的任務狀態(tài)轉(zhuǎn)換圖: 等 待 狀 態(tài)的 任 務睡 眠 狀 態(tài) 的任 務就 緒 狀 態(tài)的 任 務運 行 狀 態(tài) 的任 務被 中 斷 態(tài)任 務中 斷 O S F l a g P o a t ( )O S M b o x P o s t ( )O S M u t e x P o s t ( )O S Q P o s t ( )O S Q P o s t O p y ( )O S Q P o s t F r o n t (O S S e m P o s t ( )O S T a s k R e s u m eO S T i m e T i c kO S F l a g P e n d ( )O S M b o x P e n d ( )O S M u t e x P e n d ( )O S Q P e n d ( )O S S e m P e n d ( )O S T i m e D l y ( )O S T i m e D l y h s mO S S T A R T ( )O S I N T E X I T ( )O S _ T A S K _ S W ( )O S _ T A S K C R E A T E ( )O S T A S K C R E A T R E X T ( )任 務 的 C P U 使 用 權(quán) 被 剝 奪O S I N T E X I T ( )O S T A S K D E L ( ) A Free sample background from Slide 104 ? 睡眠態(tài)( Dormant) 指任務駐留在程序空間中,還沒有交給 μC/OS Ⅱ 管理,把任務交給 μC/OS Ⅱ是通過調(diào)用下述兩個函數(shù)之一: OSTaskCreate()或 OSTaskCreateExt()。 ? 就緒態(tài) ( Ready) 當任務一旦建立,這個任務就進入就緒態(tài)準備運行。任務的建立可以是在多任務運行開始之前,也可以是動態(tài)地被一個運行著的任務建立。 A Free sample background from Slide 105 ? 運行態(tài)( Running) 準備就緒的最高優(yōu)先級的任務獲得 CPU的控制權(quán),從而處在運行態(tài)。 (調(diào)用OSStart()可以啟動多任務)。任何時候只有一個任務處于運行態(tài)。指針 OSTCBCur指向正在運行的任務。 ? 等待或掛起態(tài)( Pending) 正在運行的任務由于調(diào)用延時函數(shù) OSTimeDly() 或等待事件信號量的來臨而將自身掛起,因而處于等待或掛起態(tài)。因等待某事件而被掛起的任務放在該事件的等待列表中。 A Free sample background from Slide 106 ? 中斷態(tài)( Interrupt) 正在運行的任務可以被中斷。除非是該任務將中斷關(guān)閉。被中斷了任務進入中斷服務態(tài)( ISR)。 如果中斷服務程序使一個更高優(yōu)先級的任務準備就緒,在中斷服務程序結(jié)束后,最高優(yōu)先級的任務開始運行。 A Free sample background from Slide 107 任務控制塊( OS_TCB ) ? 任務控制塊 OS_TCB是一個數(shù)據(jù)結(jié)構(gòu),保存該任務的相關(guān)參數(shù),包括任務堆棧指針、狀態(tài)、優(yōu)先級、任務表位置、任務鏈表指針等。當任務重新獲得CPU使用權(quán)時,任務控制塊能確保任務從當時被中斷的那一點繼續(xù)執(zhí)行。 ? 一旦任務建立,一個任務控制塊 OS_TCB就被賦值 ,程序清單如下: A Free sample background from Slide 108 typedef struct os_tcb { OS_STK *OSTCBStkPtr。 if OS_TASK_CREATE_EXT_EN0 void *OSTCBExtPtr。 OS_STK *OSTCBStkBottom。 INT32U OSTCBStkSize。 INT16U OSTCBOpt。 INT16U OSTCBId。 endif struct os_tcb *OSTCBNext。 struct os_tcb *OSTCBPrev。 if (OS_Q_EN 0 amp。amp。 (OS_MAX_QS 0)) || (OS_MBOX_EN 0) || (OS_SEM_EN 0) || (OS_MUTEX_EN 0) OS_EVENT *OSTCBEventPtr。 endif A Free sample background from Slide 109 if ((OS_Q_EN 0 amp。amp。 (OS_MAX_QS 0)) || (OS_MBOX_EN 0) void *OSTCBMsg。 endif if (OS_VERSION =251)amp。amp。 (OS_FLAG_EN 0) amp。amp。 (OS_MAX_FLAGS 0) if OS_TASK_DEL_EN 0 OS_FLAG_NODE *OSTCBFlagNode。 endif OS_FLAGS *OSTCBFlagRdy。 endif A Free sample background from Slide 110 INT16U OSTCBDly。 INT8U OSTCBStat。 INT8U OSTCBPrio。 INT8U OSTCBX。 INT8U OSTCBY。 INT8U OSTCBBitX。 INT8U OSTCBBitY。 if OS_TASK_DEL_EN 0 BOOLEAN OSTCBDelReq。 endif } OS_TCB。 A Free sample background from Slide 111 ? 任務控制塊 OS_TCB中幾個成員的算法 OSTCBY = priority 3。 OSTCBBitY = OSMapTbl[priority 3]。 OSTCBX = priority amp。 0x07。 OSTCBBitX = OSMapTbl[priority amp。 0x07]。 A Free sample background from Slide 112 ? 任務 控制塊 鏈表 所有的任務控制塊分為兩條鏈表,空閑鏈表和使用鏈表。 所有的任務控制塊都被放置在任務控制塊列表數(shù)組 OSTCBTbl[]中,系統(tǒng)初始化時,所有任務控制塊被鏈接成空任務控制塊的單向鏈表,任務建立后,空任務控制塊指針 OSTCBFreeList指向的任務控制塊就賦給了該任務,然后OSTCBFreeList的值調(diào)整為指向鏈表中的下一個空任務控制塊。一旦任務被刪除,任務控制塊就還給空任務鏈表。 A Free sample background from Slide 113 L i s t o f f r e e O S _ T C B sO S T C BN e x t .O S T C BN e x t .O S T C BN e x t .O S T C BN e x t .O S T C B F r e e L i s tO S T C B T b l [ 0 ] O S T C B T b l [ 1 ]O S T C B T b l [ 2 ]0O S T C B T b l [ O S _ M A X _ T A S K + O S _ N _ S Y S _ T A S K 1 ]A Free sample background from Slide 114 ? 任務控制塊初始化 INT8U OS_TCBInit ( INT8U prio, OS_STK *ptos, OS_STK *pbos, INT16U id, INT32U stk_size, void *pext, INT16U opt ) { …… } A Free sample background from Slide 115 ? OS_TCBInit接收 7個參數(shù): ? prio 任務優(yōu)先級 , 保存在 OSTCBPrio中 。 ? ptos 是指向棧頂?shù)闹羔?, 保存在 OSTCBStkPtr中 。 ? pbos 指向棧底的指針 , 保存在 OSTCBStkBottom中 。 ? id 任務標識符 , 保存在 .OSTCBId中 。 ? stk_size 棧的容量 , 保存在 OSTCBStkSize中 。 ? pext OS_TCB中的擴展指針 .OSTCBExtPtr的值 。 ? opt OS_TCB中的選擇項 , 保存在 .OSTCBOpt中 。 A Free sample background from Slide 116 就緒表( Ready List) ?C/OSⅡ 是可剝奪型實時多任務內(nèi)核,優(yōu)先級最高的任務一旦準備就緒,則擁有 CPU的所有權(quán)開始投入運行。每個任務被賦予唯一的不同的優(yōu)先級 ,所以任務調(diào)度的工作就是:查找準備就緒的最高優(yōu)先級的任務并進行上下文切換。 A Free sample background from Slide 117 ? 就緒表( Ready List) ? 每個任務被賦予不同的優(yōu)先級等級 , 從 0級到最低優(yōu)先級 OS_LOWEST_PRIO 。 當 μC/OS Ⅱ初始化的時候 , 最低優(yōu)先級 OS_LOWEST_PRIO總是被賦給空閑任務 idle task。 ? 高優(yōu)先級有小優(yōu)先級號 。 ? 最多任務數(shù)目 OS_MAX_TASKS和最低優(yōu)先級數(shù)是沒有關(guān)系的 。 ? 每個就緒的任務都放入就緒表中( ready list) 中,就緒表有兩個變量: OSRdyGrp、 OSRdyTbl[]。 A Free sample background from Slide 118 7 6 5 4 3 2 1 07 6 5 4 3 2 1 01 5 1 4 1 3 1 2 1 1 1 0 9 82 3 2 2 2 1 2 0 1 9 1 8 1 7 1 63 1 3 0 2 9 2 8 2 7 2 6 2 5 2 43 9 3 8 3 7 3 6 3 5 3 4 3 3 3 24 7 4 6 4 5 4 4 4 3 4 2 4 1 4 05 5 5 4 5 3 5 2 5 1 5 0 4 9 4 86 3 6 2 6 1 6 0 5 9 5 8 5 7 5 6[ 0 ][ 1 ][ 2 ][ 3 ][ 4 ][ 5 ][ 6 ][ 7 ]O S R d y G r pO S R d y T b l [ O S _ L O W S E T _ P R I O / B + 1 ]XY最 高 優(yōu) 先 級 任 務最 低 優(yōu) 先 級 任 務( i d l e t a s k )任 務 優(yōu) 先 級 號0 0 Y Y Y X X X任 務 優(yōu) 先 級O S R d y T b l [ O S _ L O W S E T _ P R I O / B + 1 ] 中 的 位 置也 用 于 對 O S R d y T b l [ O S _ L O W S E T _ P R I O / B + 1 ] 的 索 引A Free sample background from Slide 119 ? 使任務進入就緒態(tài) 根據(jù)任務的優(yōu)先級確定就緒表,即把任務在 就緒表中所對應的位置置 1。 A Free sample background from Slide 120 ? 舉例 ? 假設優(yōu)先級為 12