版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第三章第三章 任務(wù)管理任務(wù)管理C/OS-的任務(wù)管理的原理與實(shí)現(xiàn)方法 C/OS-的9個(gè)核心任務(wù)管理函數(shù) C/OS-的9個(gè)用戶(hù)任務(wù)管理函數(shù)。 第3章 任務(wù)管理本章主要講述本章主要講述嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第三章第三章 任務(wù)管理任務(wù)管理3.1 核心任務(wù)管理表表3.1 93.1 9個(gè)核心任務(wù)管理函數(shù)一覽表個(gè)核心任務(wù)管理函數(shù)一覽表核心任務(wù)管理函數(shù)核心任務(wù)管理函數(shù)功能功能配置常量配置常量OS_ENTER_CRITICAL()OS_ENTER_CRITICAL()關(guān)中斷(宏)關(guān)中斷(宏)無(wú)無(wú)OS_E
2、XIT_CRITICAL()OS_EXIT_CRITICAL()開(kāi)中斷(宏)開(kāi)中斷(宏)無(wú)無(wú)OSInit()OSInit()多任務(wù)初始化多任務(wù)初始化無(wú)無(wú)OSStartOSStart() ()多任務(wù)啟動(dòng)多任務(wù)啟動(dòng)無(wú)無(wú)OSSchedLockOSSchedLock() ()調(diào)度上鎖調(diào)度上鎖OS_SCHED_LOCK_ENOS_SCHED_LOCK_ENOSSchedUnlockOSSchedUnlock() ()調(diào)度解鎖調(diào)度解鎖OS_SCHED_LOCK_ENOS_SCHED_LOCK_ENOS_SchedOS_Sched() ()任務(wù)調(diào)度任務(wù)調(diào)度無(wú)無(wú)OSTaskIdleOSTaskIdle() (
3、)空閑任務(wù)空閑任務(wù)無(wú)無(wú)OSTaskStatOSTaskStat() ()統(tǒng)計(jì)任務(wù)統(tǒng)計(jì)任務(wù)OS_TASK_STAT_ENOS_TASK_STAT_EN嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第三章第三章 任務(wù)管理任務(wù)管理3.1.1 臨界區(qū)的處理(Critical Sections) 一、臨界區(qū)的處理方法一、臨界區(qū)的處理方法 和其它內(nèi)核一樣,和其它內(nèi)核一樣,CC/OS-/OS-為了處理臨界區(qū)代碼需要為了處理臨界區(qū)代碼需要關(guān)中斷,處理完畢后再開(kāi)中斷。關(guān)中斷,處理完畢后再開(kāi)中斷。 C C/OS-/OS-定義了兩個(gè)宏定義了兩個(gè)宏(macros)(macros)來(lái)來(lái)關(guān)中斷關(guān)中斷和
4、和開(kāi)中斷開(kāi)中斷,以便避開(kāi)不同以便避開(kāi)不同C C編譯器廠(chǎng)商選擇不同的方法來(lái)處理關(guān)中斷編譯器廠(chǎng)商選擇不同的方法來(lái)處理關(guān)中斷和開(kāi)中斷。和開(kāi)中斷。這兩個(gè)宏調(diào)用是這兩個(gè)宏調(diào)用是OS_ENTER_CRITICAL()OS_EXIT_CRITICAL() 這兩個(gè)宏的定義取決于所用的微處理器,故在文件這兩個(gè)宏的定義取決于所用的微處理器,故在文件OS_CPU.HOS_CPU.H中可以找到相應(yīng)宏定義。每種微處理器都有自中可以找到相應(yīng)宏定義。每種微處理器都有自己的己的OS_CPU.HOS_CPU.H文件。文件。嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第三章第三章 任務(wù)管理任務(wù)管理什么是“宏
5、定義”簡(jiǎn)單地說(shuō),宏定義就是定義一種符號(hào)來(lái)代替另外一種符號(hào)。特點(diǎn):宏定義只是在編譯前做一個(gè)簡(jiǎn)單的替換,它不進(jìn)行錯(cuò)誤檢查。要等到編譯開(kāi)始后,才能對(duì)替換的字符串進(jìn)行錯(cuò)誤檢查。 宏定義又分為兩類(lèi):1.不帶參數(shù)的宏定義,格式:#define 標(biāo)識(shí)符字符串2.帶參數(shù)的宏定義 , 格式: #define 標(biāo)識(shí)符(參數(shù))字符串宏定義的取消:格式:#undef 標(biāo)識(shí)符 例:1.#define PI 3.14 不帶參數(shù)2.#define S(R) PI*R*R 帶參數(shù)3.#define S1(R) PI*(R)*(R) 帶參數(shù)4.undef PI 取消宏定義5.# undef S(R)嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)
6、操作系統(tǒng)C/OS-C/OS-教程教程 第三章第三章 任務(wù)管理任務(wù)管理1. 1.OS_CRITICAL_METHOD = 1OS_CRITICAL_METHOD = 1直接開(kāi)關(guān),優(yōu)點(diǎn):最簡(jiǎn)單;缺點(diǎn):可能會(huì)破壞中斷原來(lái)的狀態(tài)例如:#define OS_ENTER_CRITICAL() EA = 0 / 關(guān)中斷#define OS_EXIT_CRITICAL() EA = 1 / 開(kāi)中斷關(guān)(原狀態(tài))處理臨界段代碼關(guān)(現(xiàn)在)處理完畢開(kāi)結(jié)果:中斷被打開(kāi)原始狀態(tài)被破壞2.2.OS_CRITICAL_METHOD = 2OS_CRITICAL_METHOD = 2用堆棧保存中斷開(kāi)關(guān)狀態(tài)優(yōu)點(diǎn):保護(hù)了原始中斷狀
7、態(tài),缺點(diǎn):必須使用匯編代碼,如果某些編譯器對(duì)嵌入?yún)R編代碼優(yōu)化得不好將導(dǎo)致嚴(yán)重錯(cuò)誤。例如:#define OS_ENTER_CRITICAL() asm(“ PUSH PSW”) asm(“DI”)#define OS_EXIT_CRITICAL() asm(“POP PSW”)3.3.OS_CRITICAL_METHOD = 3OS_CRITICAL_METHOD = 3用局部變量保存中斷開(kāi)關(guān)狀態(tài)例如:OS_CPU_SR cpu_sr;#define ENTER_CRITICAL() cpu_sr = get_processor_psw(); Disable_interrupt();#defi
8、ne OS_EXIT_CRITICAL set_processor_psw(cpu_sr);二、開(kāi)關(guān)中斷的方法嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第三章第三章 任務(wù)管理任務(wù)管理3.1.2 任務(wù)的形式一、任務(wù)的形式C/OS-的的任務(wù)就是一個(gè)任務(wù)就是一個(gè)C C函數(shù),它具有如下特征:函數(shù),它具有如下特征:(1)具有一個(gè)返回類(lèi)型和一個(gè)形式參數(shù))具有一個(gè)返回類(lèi)型和一個(gè)形式參數(shù)(2)形式參數(shù)必須定義成一個(gè))形式參數(shù)必須定義成一個(gè)void類(lèi)型的指針類(lèi)型的指針(3)任務(wù)的返回類(lèi)型必須定義成)任務(wù)的返回類(lèi)型必須定義成void型型(4)任務(wù)的函數(shù)類(lèi)型必須定義成可重入型)任務(wù)的函數(shù)類(lèi)型
9、必須定義成可重入型(5)任務(wù)永不返回)任務(wù)永不返回(6)任務(wù)的結(jié)構(gòu)必須是兩種之一)任務(wù)的結(jié)構(gòu)必須是兩種之一無(wú)限循環(huán)結(jié)構(gòu)無(wú)限循環(huán)結(jié)構(gòu)只執(zhí)行一次就被刪除只執(zhí)行一次就被刪除的結(jié)構(gòu)的結(jié)構(gòu) 任務(wù)刪除后,其代碼依然駐留在任務(wù)刪除后,其代碼依然駐留在RAM中,只是中,只是 C/OS-將任務(wù)轉(zhuǎn)將任務(wù)轉(zhuǎn)入休眠狀態(tài),不再管理該段代碼,而不是將代碼真正的刪除了,除非重入休眠狀態(tài),不再管理該段代碼,而不是將代碼真正的刪除了,除非重新啟動(dòng),否則代碼永遠(yuǎn)都不會(huì)再運(yùn)行。新啟動(dòng),否則代碼永遠(yuǎn)都不會(huì)再運(yùn)行。嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第三章第三章 任務(wù)管理任務(wù)管理程序清單程序清單3.1 3
10、.1 任務(wù)結(jié)構(gòu)一:任務(wù)結(jié)構(gòu)一: 任務(wù)是一個(gè)無(wú)限循環(huán)任務(wù)是一個(gè)無(wú)限循環(huán) void YourTask (void *ppdata) reentrant for (;) 用戶(hù)代碼用戶(hù)代碼; 調(diào)用調(diào)用C/OS-II的某種系統(tǒng)服務(wù)的某種系統(tǒng)服務(wù): OSMboxPend(); OSQPend(); OSSemPend(); OSTaskSuspend(OS_PRIO_SELF); OSTimeDly(); OSTimeDlyHMSM(); 用戶(hù)代碼用戶(hù)代碼; 二、無(wú)限循環(huán)結(jié)構(gòu)的任務(wù)嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第三章第三章 任務(wù)管理任務(wù)管理void MyTask(voi
11、d *ppdata) reentrant *ppdata = *ppdata;/ / 使用一次形式參量,避免出現(xiàn)編譯錯(cuò)誤使用一次形式參量,避免出現(xiàn)編譯錯(cuò)誤 用戶(hù)代碼;用戶(hù)代碼; OSTaskDel(OS_PRIO_SELF);三、執(zhí)行一次就刪除結(jié)構(gòu)的任務(wù)程序清單程序清單3.2 3.2 任務(wù)結(jié)構(gòu)二:任務(wù)執(zhí)行一次就自我刪除示意性代碼任務(wù)結(jié)構(gòu)二:任務(wù)執(zhí)行一次就自我刪除示意性代碼 任務(wù)刪除后,其代碼依然駐留在任務(wù)刪除后,其代碼依然駐留在RAM中,只是中,只是 C/OS-將任務(wù)轉(zhuǎn)將任務(wù)轉(zhuǎn)入休眠狀態(tài),不再管理該段代碼,而不是將代碼真正的刪除了,除非重新入休眠狀態(tài),不再管理該段代碼,而不是將代碼真正的刪除了
12、,除非重新啟動(dòng),否則代碼永遠(yuǎn)都不會(huì)再運(yùn)行。啟動(dòng),否則代碼永遠(yuǎn)都不會(huì)再運(yùn)行。嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第三章第三章 任務(wù)管理任務(wù)管理1.C/OS-可以管理多達(dá)64個(gè)任務(wù),但目前版本的C/OS-有兩個(gè)任務(wù)已經(jīng)被系統(tǒng)占用了。2.必須給每個(gè)任務(wù)賦以不同的優(yōu)先級(jí),優(yōu)先級(jí)可以從0到OS_LOWEST_PR10-2。建議保留8個(gè)優(yōu)先級(jí)以備將來(lái)使用:0、1、2、3、OS_LOWEST_PRIO-3、OS_LOWEST_PRI0-2,OS_LOWEST_PRI0-1以及OS_LOWEST_PRI0。 3.優(yōu)先級(jí)號(hào)越低,任務(wù)的優(yōu)先級(jí)越高。4.C/OS-總是運(yùn)行進(jìn)入就緒態(tài)的優(yōu)
13、先級(jí)最高的任務(wù)。5.目前版本的C/OS-中,任務(wù)的優(yōu)先級(jí)號(hào)就是任務(wù)編號(hào)(ID)。6.優(yōu)先級(jí)號(hào)(或任務(wù)的ID號(hào))也被一些內(nèi)核服務(wù)函數(shù)調(diào)用,如改變優(yōu)先級(jí)函數(shù)OSTaskChangePrio(),以及任務(wù)刪除函數(shù)OSTaskDel()。7.為了使C/OS-能管理用戶(hù)任務(wù),用戶(hù)必須在建立一個(gè)任務(wù)的時(shí)候,將任務(wù)的起始地址與其它參數(shù)一起傳給:OSTastCreat或OSTaskCreatExt()。四、應(yīng)用要點(diǎn)嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第三章第三章 任務(wù)管理任務(wù)管理3.1.3 3.1.3 任務(wù)的狀態(tài)任務(wù)的狀態(tài) 圖圖3.1 3.1 任務(wù)的五種狀態(tài)及其相互轉(zhuǎn)換任務(wù)的五種
14、狀態(tài)及其相互轉(zhuǎn)換 掛起態(tài)休眠態(tài)就緒態(tài)運(yùn)行態(tài)被中斷態(tài)中斷OSTaskDel ()OSTaskCreate ()OSTaskCreateExt ()OSStart ()OSIntExit ()OS_TASK _SW()任務(wù)的 CPU使用權(quán)被剝奪OSIntExit()OSTaskDel ()OSFlagPost () OSMboxPostOpt ()OSQPost () OSQPostOpt () OSTaskResume () OSFlagPend ()OSMboxPend ()OSMutexPend ()OSSmPend ()OSTaskSuspend ()OSTimeDly ()OSTimeD
15、lyHMSM()OSTaskDel ()OSMboxPost ()OSMutexPost ()OSQPostFront ()OSSemPost ()OSTimeDlyResime()OSTimeTick ()嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第三章第三章 任務(wù)管理任務(wù)管理3.1.4 任務(wù)控制塊(Task Control Blocks, OS_TCB) 任務(wù)控制塊是一個(gè)數(shù)據(jù)結(jié)構(gòu),其功能如下:1.一旦任務(wù)建立了,任務(wù)控制塊OS_TCB將被賦值 ;2.當(dāng)任務(wù)的CPU使用權(quán)被剝奪時(shí),C/OS-用它來(lái)保存該任務(wù)的狀態(tài) ;3.當(dāng)任務(wù)重新得到CPU使用權(quán)時(shí),任務(wù)控制塊能確保任
16、務(wù)從當(dāng)時(shí)被中斷的那一點(diǎn)絲毫不差地繼續(xù)執(zhí)行。 OS_TCB全部駐留在RAM中。一、什么是任務(wù)控制塊?有何作用?嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第三章第三章 任務(wù)管理任務(wù)管理二、任務(wù)控制塊的數(shù)據(jù)結(jié)構(gòu)詳解程序清單程序清單3.3 C/OS-任務(wù)控制塊任務(wù)控制塊typedef struct os_tcb OS_STK *OSTCBStkPtr; / 指向當(dāng)前任務(wù)棧頂?shù)闹羔?#if OS_TASK_CREATE_EXT_EN 0void *OSTCBExtPtr; / 指向用戶(hù)定義的TCB擴(kuò)展數(shù)據(jù)域的指針OS_STK *OSTCBStkBottom;/ 指向任務(wù)棧底的指針
17、 INT32U OSTCBStkSize;/ 任務(wù)棧的容量(以堆棧入口寬度為單位) INT16U OSTCBOpt; / 傳遞給OSTaskCreateExt() 的選擇項(xiàng)INT16U OSTCBId; / 任務(wù)的16位標(biāo)識(shí)碼(065535) #endifstruct os_tcb *OSTCBNext;/ 指向下一個(gè)任務(wù)控制塊的指針struct os_tcb *OSTCBPrev;/ 指向上一個(gè)任務(wù)控制塊的指針 #if OS_EVENT_EN 0 OS_EVENT *OSTCBEventPtr;/ 指向事件控制塊ECB的指針 #endif #if (OS_Q_EN 0) & (OS_
18、MAX_QS 0) | (OS_MBOX_EN 0)void *OSTCBMsg;/ 指向傳遞給郵箱或者隊(duì)列的消息的指針 #endif嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第三章第三章 任務(wù)管理任務(wù)管理 #if (OS_FLAG_EN 0) & (OS_MAX_FLAGS 0) #if OS_TASK_DEL_EN 0 OS_FLAG_NODE *OSTCBFlagNode;/ 指向事件標(biāo)志節(jié)點(diǎn)的指針 #endifOS_FLAGS OSTCBFlagsRdy;/ 事件標(biāo)志組中使等待任務(wù)進(jìn)入就緒的事件標(biāo)志 #endifINT16U OSTCBDly; / 任務(wù)
19、延時(shí)或者等待超時(shí)時(shí)限的時(shí)鐘節(jié)拍數(shù)INT8U OSTCBStat; / 任務(wù)的狀態(tài)字INT8U OSTCBPrio; / 任務(wù)的優(yōu)先級(jí)(0 = 最低,63 =最低)INT8U OSTCBX; / 為了加快任務(wù)進(jìn)入就緒或者進(jìn)入等待 / 事件發(fā)生狀態(tài)而事先算好的變量INT8U OSTCBY;INT8U OSTCBBitX;INT8U OSTCBBitY; #if (OS_TASK_DEL_EN 0) & (OS_TASK_DEL_REQ_EN 0)BOOLEAN OSTCBDelReq; / 指示任務(wù)是否需要?jiǎng)h除的布爾變量 #endif OS_TCB;嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/
20、OS-C/OS-教程教程 第三章第三章 任務(wù)管理任務(wù)管理1.OS_TCB數(shù)據(jù)結(jié)構(gòu)中的一些成員變量使用了條件編譯語(yǔ)句定義,為的是便于用戶(hù)裁剪不需要的功能,以減少對(duì)資源的需求。 2.文件OS_CFG.H定義了應(yīng)用程序中最多任務(wù)數(shù)量(OS_MAX_TASKS),每個(gè)任務(wù)都有一個(gè)單獨(dú)的任務(wù)控制塊,所以最多任務(wù)數(shù)也是C/OS-分配給用戶(hù)程序任務(wù)控制塊的最大數(shù)量。3.最多任務(wù)數(shù)OS_MAX_TASKS不能超過(guò)最低優(yōu)先級(jí)數(shù),可以小于它,但最小值必須大于2。假如最低優(yōu)先級(jí)數(shù)設(shè)置為31的話(huà),共有32個(gè)優(yōu)先級(jí)的級(jí)別,用戶(hù)應(yīng)用程序可以只有10個(gè)任務(wù),但是加上系統(tǒng)內(nèi)部使用的任務(wù)不能超過(guò)32個(gè)任務(wù)。OS_MAX_TAS
21、KS的數(shù)目設(shè)置應(yīng)根據(jù)實(shí)際需要盡可能地小,以減小對(duì)RAM的需求量。 三、特點(diǎn)嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第三章第三章 任務(wù)管理任務(wù)管理4.所有的OS_TCB都放在任務(wù)控制塊列表數(shù)組OSTCBTbl中。5.C/OS-分配給系統(tǒng)任務(wù)OS_N_SYS_TASKS若干個(gè)任務(wù)控制塊(見(jiàn)文件C/OS-.H),供其內(nèi)部使用。6.目前的系統(tǒng)任務(wù)只有兩個(gè):空閑任務(wù)統(tǒng)計(jì)任務(wù),使用前提是置OS_TASK_STAT_EN為1。7.如圖3.2所示,在C/OS-初始化的時(shí)候,所有任務(wù)控制塊被. .OSTCBNext指針鏈接成單向空閑任務(wù)鏈表,最后一個(gè)任務(wù)控制塊的. .OSTCBNext
22、指針指向一個(gè)空??臻e任務(wù)控制塊指針OSTCBFreeList永遠(yuǎn)指向第一個(gè)空的任務(wù)控制塊;一旦任務(wù)建立,指針OSTCBFreeList指向的任務(wù)控制塊便賦給了該任務(wù),然后將OSTCBFreeList指針指向鏈表中下一個(gè)空的任務(wù)控制塊;任務(wù)一旦被刪除,任務(wù)控制塊還必須還給空閑任務(wù)鏈表。嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第三章第三章 任務(wù)管理任務(wù)管理圖圖3.2 空任務(wù)控制塊列表空任務(wù)控制塊列表 嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第三章第三章 任務(wù)管理任務(wù)管理3.1.5 3.1.5 就緒表(就緒表(Ready ListReady Lis
23、t) 一一 定義定義:用于存放任務(wù)就緒標(biāo)志的列表,它是為了保證每次任務(wù)切換時(shí)間的可確定性、一致性和高速性而設(shè)置的。二二 組成組成:兩個(gè)變量、兩個(gè)表格和三個(gè)算法1. 1.兩個(gè)變量?jī)蓚€(gè)變量:OSRedyGrpOSRdyTbl在OSRdyGrp中,任務(wù)按優(yōu)先級(jí)分組,8個(gè)任務(wù)為一組。OSRdyGrp中的每一位表示8組任務(wù)中每一組中是否有進(jìn)入就緒態(tài)的任務(wù)。任務(wù)進(jìn)入就緒態(tài)時(shí),就緒表OSRdyTbl中的相應(yīng)元素的相應(yīng)位也置位。就緒表OSRdyTbl數(shù)組的大小取決于OS_LOWEST_PR1O當(dāng)用戶(hù)的應(yīng)用程序中任務(wù)數(shù)目比較少時(shí),減少OS_LOWEST_PR1O的值可以降低C/OS-對(duì)RAM的需求量。嵌入式實(shí)時(shí)
24、操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第三章第三章 任務(wù)管理任務(wù)管理2.2.兩個(gè)表格兩個(gè)表格:位掩碼表:OSMapTbl優(yōu)先級(jí)判定表:OSUnMapTbl3.三個(gè)算法三個(gè)算法:使任務(wù)進(jìn)入就緒使任務(wù)脫離就緒尋找優(yōu)先級(jí)最高的任務(wù)嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第三章第三章 任務(wù)管理任務(wù)管理圖圖3.3 任務(wù)就緒表任務(wù)就緒表 嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第三章第三章 任務(wù)管理任務(wù)管理表表3.2 3.2 位掩碼表位掩碼表OSMapTblOSMapTbl 的值的值下標(biāo)下標(biāo)位掩碼(二進(jìn)制位掩碼(二進(jìn)制) )000000
25、001100000010200000100300001000400010000500100000601000000710000000嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第三章第三章 任務(wù)管理任務(wù)管理INT8U const OSUnMapTbl = 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, 0, 4, 0, 1, 0, 2, 0,
26、 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, 0, 2, 0, 1, 0, 3, 0,
27、 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, 0, 3, 0, 1, 0, 2, 0,
28、 1, 0;優(yōu)先級(jí)判定表優(yōu)先級(jí)判定表OSUnMapTblOSUnMapTbl 嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第三章第三章 任務(wù)管理任務(wù)管理1. 1.原理原理:根據(jù)優(yōu)先級(jí),將緒表OSRdyTbl中的相應(yīng)元素的相應(yīng)位置位2.2.實(shí)現(xiàn)方法實(shí)現(xiàn)方法: OSRdyGrp相應(yīng)位置1OSRdyTbl置位3.3.實(shí)現(xiàn)代碼實(shí)現(xiàn)代碼:如程序清單3.5所示。程序清單程序清單 3.5 3.5 使任務(wù)進(jìn)入就緒態(tài)算法使任務(wù)進(jìn)入就緒態(tài)算法OSRdyGrp |= OSMapTblprio 3;OSRdyTblprio 3 |= OSMapTblprio & 0 x07;三、內(nèi)核如何
29、確定哪些任務(wù)準(zhǔn)備就緒了呢?三、內(nèi)核如何確定哪些任務(wù)準(zhǔn)備就緒了呢?嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第三章第三章 任務(wù)管理任務(wù)管理四、如何使一個(gè)任務(wù)脫離就緒?四、如何使一個(gè)任務(wù)脫離就緒?1. 1.實(shí)現(xiàn)原理與方法實(shí)現(xiàn)原理與方法先將OSRdyTbl中相應(yīng)元素的相應(yīng)位清零;當(dāng)被刪除任務(wù)所在任務(wù)組中全組任務(wù)一個(gè)都沒(méi)有進(jìn)入就緒態(tài)時(shí),才將OSRdyGrp相應(yīng)位清零。2.2.實(shí)現(xiàn)代碼實(shí)現(xiàn)代碼 :如程序清單3.6程序清單程序清單 3.6 3.6 使任務(wù)脫離緒表算法使任務(wù)脫離緒表算法if (OSRdyTblprio 3 &= OSMapTblprio & 0 x07
30、) = 0) OSRdyGrp &= OSMapTblprio 3;嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第三章第三章 任務(wù)管理任務(wù)管理五、如何找出進(jìn)入就緒的優(yōu)先級(jí)最高的任務(wù)?五、如何找出進(jìn)入就緒的優(yōu)先級(jí)最高的任務(wù)?1.原理:OSRdyTbl中每個(gè)元素的8位代表這一組的8個(gè)任務(wù)哪些進(jìn)入就緒態(tài)了,低位的優(yōu)先級(jí)高于位高的。以這個(gè)元素為下標(biāo)來(lái)查優(yōu)先級(jí)判定表OSUnMapTbl,返回的值就是進(jìn)入就緒態(tài)且優(yōu)先級(jí)最高的任務(wù)所在就緒表中的行和列的值,根據(jù)這兩個(gè)值就可以計(jì)算出該任務(wù)的優(yōu)先級(jí)數(shù)值。 2.實(shí)現(xiàn)代碼程序清單 3.7 找出進(jìn)入就緒態(tài)的優(yōu)先級(jí)最高的任務(wù)y = OSUn
31、MapTblOSRdyGrp;x = OSUnMapTblOSRdyTbly;prio = (y OSTCBStkPtr 任務(wù)棧棧頂指針;/ 見(jiàn)圖3.7(4)OSTCBCur OSTCBHighRdy; / 見(jiàn)圖3.8(1)任務(wù)棧棧頂指針 OSTCBHighRdyOSTCBStkPtr;將任務(wù)棧中全部?jī)?nèi)容裝載到系統(tǒng)棧中;/ 見(jiàn)圖3.8(2)OSTCBCurOSTCBStkPtr 任務(wù)棧棧頂指針; / 見(jiàn)圖3.8(3)將R3、R2、R1、R0、A、PSW從系統(tǒng)棧中彈出; / 見(jiàn)圖3.8(4)調(diào)用中斷返回指令(強(qiáng)制返回PC); / 見(jiàn)圖3.8(5) 五、任務(wù)級(jí)任務(wù)切換示意性代碼五、任務(wù)級(jí)任務(wù)切換示
32、意性代碼嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第三章第三章 任務(wù)管理任務(wù)管理3.1.8 3.1.8 調(diào)度器上鎖和開(kāi)鎖調(diào)度器上鎖和開(kāi)鎖一一 功能功能:1.調(diào)度器上鎖函數(shù)OSSchedlock() 用于禁止任務(wù)調(diào)度,使任務(wù)保持對(duì)CPU的控制權(quán)。2.調(diào)度器開(kāi)鎖函數(shù)OSSchedUnlock(),解除對(duì)任務(wù)調(diào)度的禁止。二二 原理原理:對(duì)全局變量鎖定嵌套計(jì)數(shù)器OSLockNesting進(jìn)行操作,OSLockNesting跟蹤OSSchedLock()函數(shù)被調(diào)用的次數(shù),允許嵌套深度達(dá)255層 1.上鎖函數(shù):對(duì)變量OSLockNesting加1操作2.開(kāi)鎖函數(shù):對(duì)變量OSLock
33、Nesting減1操作三三 應(yīng)用要點(diǎn)應(yīng)用要點(diǎn)1.上鎖后,中斷是可以被識(shí)別的,中斷服務(wù)也能得到。2.函數(shù)OSSchedLock()和OSSchedUnlock()的使用要非常謹(jǐn)慎,因?yàn)樗鼈冇绊慍/OS-對(duì)任務(wù)的正常管理 3.調(diào)用OSSchedLock()以后,用戶(hù)的應(yīng)用程序不得使用任何能將現(xiàn)行任務(wù)掛起的系統(tǒng)調(diào)用。 用戶(hù)程序不得調(diào)用OSMboxPend()、OSQPend()、OSSemPend()、OSTaskSuspend(OS_PR1O_SELF)、OSTimeDly()或OSTimeDlyHMSM(),直到OSLockNesting回零為止。 嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-
34、C/OS-教程教程 第三章第三章 任務(wù)管理任務(wù)管理四、上鎖函數(shù)流程與代碼四、上鎖函數(shù)流程與代碼多任務(wù)是否啟動(dòng)定義第三種方法開(kāi)關(guān)中斷關(guān)中斷鎖定嵌套計(jì)數(shù)器值加1鎖定嵌套計(jì)數(shù)器255?開(kāi)中斷結(jié)束開(kāi)始程程序序清清單單3.10調(diào)調(diào)度度器器上上鎖鎖函函數(shù)數(shù)void OSSchedLock (void) reentrant #if OS_CRITICAL_METHOD = = 3;OS_CPU_SR cpu_sr; #endif if (OSRunning = = TRUE) OS_ENTER_CRITICAL(); if(OSLockNesting 8; + = (INT16U)task 8; / / 計(jì)
35、算保存任務(wù)第一條代碼的高計(jì)算保存任務(wù)第一條代碼的高8 8位位PCPC指針值指針值 * *stkstk+ = 0 x00; + = 0 x00; / PSW/ PSW * *stkstk+ = 0 x0A; + = 0 x0A; / ACC/ ACC * *stk+ = 0 x0B; stk+ = 0 x0B; / B/ B * *stk+ = 0 x00; stk+ = 0 x00; / DPL/ DPL * *stk+ = 0 x00; stk+ = 0 x00; / DPH/ DPH * *stk+ = 0 x00; stk+ = 0 x00; / R0/ R0 * *stk+ = 0 x
36、01; stk+ = 0 x01; / R1/ R1 * *stk+ = 0 x02; stk+ = 0 x02; / R2/ R2 * *stk+ = 0 x03; stk+ = 0 x03; / R3/ R3 * *stk+ = 0 x04; stk+ = 0 x04; / R4/ R4 * *stk+ = 0 x05; stk+ = 0 x05; / R5/ R5 * *stk+ = 0 x06; stk+ = 0 x06; / R6/ R6 * *stkstk+ = 0 x07; + = 0 x07; / R7/ R7 / SP / SP不保存,任務(wù)切換時(shí)根據(jù)硬件堆棧深度計(jì)算得出。不保
37、存,任務(wù)切換時(shí)根據(jù)硬件堆棧深度計(jì)算得出。 * *stk+ = (INT16U) (ptos+MaxStkSizestk+ = (INT16U) (ptos+MaxStkSize) 8; / ) 8; / 計(jì)算并保存可重入棧棧頂指針計(jì)算并保存可重入棧棧頂指針?C_XBP?C_XBP的高的高8 8位值位值 * *stk+ = (INT16U) (ptos+MaxStkSizestk+ = (INT16U) (ptos+MaxStkSize) & 0 xFF; / ) & 0 xFF; / 計(jì)算并保存可重入棧棧頂指針計(jì)算并保存可重入棧棧頂指針?C_XBP?C_XBP的低的低8 8位值
38、位值 return (void return (void * *)ptos)ptos); ); / / 不返回當(dāng)前棧頂,而是返回初始棧頂不返回當(dāng)前棧頂,而是返回初始棧頂 嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第三章第三章 任務(wù)管理任務(wù)管理1.任務(wù)棧的初始化是在任務(wù)建立時(shí)進(jìn)行的,此時(shí)任務(wù)還沒(méi)有運(yùn)行,僅僅為任務(wù)的第一次運(yùn)行做準(zhǔn)備,所以除了PC指針外,其它CPU寄存器的值都沒(méi)有實(shí)際意義。2.不需要保存SP指針,任務(wù)切換時(shí),根據(jù)堆棧深度的實(shí)時(shí)值來(lái)實(shí)現(xiàn)任務(wù)棧與系統(tǒng)棧兩者之間的數(shù)據(jù)交換。堆棧深度值保存在堆棧的初始棧頂,這樣做可以不用復(fù)雜的計(jì)算就能很方便地獲取堆棧深度值,所以程序
39、的返回值不是棧頂?shù)漠?dāng)前指針,而是初始棧頂。初始化時(shí),由于不可能有調(diào)用發(fā)生,SP指針也沒(méi)保存,所以堆棧深度為15字節(jié)。3.與初始化不同的是:一旦任務(wù)運(yùn)行后,所有的寄存器都可能有意義,而且堆棧深度是實(shí)時(shí)變化的,但深度只會(huì)增大,而不會(huì)變得更小。所謂的“全部CPU寄存器”,在這里就是這15個(gè)寄存器。4.任務(wù)棧在初始化時(shí),必須算出可重入棧棧頂指針初值,以為每個(gè)任務(wù)確定可重入棧。編譯系統(tǒng)都有自己的可重入棧指針,注釋中的?C_XBP?C_XBP是KEIL C編譯系統(tǒng)中定義的可重入棧棧頂指針記助符。5.程序清單3.21所示的任務(wù)棧管理模式,這里稱(chēng)為任務(wù)棧的普通管理模式,簡(jiǎn)稱(chēng)簡(jiǎn)稱(chēng)“普通模式普通模式”。四、簡(jiǎn)要說(shuō)
40、明四、簡(jiǎn)要說(shuō)明嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第三章第三章 任務(wù)管理任務(wù)管理一、任務(wù)棧的基本功能一、任務(wù)棧的基本功能1.拷貝任務(wù)即將切換時(shí)系統(tǒng)棧中的保存所有內(nèi)容,即備份系統(tǒng)棧;2.保存可重入?yún)?shù)。二、任務(wù)棧的基本工作過(guò)程二、任務(wù)棧的基本工作過(guò)程當(dāng)任務(wù)需要切換時(shí),1.首先,將當(dāng)前任務(wù)的全部CPU寄存器值壓入系統(tǒng)棧;2.其次,將系統(tǒng)棧中的全部?jī)?nèi)容(全部CPU寄存器值+調(diào)用嵌套所用的CPU寄存器值)拷貝給當(dāng)前任務(wù)的任務(wù)棧,此時(shí)系統(tǒng)棧被清空,可重入棧指針值直接保存到當(dāng)前任務(wù)棧的棧頂;3.第三,再將即將運(yùn)行的任務(wù)的任務(wù)棧中的全部CPU寄存器值以及調(diào)用嵌套所用的CPU寄存
41、器值轉(zhuǎn)移給系統(tǒng)棧,而任務(wù)棧中保存的可重入棧指針值直接從任務(wù)棧中取出賦給可重入棧指針;4.最后從系統(tǒng)棧中彈出全部CPU寄存器值賦給CPU,此時(shí)系統(tǒng)棧未必被全部清空,如任務(wù)在被剝奪使用權(quán)之時(shí)有調(diào)用未返回,此時(shí)系統(tǒng)棧依然保留了與調(diào)用返回相關(guān)的CPU寄存器值。3.2.1.6 3.2.1.6 任務(wù)棧的優(yōu)化任務(wù)棧的優(yōu)化嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第三章第三章 任務(wù)管理任務(wù)管理三、優(yōu)化管理模式的提出三、優(yōu)化管理模式的提出 為了最經(jīng)濟(jì)地利用CPU的數(shù)據(jù)存儲(chǔ)器,最好的方法就是將系統(tǒng)棧和任務(wù)自身的可重入棧完全嵌入到任務(wù)棧中。1、理想的任務(wù)棧管理模式、理想的任務(wù)棧管理模式棧底棧
42、底保存可重入?yún)?shù)值可重入棧頂指針可重入棧頂指針保存CUP寄存器值棧頂棧頂理理想想的的任任務(wù)務(wù)棧棧管管理理模模式式底底部部空空間間頂頂部部空空間間任任務(wù)務(wù)棧??湛臻g間2、普通模式的局限性、普通模式的局限性 目前C/OS-不支持這不支持這種理想管理模式種理想管理模式。原因原因:可重入棧棧頂指針由編譯系統(tǒng)自動(dòng)分配,事先不可預(yù)知,所以無(wú)法保證將可重入棧完全嵌入到任務(wù)??臻g內(nèi)。 缺陷缺陷:普通管理模式使得每個(gè)任務(wù)的可重入??臻g位置具有極大的不確定性。為了克服這種不確定性。 現(xiàn)有的解決方案是:在編譯在編譯前保留一大塊自由空間,并加前保留一大塊自由空間,并加大任務(wù)棧的冗余容量大任務(wù)棧的冗余容量,以確??芍厝?/p>
43、棧能隨機(jī)地嵌入到這些未被占用的內(nèi)存空間內(nèi),這樣便會(huì)增大數(shù)據(jù)存儲(chǔ)器數(shù)量的不必要開(kāi)銷(xiāo)。嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第三章第三章 任務(wù)管理任務(wù)管理1.修改任務(wù)棧初始化函數(shù)OSTaskStkInit(),為其增加一個(gè)指針參數(shù)*pbos(任務(wù)棧棧底指針),其余參數(shù)不變。函數(shù)原型改為:void void * *OSTaskStkInit (OSTaskStkInit (void (void (* *task)(voidtask)(void * *pd)pd),void void * *ppdatappdata,OS_STK OS_STK * *ptosptos,INT
44、16U optINT16U opt,OS_STK OS_STK * *pbospbos) reentrant) reentrant2.修改程序清單3.21中2行代碼任務(wù)棧初始化函數(shù)OSTaskStkInit()程序代碼,將可重入棧指針指向任務(wù)棧的初始棧底。具體方法如下:將倒數(shù)第3行:* *stk+ = (INT16U) (ptos+MaxStkSizestk+ = (INT16U) (ptos+MaxStkSize) 8) 8; 改為 : * *stk+ = (INT16U) (pbosstk+ = (INT16U) (pbos) 8;) 8;將倒數(shù)第2行:* *stk+ = (INT16U)
45、 (ptos+MaxStkSizestk+ = (INT16U) (ptos+MaxStkSize) & 0 xFF) & 0 xFF;改為: * *stk+ = (INT16U) (pbosstk+ = (INT16U) (pbos) & 0 xFF;) & 0 xFF;3.用OSTaskCreateExt()函數(shù)來(lái)建立任務(wù)。這是因?yàn)閮?yōu)化后的任務(wù)棧初始化函數(shù)多了一個(gè)指針參數(shù)*pbos,所以不再能用函數(shù)OSTaskCreate()來(lái)建立任務(wù)。四、優(yōu)化模式的原理與實(shí)現(xiàn)四、優(yōu)化模式的原理與實(shí)現(xiàn) 在“普通模式”中,主要是采取了以犧牲數(shù)據(jù)存儲(chǔ)器數(shù)量來(lái)保證可重入棧安全的策
46、略。為了克服這種缺陷,減少系統(tǒng)對(duì)數(shù)據(jù)存儲(chǔ)器的需求,簡(jiǎn)化系統(tǒng)設(shè)計(jì),本文提出了一種任務(wù)棧的優(yōu)化管理模式。具體實(shí)現(xiàn)方法之一如下:嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第三章第三章 任務(wù)管理任務(wù)管理程序清單程序清單3.22 任務(wù)棧初始化(優(yōu)化模式)任務(wù)棧初始化(優(yōu)化模式)void *OSTaskStkInit (void (*task)(void *pd), void *ppdata, OS_STK *ptos, INT16U opt, OS_STK *pbos) reentrant OS_STK *stk;/ 定義堆棧指針定義堆棧指針 ppdata = ppdata;/
47、ppdata沒(méi)有使用,采用此語(yǔ)句防止產(chǎn)生編譯告警錯(cuò)誤沒(méi)有使用,采用此語(yǔ)句防止產(chǎn)生編譯告警錯(cuò)誤 opt = opt; / opt沒(méi)有使用,采用此語(yǔ)句防止產(chǎn)生編譯告警錯(cuò)誤沒(méi)有使用,采用此語(yǔ)句防止產(chǎn)生編譯告警錯(cuò)誤 stk = (OS_STK *)ptos; / 任務(wù)棧初始棧頂在堆棧的最低有效地址任務(wù)棧初始棧頂在堆棧的最低有效地址 *stk+ = 15; / 需要保存的需要保存的CPU寄存器數(shù)量,對(duì)應(yīng)系統(tǒng)棧深度寄存器數(shù)量,對(duì)應(yīng)系統(tǒng)棧深度 *stk+ = (INT16U)task & 0 xFF; / 任務(wù)第一條代碼的低任務(wù)第一條代碼的低8位程序計(jì)數(shù)器指針(位程序計(jì)數(shù)器指針(PC) *stk+
48、= (INT16U)task 8; / 任務(wù)第一條代碼的高任務(wù)第一條代碼的高8位程序計(jì)數(shù)器指針位程序計(jì)數(shù)器指針 *stk+ = 0 x00; / PSW *stk+ = 0 x0A; / ACC *stk+ = 0 x0B; / B *stk+ = 0 x00; / DPL *stk+ = 0 x00; / DPH *stk+ = 0 x00; / R0 *stk+ = 0 x01; / R1 *stk+ = 0 x02; / R2 *stk+ = 0 x03; / R3 *stk+ = 0 x04; / R4 *stk+ = 0 x05; / R5 *stk+ = 0 x06; / R6 *
49、stk+ = 0 x07; / R7 / SP不保存,任務(wù)切換時(shí)根據(jù)硬件堆棧深度計(jì)算得出。不保存,任務(wù)切換時(shí)根據(jù)硬件堆棧深度計(jì)算得出。 *stk+ = (INT16U) (pbos) 8; / ?C_XBP 可重入棧高可重入棧高8位指針位指針 *stk+ = (INT16U) (pbos) & 0 xFF; / ?C_XBP 可重入棧低可重入棧低8位指針位指針 return (void *)ptos);/ 返回棧頂返回棧頂改兩行!改兩行!增加一個(gè)參數(shù)!增加一個(gè)參數(shù)!嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第三章第三章 任務(wù)管理任務(wù)管理五、結(jié)論五、結(jié)論 經(jīng)過(guò)大量
50、的實(shí)踐表明,優(yōu)化的任務(wù)棧管理模式,經(jīng)過(guò)大量的實(shí)踐表明,優(yōu)化的任務(wù)棧管理模式,可以實(shí)現(xiàn)以任務(wù)棧頂部空間備份系統(tǒng)棧、底部空間可以實(shí)現(xiàn)以任務(wù)棧頂部空間備份系統(tǒng)棧、底部空間嵌入可重入棧的目標(biāo)。在應(yīng)用中,不管嵌入可重入棧的目標(biāo)。在應(yīng)用中,不管CPUCPU寄存器寄存器和可重入?yún)?shù)數(shù)量的多寡,都可以根據(jù)實(shí)際需求量和可重入?yún)?shù)數(shù)量的多寡,都可以根據(jù)實(shí)際需求量絲毫不差地充分利用任務(wù)棧,內(nèi)存空間的利用率可絲毫不差地充分利用任務(wù)棧,內(nèi)存空間的利用率可以精確到個(gè)位數(shù)。極大地較少了系統(tǒng)對(duì)數(shù)據(jù)存儲(chǔ)器以精確到個(gè)位數(shù)。極大地較少了系統(tǒng)對(duì)數(shù)據(jù)存儲(chǔ)器的需求量,降低了系統(tǒng)設(shè)計(jì)的復(fù)雜性。的需求量,降低了系統(tǒng)設(shè)計(jì)的復(fù)雜性。 這里提出的
51、任務(wù)棧優(yōu)化管理模式,以?huà)伌u引玉為盼,僅供讀者參考。后續(xù)章節(jié)的內(nèi)容,依舊按照“普通模式”描述。 嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第三章第三章 任務(wù)管理任務(wù)管理3.2.1.73.2.1.7 應(yīng)用要點(diǎn)應(yīng)用要點(diǎn) 1.在使用任務(wù)棧必須考慮兩個(gè)問(wèn)題堆棧容量問(wèn)題堆棧容量問(wèn)題內(nèi)存碎片問(wèn)題內(nèi)存碎片問(wèn)題2.任務(wù)所需的堆棧容量是由用戶(hù)根據(jù)實(shí)際需要指定的,在確定容量時(shí)必須考慮如下幾方面問(wèn)題:用戶(hù)任務(wù)所調(diào)用函數(shù)的嵌套情況用戶(hù)任務(wù)所調(diào)用函數(shù)的嵌套情況;任務(wù)所調(diào)用函數(shù)的局部變量的數(shù)目任務(wù)所調(diào)用函數(shù)的局部變量的數(shù)目;堆棧必須能保存全部堆棧必須能保存全部CPUCPU寄存器寄存器;無(wú)需考慮中斷嵌
52、套所需堆棧的總量無(wú)需考慮中斷嵌套所需堆棧的總量,因?yàn)樵谥袛嗲短變?nèi)不會(huì)發(fā)生任務(wù)切換。嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第三章第三章 任務(wù)管理任務(wù)管理3.在需動(dòng)態(tài)分配堆棧時(shí),尤其要注意內(nèi)存碎片問(wèn)題。內(nèi)存碎片主要因是用戶(hù)反復(fù)地建立和刪除任務(wù),導(dǎo)致自由內(nèi)存區(qū)不連續(xù)而造成的。若內(nèi)存區(qū)沒(méi)有足夠大的連續(xù)自由空間可作任務(wù)堆棧,malloc()便無(wú)法成功地為任務(wù)分配堆??臻g。 圖圖3.16 3.16 內(nèi)存碎片內(nèi)存碎片(6k)任務(wù)任務(wù)C(2k)任務(wù)任務(wù)A(2k)任務(wù)任務(wù)B(2k)(2k)(2k)任務(wù)任務(wù)B(2k)嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第三
53、章第三章 任務(wù)管理任務(wù)管理3.2.2 3.2.2 建立任務(wù),建立任務(wù),OSTaskCreateOSTaskCreate() () 任務(wù)建立方法如下:任務(wù)建立方法如下:1.任務(wù)可以在多任務(wù)啟動(dòng)前建立,也可以在其它任務(wù)的執(zhí)行過(guò)程中建立。在開(kāi)始多任務(wù)調(diào)度前,用戶(hù)必須至少建立一個(gè)任務(wù);2.任務(wù)不能由中斷服務(wù)程序來(lái)建立。 若要管理用戶(hù)任務(wù),就必須首先利用OSTaskCreateOSTaskCreate() () 或或 OSTaskCreateExtOSTaskCreateExt() ()兩個(gè)函數(shù)中的任意一個(gè)來(lái)建立任務(wù),通過(guò)這兩個(gè)函數(shù)將任務(wù)代碼的地址及其它參數(shù)傳遞給內(nèi)核。 OSTaskCreateOSTa
54、skCreate() ()是向下兼容的,OSTaskCreateExtOSTaskCreateExt() ()則是OSTaskCreateOSTaskCreate() ()的擴(kuò)展版本,提供了一些附加的功能。嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第三章第三章 任務(wù)管理任務(wù)管理3.2.2.1 3.2.2.1 函數(shù)原型函數(shù)原型 INT8U OSTaskCreateINT8U OSTaskCreate ( (void (void (* *task)(voidtask)(void * *pd)pd),void void * *ppdatappdata,OS_STK OS_ST
55、K * *ptosptos,INT8U prio )INT8U prio ) reentrant reentranttasktask 是任務(wù)代碼的指針ppdatappdata 是當(dāng)任務(wù)開(kāi)始執(zhí)行時(shí)傳 遞給任務(wù)的參數(shù)的指針ptosptos 是分配給任務(wù)堆棧的棧 頂指針prioprio 是分配給任務(wù)的優(yōu)先級(jí) 3.2.2.2 3.2.2.2 返回值返回值 返回值為如下內(nèi)容之一:1.OS_NO_ERR 函數(shù)調(diào)用成功;2.OS_PRIO_EXIST 定的優(yōu)先級(jí)已經(jīng)存在;3.OS_PRIO_INVALID指定的優(yōu)先級(jí)大于OS_LOWEST_PRIO;4.OS_NO_MORE_TCB系統(tǒng)中沒(méi)有OS_TCB可以
56、分配給任務(wù)了。嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第三章第三章 任務(wù)管理任務(wù)管理3.2.2.3 3.2.2.3 原理與實(shí)現(xiàn)原理與實(shí)現(xiàn) 嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第三章第三章 任務(wù)管理任務(wù)管理3.2.2.4 3.2.2.4 應(yīng)用要點(diǎn)應(yīng)用要點(diǎn) 1.任務(wù)函數(shù)類(lèi)型必須聲明為可重入型;2.建立任務(wù)前必須為任務(wù)指定任務(wù)棧;3.任務(wù)棧數(shù)據(jù)類(lèi)型必須聲明為OS_STK類(lèi)型,且為全局變量;4.在任務(wù)中必須調(diào)用C/OS-II提供的下述系統(tǒng)函數(shù)之一:任務(wù)延時(shí)、任務(wù)掛起及等待信號(hào)量、消息郵箱及消息隊(duì)列,以便掛起當(dāng)前任務(wù),使其它任務(wù)有機(jī)會(huì)得到CPU的使
57、用權(quán);5.在用戶(hù)程序中,建議不要使用優(yōu)先級(jí):0、1、2、3、OS_LOWEST_PRIO-3,OS_LOWEST_PRIO-2,OS_LOWEST_PRIO-1,OS_LOWEST_PRIO。這些優(yōu)先級(jí)被操作系統(tǒng)保留,其余56個(gè)優(yōu)先級(jí)提供給應(yīng)用程序;6.任務(wù)建立函數(shù)的應(yīng)用模式有多種:一是既可在啟動(dòng)代碼段程序中調(diào)用,也可在任務(wù)中調(diào)用。二是,既可測(cè)試調(diào)用返回值,也可不測(cè)試調(diào)用返回值;7.調(diào)用前,需將配置常量OS_TASK_CREATE_EN設(shè)置為1;8.在任務(wù)中調(diào)用后,可能會(huì)發(fā)生一次任務(wù)切換。嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第三章第三章 任務(wù)管理任務(wù)管理3.2.2
58、.6 3.2.2.6 范例范例 程序清單程序清單3.24 OSTaskCreate() 函數(shù)的應(yīng)用范例函數(shù)的應(yīng)用范例OS_STK Task1Stk100;/ 定義任務(wù)堆棧void main(void) OSInit(); / 初始化操作系統(tǒng)OSTaskCreate(Task1,,(void *)0,&Task1Stk99,20);/ 調(diào)用任務(wù)建立函數(shù),建立任務(wù)OSStart(); / 啟動(dòng)多任務(wù)環(huán)境void Task1(void *ppdata) reentrant INT8U err;ppdata = ppdata; / 防止編譯出現(xiàn)警告信息for(;)err = OSTaskCre
59、ate(Task2,,(void *)0,&Task1Stk99,25);/ 建立任務(wù)if (err = OS_NO_ERR) / 成功建立任務(wù) /* 應(yīng)用程序代碼 */else / 任務(wù)建立不成功 /* 錯(cuò)誤處理代碼 */void Task2(void *ppdata) reentrant ppdata = ppdata; / 防止編譯出現(xiàn)警告信息for(;) /* 應(yīng)用程序代碼 */嵌入式實(shí)時(shí)操作系統(tǒng)嵌入式實(shí)時(shí)操作系統(tǒng)C/OS-C/OS-教程教程 第三章第三章 任務(wù)管理任務(wù)管理3.2.3 3.2.3 建立任務(wù),建立任務(wù),OSTaskCreateExtOSTaskCreateExt(
60、) () INT8U OSTaskCreateExt (void (*task)(void *pd),void *pdata,OS_STK *ptos,INT8U prio,INT16U id,OS_STK *pbos,INT32U stk_size,void *pext,INT16U opt ) reentrant3.2.3.1 3.2.3.1 函數(shù)原型函數(shù)原型3.2.3.2 3.2.3.2 返回值返回值1.OS_NO_ERR 函數(shù)調(diào)用成功;函數(shù)調(diào)用成功;2.OS_PRIO_EXIST 指定的優(yōu)先級(jí)已經(jīng)存在;指定的優(yōu)先級(jí)已經(jīng)存在;3.OS_PRIO_INVALID指定的優(yōu)先級(jí)大于指定的優(yōu)先級(jí)大于OS_LOWEST_PRIO;4.OS_NO_MORE_TCB 系統(tǒng)中沒(méi)有系統(tǒng)中沒(méi)有OS_TCB可可以分配給任務(wù)了。以分配給任務(wù)了。
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二手房按揭買(mǎi)房買(mǎi)賣(mài)合同
- 國(guó)際公路運(yùn)輸合同范本
- 2025船舶買(mǎi)賣(mài)合同書(shū)樣本版
- 提高創(chuàng)新能力的技能培訓(xùn)
- 提高人際關(guān)系的培訓(xùn)課程
- 品牌服務(wù)合同范本
- 2024年公共事業(yè)領(lǐng)域投資合同
- 吊車(chē)零租賃合同范本
- 鋼釘鐵釘售賣(mài)合同
- 2025有限責(zé)任公司銀行貸款擔(dān)保合同
- 七年級(jí)英語(yǔ)閱讀理解55篇(含答案)
- 管理ABC-干嘉偉(美團(tuán)網(wǎng)COO)
- 基于視覺(jué)的工業(yè)缺陷檢測(cè)技術(shù)
- 軍事英語(yǔ)詞匯整理
- 家庭教育指導(dǎo)委員會(huì)章程
- DB31-T 1440-2023 臨床研究中心建設(shè)與管理規(guī)范
- 老客戶(hù)維護(hù)方案
- 高處作業(yè)安全教育培訓(xùn)講義課件
- 萬(wàn)科物業(yè)管理公司全套制度(2016版)
- 動(dòng)物檢疫技術(shù)-動(dòng)物檢疫處理(動(dòng)物防疫與檢疫技術(shù))
- 英語(yǔ)經(jīng)典口語(yǔ)1000句
評(píng)論
0/150
提交評(píng)論