版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、uCOS-II的移植及使用報告人:日 期:2016.1.18uC/OS-II的任務(wù)的任務(wù)uC/OS-II的移植的移植uC/OS-II同步與通信同步與通信uC/OS-II 概述概述uC/OS-III簡介簡介目 錄uC/OS-II 概述 C/OSMicro Controller OS,微控制器操作系統(tǒng) 美國人Jean Labrosse 1992年完成 應(yīng)用面覆蓋了諸多領(lǐng)域,如照相機(jī)、醫(yī)療器械、音響設(shè)備、發(fā)動機(jī)控制、高速公路電話系統(tǒng)、自動提款機(jī)等 1998年出C/OS-II,目前的版本C/OS -II V2.91 2000年,得到美國航空管理局(FAA)的認(rèn)證,可以用于飛行器中 網(wǎng)站uC/OS-II
2、 概述-性能特點(diǎn) 源代碼公開 可移植(Portable) 大部分代碼用ANSI C寫,與處理器無關(guān),移植時不需修改 少量與微處理器硬件相關(guān)的部分用C與匯編編寫,移植時需修改: OS_CPU.H /與硬件相關(guān),移植時需修改 OS_CPU_A.ASM /集中了所有與處理器相關(guān)的匯編語言代碼 OS_CPU.C /集中了所有與處理器相關(guān)的匯編語言代碼uC/OS-II 概述-性能特點(diǎn) 可裁剪(Scalable) 可以只使用 C/OS-II中應(yīng)用程序需要的那些系統(tǒng)服務(wù)。也就是說某產(chǎn)品可以只使用很少幾個 C/OS-II調(diào)用,而另一個產(chǎn)品則使用了幾乎所有 C/OS-II的功能,這樣可以減少產(chǎn)品中的 C/OS-
3、II所需的存儲器空間(RAM和ROM)。 可剪裁性通過條件編譯實現(xiàn)。uC/OS-II 概述-性能特點(diǎn) 可剝奪性(Preemptive)與可確定性 內(nèi)核可剝奪、函數(shù)調(diào)用或系統(tǒng)服務(wù)的執(zhí)行時間具有可確定性,是硬實時操作系統(tǒng)。 支持多任務(wù) C/OS-II可以管理255個任務(wù) 任務(wù)棧 每個任務(wù)有自己單獨(dú)的棧, C/OS-II允許每個任務(wù)有不同的??臻g,以便壓低應(yīng)用程序?qū)AM的需求。uC/OS-II 概述-性能特點(diǎn) 系統(tǒng)服務(wù) C/OS-II提供很多系統(tǒng)服務(wù),例如郵箱、消息隊列、信號量、塊大小固定的內(nèi)存的申請與釋放、時間相關(guān)函數(shù)等。 中斷管理 中斷可以使正在執(zhí)行的任務(wù)暫時掛起,如果優(yōu)先級更高的任務(wù)被該中斷
4、喚醒,則高優(yōu)先級的任務(wù)在中斷嵌套全部退出后立即執(zhí)行,中斷嵌套層數(shù)可達(dá)255層。uC/OS-II 概述-文件結(jié)構(gòu)體系體系結(jié)構(gòu)結(jié)構(gòu)uC/OS-II的任務(wù)的任務(wù)uC/OS-II的移植的移植uC/OS-II同步與通信同步與通信uC/OS-II 概述概述uC/OS-III簡介簡介目 錄uC/OS-II的任務(wù)2.1 任務(wù)組成部分2.2 任務(wù)的結(jié)構(gòu)2.3 任務(wù)存儲結(jié)構(gòu)2.4 任務(wù)狀態(tài)2.5 任務(wù)優(yōu)先級2.6 任務(wù)就緒表及任務(wù)調(diào)度2.7 任務(wù)操作2.8 uC/OS-II的初始化一個完整的任務(wù)應(yīng)該有如下三部分: 任務(wù)代碼(程序) 任務(wù)的私有堆棧(用以保護(hù)運(yùn)行環(huán)境) 任務(wù)控制塊(提供私有堆棧也是虛擬處理器的位置)
5、2.1 uC/OS-II的任務(wù)的任務(wù)組成組成前一個任務(wù)控制塊的指針后一個任務(wù)控制塊的指針指向任務(wù)的指針指向任務(wù)堆棧的指針任務(wù)的優(yōu)先級別 void mytask(void *pdata) for(;) 任務(wù)的代碼任務(wù)的代碼 任務(wù)控制塊任務(wù)控制塊 任務(wù)堆棧任務(wù)堆棧 任務(wù)任務(wù)圖圖2-4 2-4 任務(wù)的組成任務(wù)的組成從應(yīng)用程序設(shè)計的角度來看,任務(wù)就是從應(yīng)用程序設(shè)計的角度來看,任務(wù)就是一個線程。就是一個用來解決用戶問題一個線程。就是一個用來解決用戶問題的的C語言函數(shù)和與之相關(guān)聯(lián)的一些數(shù)據(jù)語言函數(shù)和與之相關(guān)聯(lián)的一些數(shù)據(jù)結(jié)構(gòu)而構(gòu)成的一個實體結(jié)構(gòu)而構(gòu)成的一個實體從任務(wù)存儲結(jié)構(gòu)來看,由三部分構(gòu)成:從任務(wù)存儲結(jié)構(gòu)
6、來看,由三部分構(gòu)成:任務(wù)程序代碼、任務(wù)堆棧和任務(wù)控制塊。任務(wù)程序代碼、任務(wù)堆棧和任務(wù)控制塊。任務(wù)控制塊用來保存任務(wù)屬性,任務(wù)堆任務(wù)控制塊用來保存任務(wù)屬性,任務(wù)堆棧用來保存任務(wù)工作環(huán)境,任務(wù)程序代棧用來保存任務(wù)工作環(huán)境,任務(wù)程序代碼是任務(wù)的執(zhí)行部分碼是任務(wù)的執(zhí)行部分2.1 uC/OS-II的任務(wù)的任務(wù)組成組成 uCOS中的任務(wù)是一個線程,其代碼通常是一個無限循環(huán)結(jié)構(gòu)/超循環(huán)結(jié)構(gòu),看起來像其它C函數(shù)一樣。2.1.1 uC/OS-II的任務(wù)的任務(wù)代碼結(jié)構(gòu)代碼結(jié)構(gòu)void MyTask(void void MyTask(void * *pdata)pdata) for (;) for (;) 可以被中
7、斷的任務(wù)代碼;可以被中斷的任務(wù)代碼;OS_ENTER_CRITICAL();OS_ENTER_CRITICAL();/進(jìn)入臨階段(關(guān)中斷)進(jìn)入臨階段(關(guān)中斷)不不可以被中斷的任務(wù)代碼;可以被中斷的任務(wù)代碼;OS_EXIT_CRITICAL();/退出臨階段退出臨階段 (開中斷開中斷)可以被中斷的任務(wù)代碼;可以被中斷的任務(wù)代碼; 根據(jù)嵌入式系統(tǒng)任務(wù)的工作特點(diǎn),任務(wù)的執(zhí)行代碼通常是一個根據(jù)嵌入式系統(tǒng)任務(wù)的工作特點(diǎn),任務(wù)的執(zhí)行代碼通常是一個無限循環(huán)結(jié)構(gòu),并且在這個循環(huán)中可以響應(yīng)中斷,這種結(jié)構(gòu)也無限循環(huán)結(jié)構(gòu),并且在這個循環(huán)中可以響應(yīng)中斷,這種結(jié)構(gòu)也叫超循環(huán)結(jié)構(gòu)。叫超循環(huán)結(jié)構(gòu)。為了有效的對中斷進(jìn)行控制,
8、在任務(wù)的代碼里可使用為了有效的對中斷進(jìn)行控制,在任務(wù)的代碼里可使用UC/OS-II定義的宏定義的宏OS_ENTER_CRITICAL()和和OS_EXIT_CRITICAL()來控制何時響應(yīng)中斷,來控制何時響應(yīng)中斷,何時屏蔽中斷。在運(yùn)行這兩個宏之間的代碼時是不會響應(yīng)中斷的,這種受保何時屏蔽中斷。在運(yùn)行這兩個宏之間的代碼時是不會響應(yīng)中斷的,這種受保護(hù)的代碼段叫臨界段。護(hù)的代碼段叫臨界段。q 一旦任務(wù)建立,一個任務(wù)控制塊OS_TCB就被賦值。q 任務(wù)控制塊是一個數(shù)據(jù)結(jié)構(gòu),保存該任務(wù)的相關(guān)參數(shù),包括任務(wù)堆棧指針,任務(wù)的當(dāng)前狀態(tài),任務(wù)的優(yōu)先級等。q 任務(wù)CPU使用權(quán)被剝奪時,TCB保存該時刻任務(wù)狀態(tài);
9、任務(wù)重新得到CPU控制權(quán)時,TCB確保任務(wù)從當(dāng)時被中斷的那一點(diǎn)絲毫不差地繼續(xù)執(zhí)行。q OS_TCB全部駐留在RAM中。任務(wù)控制塊就相當(dāng)于是一個任務(wù)的身份證,沒任務(wù)控制塊就相當(dāng)于是一個任務(wù)的身份證,沒有任務(wù)控制塊的任務(wù)是不能被系統(tǒng)承認(rèn)和管理有任務(wù)控制塊的任務(wù)是不能被系統(tǒng)承認(rèn)和管理的。的。 2.1.2 uC/OS-II的任務(wù)的任務(wù)任務(wù)控制塊(TCB)任務(wù)控制塊的結(jié)構(gòu)任務(wù)控制塊的結(jié)構(gòu)typedef struct os_tcb OS_STK *OSTCBStkPtr; /指向當(dāng)前任務(wù)堆棧棧頂?shù)闹羔槨C總€任務(wù)的堆棧容量可以是任意的。#if OS_TASK_CREATE_EXT_EN void *OSTC
10、BExtPtr; /指向任務(wù)控制塊擴(kuò)展的指針,擴(kuò)展功能:任務(wù)執(zhí)行時間、任務(wù)切換次數(shù)、任務(wù)堆棧使用情況等。 OS_STK *OSTCBStkBottom; /指向當(dāng)前任務(wù)堆棧棧底的指針。 INT32U OSTCBStkSize; /任務(wù)堆棧的長度 INT16U OSTCBOpt; /創(chuàng)建任務(wù)時的選擇項 INT16U OSTCBId; /用于存儲任務(wù)的識別碼。保留。#endif struct os_tcb *OSTCBNext; /指向后一個任務(wù)控制塊的指針 struct os_tcb *OSTCBPrev; /指向前一個任務(wù)控制塊的指針#if (OS_Q_EN & (OS_MAX_QS = 2)
11、 | OS_MBOX_EN | OS_SEM_EN OS_EVENT *OSTCBEventPtr; /指向事件控制塊的指針#endif#if (OS_Q_EN & (OS_MAX_QS = 2) | OS_MBOX_EN void *OSTCBMsg; /指向傳遞給任務(wù)消息的指針#endif INT16U OSTCBDly; /任務(wù)等待的時限 INT8U OSTCBStat; /任務(wù)的當(dāng)前狀態(tài)標(biāo)志 INT8U OSTCBPrio; /任務(wù)的優(yōu)先級別 INT8U OSTCBX; /用于快速訪問就緒表的數(shù)據(jù) INT8U OSTCBY; /用于快速訪問就緒表的數(shù)據(jù) INT8U OSTCBBitX;
12、 /用于快速訪問就緒表的數(shù)據(jù) INT8U OSTCBBitY; /用于快速訪問就緒表的數(shù)據(jù)#if OS_TASK_DEL_EN BOOLEAN OSTCBDelReq; /請求刪除任務(wù)時用到的標(biāo)志 #endif OS_TCB;任務(wù)控制塊結(jié)構(gòu)的主要成員任務(wù)控制塊結(jié)構(gòu)的主要成員typedef struct os_tcb OS_STK *OSTCBStkPtr; /指向任務(wù)堆棧棧頂?shù)闹羔樦赶蛉蝿?wù)堆棧棧頂?shù)闹羔?struct os_tcb *OSTCBNext;/指向后一個任務(wù)控制塊的指針指向后一個任務(wù)控制塊的指針 struct os_tcb *OSTCBPrev; /指向前一個任務(wù)控制塊的指針指向前
13、一個任務(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; 任務(wù)控制塊的初始化任務(wù)控制塊的初始化當(dāng)用戶程序調(diào)用函數(shù)當(dāng)用戶程序調(diào)用函數(shù)OSTaskCreate()OSTaskCreate()創(chuàng)建一個任務(wù)時,這個函數(shù)會調(diào)用系統(tǒng)創(chuàng)建一個任務(wù)時,這個函數(shù)會調(diào)用系統(tǒng)函數(shù)函數(shù)OSTCBInit()OSTCBInit()來為任務(wù)控制塊進(jìn)行初始化。這個函數(shù)首先為被創(chuàng)建任務(wù)從空任來為任務(wù)控制塊進(jìn)行初始化。這個函數(shù)
14、首先為被創(chuàng)建任務(wù)從空任務(wù)控制塊鏈表獲取一個任務(wù)控制塊,然后利用任務(wù)的屬性對任務(wù)控制塊各個成員進(jìn)務(wù)控制塊鏈表獲取一個任務(wù)控制塊,然后利用任務(wù)的屬性對任務(wù)控制塊各個成員進(jìn)行賦值,最后再把這個任務(wù)控制塊鏈入到任務(wù)控制塊鏈表的頭部。行賦值,最后再把這個任務(wù)控制塊鏈入到任務(wù)控制塊鏈表的頭部。初始化任務(wù)控制塊函數(shù)初始化任務(wù)控制塊函數(shù)OSTCBInit()OSTCBInit()的原型如下:的原型如下:INT8U OSTCBInit()INT8UPrio, /任務(wù)的優(yōu)先級別,保存在任務(wù)的優(yōu)先級別,保存在OSTCBPrio中中OS_STK*ptos, /任務(wù)堆棧棧頂指針,保存在任務(wù)堆棧棧頂指針,保存在OSTCB
15、StkPtr中中OS_STK *pbos, /任務(wù)堆棧棧底指針,保存在任務(wù)堆棧棧底指針,保存在OSTCBStkBottom中中INT16Uid, /任務(wù)的標(biāo)示符,保存在任務(wù)的標(biāo)示符,保存在OSTCBId中中INT16Ustk_size, /任務(wù)堆棧的長度,保存在任務(wù)堆棧的長度,保存在OSTCBStkSize中中void*pext, /任務(wù)控制塊的擴(kuò)展指針,保存在任務(wù)控制塊的擴(kuò)展指針,保存在OSTCBExtPtr中中INT16Uopt /任務(wù)的控制塊的選擇項,保存在任務(wù)的控制塊的選擇項,保存在OSTCBOpt中中;所謂所謂堆棧堆棧,就是在存儲器中按數(shù)據(jù),就是在存儲器中按數(shù)據(jù)“后進(jìn)先出后進(jìn)先出(L
16、IFO)”的的原則組織的連續(xù)存儲空間。原則組織的連續(xù)存儲空間。為了滿足任務(wù)切換和響應(yīng)中斷時保存為了滿足任務(wù)切換和響應(yīng)中斷時保存CPU寄存器中的內(nèi)寄存器中的內(nèi)容及存儲任務(wù)私有數(shù)據(jù)的需要,每個任務(wù)都應(yīng)該配有自己的容及存儲任務(wù)私有數(shù)據(jù)的需要,每個任務(wù)都應(yīng)該配有自己的堆棧。任務(wù)堆棧是任務(wù)的重要組成部分。堆棧。任務(wù)堆棧是任務(wù)的重要組成部分。2.1.3 uC/OS-II的任務(wù)的任務(wù)任務(wù)堆棧任務(wù)堆棧任務(wù)堆棧的創(chuàng)建任務(wù)堆棧的創(chuàng)建為方便定義任務(wù)堆棧,在文件為方便定義任務(wù)堆棧,在文件OS_CPU.HOS_CPU.H中專門定義了一個數(shù)中專門定義了一個數(shù)據(jù)類型據(jù)類型OS_STKOS_STK:Typedef unsig
17、ned int OS_STK; / / 該類型長度為該類型長度為1616位位這樣,在應(yīng)用程序中定義任務(wù)堆棧的棧區(qū)就非常簡單,即定義這樣,在應(yīng)用程序中定義任務(wù)堆棧的棧區(qū)就非常簡單,即定義一個一個OS_STKOS_STK類型的一個數(shù)組即可。例如:類型的一個數(shù)組即可。例如:#define TASK_STK_SIZE 512 / 定義堆棧長度定義堆棧長度(1024字節(jié)字節(jié))OS_STK TaskStkTASK_STK_SIZE; /定義一個數(shù)組來作為任務(wù)堆棧定義一個數(shù)組來作為任務(wù)堆棧 創(chuàng)建任務(wù)函數(shù)創(chuàng)建任務(wù)函數(shù)OSTaskCreate()原型如下:原型如下: INT8U OSTaskCreate( vo
18、id (*task)(void *pd),/指向任務(wù)的指針指向任務(wù)的指針 void *pdata,/傳遞給任務(wù)的參數(shù)傳遞給任務(wù)的參數(shù) OS_STK *ptos,/任務(wù)堆棧棧頂?shù)闹羔樔蝿?wù)堆棧棧頂?shù)闹羔?INT8U prio );/指定任務(wù)優(yōu)先級別的參數(shù)指定任務(wù)優(yōu)先級別的參數(shù)當(dāng)調(diào)用函數(shù)當(dāng)調(diào)用函數(shù)OSTaskCreate()來創(chuàng)建一個來創(chuàng)建一個任務(wù)時,把數(shù)組的指針傳遞給函數(shù)任務(wù)時,把數(shù)組的指針傳遞給函數(shù)OSTaskCreate()中的堆棧棧頂參數(shù)中的堆棧棧頂參數(shù)ptos,就可以把該數(shù)組與任務(wù)關(guān)聯(lián)起來而成為就可以把該數(shù)組與任務(wù)關(guān)聯(lián)起來而成為該任務(wù)的任務(wù)堆棧。該任務(wù)的任務(wù)堆棧。任務(wù)堆棧的創(chuàng)建任務(wù)堆棧的創(chuàng)
19、建堆棧的增長方向是隨系統(tǒng)所使用的處理器不同而不同。因此在使用函數(shù)堆棧的增長方向是隨系統(tǒng)所使用的處理器不同而不同。因此在使用函數(shù)OSTaskCreate()OSTaskCreate()創(chuàng)建任務(wù)時,創(chuàng)建任務(wù)時,一定要注意所使用的處理器對堆棧增長方向的一定要注意所使用的處理器對堆棧增長方向的支持是向上的還是向下的。支持是向上的還是向下的。低地址低地址高地址高地址堆棧增長的方向向下堆棧增長的方向向下堆棧增長的方向向上堆棧增長的方向向上圖圖3-7 3-7 堆棧的不同增長方向堆棧的不同增長方向上一練習(xí)時假設(shè)使用了支持堆棧向下增長方式的處理器設(shè)置參數(shù)上一練習(xí)時假設(shè)使用了支持堆棧向下增長方式的處理器設(shè)置參數(shù)p
20、tosptos。如果。如果使用的處理器支持堆棧的增長方向向上,則應(yīng)該為:使用的處理器支持堆棧的增長方向向上,則應(yīng)該為:OSTaskCreate( MyTask, &ttt, &MyTaskStk0, 20);為了提高應(yīng)用程序的移植性,在編寫代碼時可兼顧兩種情況,利用為了提高應(yīng)用程序的移植性,在編寫代碼時可兼顧兩種情況,利用OS_CFG.HOS_CFG.H文件中的常數(shù)文件中的常數(shù)OS_STK_GROWTHOS_STK_GROWTH作為選擇開關(guān),使用戶可通過定義該常作為選擇開關(guān),使用戶可通過定義該常數(shù)的值來選擇相應(yīng)代碼段,以適應(yīng)不同的堆棧增長方向的需要。試改寫上一數(shù)的值來選擇相應(yīng)代碼段,以適應(yīng)不同
21、的堆棧增長方向的需要。試改寫上一練習(xí)代碼。練習(xí)代碼。任務(wù)堆棧的初始化任務(wù)堆棧的初始化uC/OS-IIuC/OS-II在創(chuàng)建任務(wù)函數(shù)在創(chuàng)建任務(wù)函數(shù)OSTaskCreat()OSTaskCreat()中通過調(diào)用任務(wù)堆棧初始化函數(shù)中通過調(diào)用任務(wù)堆棧初始化函數(shù)OSTaskStkInit()OSTaskStkInit()來完成任務(wù)堆棧初始化工作的,其原型如下:來完成任務(wù)堆棧初始化工作的,其原型如下:OS_STK OS_STK * *OSTaskStkInit(OSTaskStkInit( void ( void (* *task)(void task)(void * *pd),pd), void voi
22、d * *pdata,pdata, OS_STK OS_STK * *ptos,ptos, INIT16U opt INIT16U opt); );由于各處理器的寄存器及對堆棧的操作方式不同,因此該函數(shù)需要用戶在進(jìn)行由于各處理器的寄存器及對堆棧的操作方式不同,因此該函數(shù)需要用戶在進(jìn)行uC/OS-IIuC/OS-II的移植時,按所使用的處理器由用戶來編寫。的移植時,按所使用的處理器由用戶來編寫。當(dāng)當(dāng)CPUCPU啟動運(yùn)行一個任務(wù)時,啟動運(yùn)行一個任務(wù)時,CPUCPU的各寄存器總是需要預(yù)置一些初始數(shù)據(jù),的各寄存器總是需要預(yù)置一些初始數(shù)據(jù),例如指向任務(wù)的指針、任務(wù)堆棧指針、程序狀態(tài)字等。例如指向任務(wù)的指
23、針、任務(wù)堆棧指針、程序狀態(tài)字等。#define OS_TASK_OPT_STK_CHK 0 x0001 /*Enable stack checking for the task */#define OS_TASK_OPT_STK_CLR 0 x0002 /*Clear the stack when the task is create */#define OS_TASK_OPT_SAVE_FP 0 x0004 /*Save the contents of any floating-point registers */最方便的方法就是讓最方便的方法就是讓CPUCPU從這個任務(wù)的任務(wù)堆棧里獲得這些
24、數(shù)據(jù)!從這個任務(wù)的任務(wù)堆棧里獲得這些數(shù)據(jù)!任務(wù)堆棧void mytask () . for(;) . 任務(wù)代碼任務(wù)控制塊指向任務(wù)堆棧的指針.指向前一個任務(wù)控制塊的指針指向后一個任務(wù)控制塊的指針.任務(wù)的優(yōu)先級別任務(wù)2.2 uC/OS-II的任務(wù)的任務(wù)-存儲結(jié)構(gòu)存儲結(jié)構(gòu)指向任務(wù)代碼任務(wù)控制塊任務(wù)代碼任務(wù)堆棧任務(wù)1任務(wù)控制塊鏈表任務(wù)控制塊任務(wù)代碼任務(wù)堆棧任務(wù)2任務(wù)控制塊任務(wù)代碼任務(wù)堆棧任務(wù)n2.2 uC/OS-II的任務(wù)的任務(wù)-存儲結(jié)構(gòu)存儲結(jié)構(gòu) uC/OS-II的任務(wù)有5種狀態(tài) 睡眠態(tài)(DORMANT): 任務(wù)駐留在程序空間,還沒有交給uCOS管理,即還沒有配備任務(wù)控制塊,還沒有被創(chuàng)建。 就緒態(tài)(R
25、EADY): 任務(wù)一旦建立,就進(jìn)入就緒態(tài)準(zhǔn)備運(yùn)行,“萬事具備,只欠CPU”。 運(yùn)行態(tài)(RUNNING): 正在使用CPU的狀態(tài)稱運(yùn)行態(tài)。 等待態(tài)(WAITING):等待某事件發(fā)生的狀態(tài). 中斷服務(wù)態(tài)(ISR):正在運(yùn)行的任務(wù)被中斷時就進(jìn)入了中斷服務(wù)態(tài)(ISR)。2.3 uC/OS-II的任務(wù)的任務(wù)工作狀態(tài)工作狀態(tài)正在運(yùn)行的任務(wù),需要等待一段時間或需要等待一個事件發(fā)生再運(yùn)行時,該任務(wù)就會把CPU的使用權(quán)讓給別的任務(wù)而使任務(wù)進(jìn)入等待狀態(tài)。 任務(wù)在沒有被配備任務(wù)控制塊或被剝奪了任務(wù)控制塊時的狀態(tài)叫做任務(wù)的睡眠狀態(tài) 系統(tǒng)為任務(wù)配備了任務(wù)控制塊且在任務(wù)就緒表中進(jìn)行了就緒登記,這時任務(wù)的狀態(tài)叫做就緒狀態(tài)。
26、 處于就緒狀態(tài)的任務(wù)如果經(jīng)調(diào)度器判斷獲得了CPU的使用權(quán),則任務(wù)就進(jìn)入運(yùn)行狀態(tài) 一個正在運(yùn)行的任務(wù)一旦響應(yīng)中斷申請就會中止運(yùn)行而去執(zhí)行中斷服務(wù)程序,這時任務(wù)的狀態(tài)叫做中斷服務(wù)狀態(tài) COS II(V2.91版) 支持255個任務(wù),每個任務(wù)有一個特定的優(yōu)先級。 任務(wù)的優(yōu)先級別用數(shù)字表示,0表示的任務(wù)的優(yōu)先級最高,數(shù)字越大表示的優(yōu)先級越低。 通過常數(shù)OS_LOWEST_PRIO (在OS_CFG.H中)定義系統(tǒng)的最低優(yōu)先級別,同時限定系統(tǒng)能容納的最多任務(wù)數(shù)量。 OS_LOWEST_PRIO給空閑任務(wù), OS_LOWEST_PRIO-1給統(tǒng)計任務(wù)。2.4 uC/OS-II的任務(wù)的任務(wù)優(yōu)先級優(yōu)先級v 多
27、任務(wù)操作系統(tǒng)的核心:任務(wù)調(diào)度。v 調(diào)度定義:就是通過一個算法在多個任務(wù)中確定那個任務(wù)來運(yùn)行。做這項工作的就是調(diào)度器。v 任務(wù)調(diào)度的思想:總是讓優(yōu)先級最高的就緒任務(wù)處于運(yùn)行狀態(tài)。v uC/OS-I進(jìn)行任務(wù)調(diào)度的依據(jù):任務(wù)就續(xù)表。為了能使系統(tǒng)清楚地知道系統(tǒng)中哪些任務(wù)已經(jīng)就緒,那些還沒為了能使系統(tǒng)清楚地知道系統(tǒng)中哪些任務(wù)已經(jīng)就緒,那些還沒有就緒,有就緒,UC/OS-II在在RAM中設(shè)立了一個記錄表,系統(tǒng)中的每中設(shè)立了一個記錄表,系統(tǒng)中的每個任務(wù)都在這個表占據(jù)一個位置,并用這個位置的狀態(tài)(個任務(wù)都在這個表占據(jù)一個位置,并用這個位置的狀態(tài)(1或或者者0)來表示任務(wù)是否處于就緒狀態(tài)。這個表就叫做)來表示任
28、務(wù)是否處于就緒狀態(tài)。這個表就叫做任務(wù)就緒任務(wù)就緒表表。2.5 uC/OS-II的任務(wù)的任務(wù)任務(wù)就緒表及調(diào)度任務(wù)就緒表及調(diào)度每個就緒的任務(wù)都放入就緒表中,就緒表有兩個變量:每個就緒的任務(wù)都放入就緒表中,就緒表有兩個變量:OSRdyGrp、OSRdyTblOSRdyGrpOSRdyGrp1 12 20 07 76 65 54 43 30 00 0X XX XX XY YY YY Y任務(wù)優(yōu)先級任務(wù)優(yōu)先級2 20 01 17 76 65 54 43 310108 89 9151514141313121211111818161617172323222221212020191926262424252531
29、313030292928282727343432323333393938383737363635354242404041414747464645454444434350504848494955555454535352525151585856565757636362626161606059590011223344556677X XY Y優(yōu)先級最低任務(wù)優(yōu)先級最低任務(wù)優(yōu)先級最高任務(wù)優(yōu)先級最高任務(wù)任務(wù)優(yōu)先級號任務(wù)優(yōu)先級號(idle task)任務(wù)就緒表的結(jié)構(gòu)任務(wù)就緒表的結(jié)構(gòu)圖圖2-10 2-10 就緒表的結(jié)構(gòu)就緒表的結(jié)構(gòu)由于每個任務(wù)的就緒狀態(tài)只占一位,因此由于每個任務(wù)的就緒狀態(tài)只占一位,因此OSRdy
30、Tbl數(shù)組的一個元素可表達(dá)數(shù)組的一個元素可表達(dá)8個任務(wù)的就個任務(wù)的就緒狀態(tài)。即每一個數(shù)組元素描述了緒狀態(tài)。即每一個數(shù)組元素描述了8個任務(wù)的就緒個任務(wù)的就緒狀態(tài),于是這狀態(tài),于是這8個任務(wù)就可以看成一個任務(wù)組。個任務(wù)就可以看成一個任務(wù)組。數(shù)據(jù)類型為數(shù)據(jù)類型為INT8U的變量的變量OSRdyGrp,該變量,該變量的每一個位都對應(yīng)的每一個位都對應(yīng)OSRdyTbl的一個任務(wù)組的一個任務(wù)組(即數(shù)組的一個元素)。(即數(shù)組的一個元素)。任務(wù)就緒表的結(jié)構(gòu)任務(wù)就緒表的結(jié)構(gòu)如何根據(jù)任務(wù)的優(yōu)先級別查找任務(wù)在就緒表的位置呢如何根據(jù)任務(wù)的優(yōu)先級別查找任務(wù)在就緒表的位置呢例:已知某一個已經(jīng)就緒的任務(wù)優(yōu)先級別為例:已知某一
31、個已經(jīng)就緒的任務(wù)優(yōu)先級別為prio=30prio=30,試判斷應(yīng)該在就緒表的哪,試判斷應(yīng)該在就緒表的哪一位置上置一位置上置1 1。分析:由于優(yōu)先級別是一個單字節(jié)的數(shù)字,而且最大值不會超過分析:由于優(yōu)先級別是一個單字節(jié)的數(shù)字,而且最大值不會超過6363,即二進(jìn)制,即二進(jìn)制0011111100111111,因此,可以把優(yōu)先級別看成是一個,因此,可以把優(yōu)先級別看成是一個6 6位的二進(jìn)制數(shù),這樣就可以用位的二進(jìn)制數(shù),這樣就可以用高高3 3位位(D5(D5、D4D4、D3)D3)來指明變量來指明變量OSRdyGrpOSRdyGrp的具體數(shù)據(jù)位,并用來確定就緒表的具體數(shù)據(jù)位,并用來確定就緒表數(shù)組元素的下標(biāo)
32、;用低數(shù)組元素的下標(biāo);用低3 3位位(D2(D2、D1D1、D0)D0)來指明該數(shù)組元素的具體數(shù)據(jù)位。來指明該數(shù)組元素的具體數(shù)據(jù)位。答:答:3030的二進(jìn)制形式為的二進(jìn)制形式為0001111000011110,其低,其低6 6位為位為011110011110,于是可知應(yīng)該在,于是可知應(yīng)該在OSRdyTbl3OSRdyTbl3的的D6D6位上置位上置1 1,同時要把變量,同時要把變量OSRdyGrpOSRdyGrp的的D3D3位置位置1 1。對任務(wù)就緒表的操作對任務(wù)就緒表的操作在程序中,可用類似于下面的代碼把優(yōu)先級為在程序中,可用類似于下面的代碼把優(yōu)先級為prio的任務(wù)置為就緒態(tài)。的任務(wù)置為就緒
33、態(tài)。OSRdyGrp |= OSMapTblprio3;OSRdyTblprio3 |= OSMapTblprio & 0 x07;其中,其中,OSMapTbl是是uC/OS-II為加快運(yùn)算速度定義的一個數(shù)組,各元素為:為加快運(yùn)算速度定義的一個數(shù)組,各元素為: OSMapTbl0 = 0000 0001B OSMapTbl0 = 0000 0001B OSMapTbl1 = 0000 0010B OSMapTbl1 = 0000 0010B OSMapTbl2 = 0000 0100B OSMapTbl2 = 0000 0100B OSMapTbl3 = 0000 1000B OSMapTbl
34、3 = 0000 1000B OSMapTbl4 = 0001 0000B OSMapTbl4 = 0001 0000B OSMapTbl5 = 0010 0000B OSMapTbl5 = 0010 0000B OSMapTbl6 = 0100 0000B OSMapTbl6 = 0100 0000B OSMapTbl7 = 1000 0000B OSMapTbl7 = 1000 0000B如果要使一個優(yōu)先級為如果要使一個優(yōu)先級為prio的任務(wù)脫離就緒態(tài),則可使用如下代碼:的任務(wù)脫離就緒態(tài),則可使用如下代碼: If(OSRdyTblprio3 &= If(OSRdyTblprio3 &= O
35、SMapTblprio & 0 x07)=0)OSMapTblprio & 0 x07)=0) OSRdyGrp &= OSRdyGrp &= OSMapTblprio3;OSMapTblprio3;將任務(wù)就緒表將任務(wù)就緒表OSRdyTblprio3OSRdyTblprio3相應(yīng)元素的相應(yīng)位相應(yīng)元素的相應(yīng)位清零,而且當(dāng)清零,而且當(dāng)OSRdyTblprio3OSRdyTblprio3中的所有位都為零中的所有位都為零時,即全組任務(wù)中沒有一個進(jìn)入就緒態(tài)時,時,即全組任務(wù)中沒有一個進(jìn)入就緒態(tài)時,OSRdyGrpOSRdyGrp的相應(yīng)位才為零。的相應(yīng)位才為零。對任務(wù)就緒表的操作對任務(wù)就緒表的操作( (續(xù)
36、續(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 = OSMapTbl1 = 0000 0010;OSRdyTbl1 |= 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。 OSMapTblp
37、rio & 0 x07 = OSMapTblprio & 0 x07 = OSMapTbl4 = 11101111OSMapTbl4 = 11101111 OSMapTblprio3 = OSMapTblprio3 = OSMapTbl1 = 11111101OSMapTbl1 = 11111101由于由于OSRdyTblprio3 &= OSRdyTblprio3 &= OSMapTblprio & 0 x07 = 0OSMapTblprio & 0 x07 = 0則則OSRdyGrp OSRdyGrp = OSRdyGrp & OSRdyGrp & OSMapTblprio3 = 0OSM
38、apTblprio3 = 0從任務(wù)就緒表中獲取優(yōu)先級別最高的就緒任務(wù)可用如下代碼:采用查表法確定高優(yōu)先級任務(wù)采用查表法確定高優(yōu)先級任務(wù)Y = OSUnMapTblOSRdyGrp; /獲得優(yōu)先級別的獲得優(yōu)先級別的D5、D4、D3位位X = OSUnMapTblOSRdyTblY; /獲得優(yōu)先級別的獲得優(yōu)先級別的D2、D1、D0位位Prio =(Y3)+X; /獲得就緒任務(wù)的優(yōu)先級別獲得就緒任務(wù)的優(yōu)先級別其中,其中,OSUnMapTbl同樣是同樣是uC/OS-II為加快運(yùn)算速度定義的一個數(shù)組,共有為加快運(yùn)算速度定義的一個數(shù)組,共有256個元素:個元素:INT8U const OSUnMapTbl
39、 = 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, 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,
40、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, 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,
41、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;舉例:舉例:如如OSRdyGrpOSRdyGrp的值為的值為01101000B01101000B,即,即104104,則查得,則查得OSUnMapTblOSRdyGrpOSUnMapTblOSRdyGrp的值是的值是3 3。如如OSRdyTbl3OSRdyTb
42、l3的值是的值是11100100B11100100B,即,即228228,則查,則查OSUnMapTblOSRdyTbl3OSUnMapTblOSRdyTbl3的值是的值是2 2。則進(jìn)入就緒態(tài)的最高任務(wù)優(yōu)先級。則進(jìn)入就緒態(tài)的最高任務(wù)優(yōu)先級。 Prio=3Prio=3* *8+2=268+2=26 UC/OS-II經(jīng)常使用類似于就緒表的形式來記錄任務(wù)的某種狀態(tài),因此一定要熟悉這種表的結(jié)構(gòu)以及對這種表的基本操作。p 任務(wù)切換:在多任務(wù)系統(tǒng)中,令CPU中止當(dāng)前正在運(yùn)行的任務(wù)而去運(yùn)行另一個任務(wù)的工作。p 任務(wù)調(diào)度:按某種規(guī)則進(jìn)行任務(wù)切換的工作。p 任務(wù)調(diào)度由任務(wù)調(diào)度器完成,調(diào)度器主要工作: 1. 在任
43、務(wù)就緒表中查找具有最高優(yōu)先級別的就緒任務(wù)。 2. 實現(xiàn)任務(wù)切換。uC/OS-II有兩種調(diào)度器: 任務(wù)級調(diào)度器(由OSSched()實現(xiàn))、中斷級調(diào)度器(由OSIntExt()實現(xiàn))。任務(wù)切換的兩個步驟:1. 獲得待運(yùn)行任務(wù)的TCB指針。2. 進(jìn)行斷點(diǎn)數(shù)據(jù)的切換。任務(wù)的調(diào)度任務(wù)的調(diào)度任務(wù)切換過程獲得待運(yùn)行任務(wù)的任務(wù)控制塊恢復(fù)待運(yùn)行任務(wù)的運(yùn)行環(huán)境處理器的PC=任務(wù)堆棧中的斷點(diǎn)地址處理器的SP=任務(wù)塊中保存的SP如何獲得待運(yùn)行任務(wù)的任務(wù)控制塊?根據(jù)就緒表獲得待運(yùn)行任務(wù)的任務(wù)控制塊指針其實,調(diào)度器在進(jìn)行調(diào)度時,在這個位置還要進(jìn)行一下判斷:究竟是待運(yùn)行任務(wù)是否為當(dāng)前任務(wù),如果是,則不切換;如果不是才切換
44、,而且還要保存被中止任務(wù)的運(yùn)行環(huán)境。任務(wù)代碼任務(wù)堆棧內(nèi)存處理器PCSP處理器通過兩個指針寄存器(PC和SP)來與任務(wù)代碼和任務(wù)堆棧建立聯(lián)系并運(yùn)行它寄存器組程序運(yùn)行環(huán)境運(yùn)行環(huán)境包括了兩部分:處理器中的運(yùn)行環(huán)境和內(nèi)存中的運(yùn)行環(huán)境任務(wù)運(yùn)行時與處理器之間的關(guān)系任務(wù)運(yùn)行時與處理器之間的關(guān)系任務(wù)代碼任務(wù)堆棧內(nèi)存處理器PCSP多任務(wù)時的問題多任務(wù)時的問題任務(wù)代碼任務(wù)堆棧內(nèi)存任務(wù)代碼任務(wù)堆棧內(nèi)存?當(dāng)有多個任務(wù)時,處理器中的運(yùn)行環(huán)境應(yīng)該怎么辦?寄存器組程序運(yùn)行環(huán)境程序 虛擬處理器PCSP 虛擬處理器PCSP 虛擬處理器PCSP 虛擬處理器PCSP調(diào)度器多任務(wù)時任務(wù)與處理器 之間關(guān)系的處理程序處理器PCSP在內(nèi)存
45、中為每個任務(wù)創(chuàng)建一個虛擬的處理器(處理器部分的運(yùn)行環(huán)境由操作系統(tǒng)的調(diào)度器按某種規(guī)則來進(jìn)行這兩個復(fù)制工作復(fù)制當(dāng)需要運(yùn)行某個任務(wù)時就把該任務(wù)的虛擬處理器復(fù)制到實際處理器中復(fù)制當(dāng)需要中止當(dāng)前任務(wù)時,則把任務(wù)對應(yīng)的虛擬處理器復(fù)制到內(nèi)存復(fù)制再把另一個需要運(yùn)行的任務(wù)的虛擬處理器復(fù)制到實際處理器中寄存器組寄存器組也就是說,任務(wù)的切換是任務(wù)運(yùn)行環(huán)境的切換任務(wù)切換宏任務(wù)切換宏OS_TASK_SW( ) 任務(wù)切換就是中止正在運(yùn)行的任務(wù)(當(dāng)前任務(wù)),轉(zhuǎn)而去運(yùn)行另外一個任務(wù)的操作,當(dāng)然這個任務(wù)應(yīng)該是就緒任務(wù)中優(yōu)先級別最高的那個任務(wù)。需要由宏OS_TASK_SW( ) 來引發(fā)一次中斷或者一次調(diào)用來使OSCtxSw(OS
46、CtxSw( )執(zhí)行任務(wù)切換工作,任務(wù)切換OSCtxSw(OSCtxSw( ) 是一個中斷服務(wù)程序。任務(wù)的調(diào)度任務(wù)的調(diào)度( (續(xù)續(xù)) )1. 1. 獲得待運(yùn)行任務(wù)的獲得待運(yùn)行任務(wù)的TCBTCB指針指針void OSSched (void) INT8U y; OS_ENTER_CRITICAL(); if (OSLockNesting | OSIntNesting) = 0) / 未被上鎖且不是中斷服務(wù)程序調(diào)用 y = OSUnMapTblOSRdyGrp; OSPrioHighRdy = (INT8U)(y 3) + OSUnMapTblOSRdyTbly); / 得到最高優(yōu)先級任務(wù)得到最高優(yōu)
47、先級任務(wù) if (OSPrioHighRdy != OSPrioCur) / 不是當(dāng)前運(yùn)行任務(wù)不是當(dāng)前運(yùn)行任務(wù) OSTCBHighRdy = OSTCBPrioTblOSPrioHighRdy; / 得到待運(yùn)行任務(wù)控制塊指針得到待運(yùn)行任務(wù)控制塊指針 OSCtxSwCtr+; / 統(tǒng)計任務(wù)切換次數(shù)的計數(shù)器加1 OS_TASK_SW(); / 實施任務(wù)切換實施任務(wù)切換 OS_EXIT_CRITICAL();由于操作系統(tǒng)是通過任務(wù)的任務(wù)控制塊由于操作系統(tǒng)是通過任務(wù)的任務(wù)控制塊TCB來管理任來管理任務(wù)的,因此調(diào)度器真正實施任務(wù)切換之前的主要工作務(wù)的,因此調(diào)度器真正實施任務(wù)切換之前的主要工作是要獲得待運(yùn)
48、行任務(wù)的任務(wù)控制塊指針和是要獲得待運(yùn)行任務(wù)的任務(wù)控制塊指針和當(dāng)前任務(wù)的當(dāng)前任務(wù)的任務(wù)控制塊指針任務(wù)控制塊指針。任務(wù)的調(diào)度任務(wù)的調(diào)度( (續(xù)續(xù)) )2. 2. 任務(wù)切換宏任務(wù)切換宏OS_TASK_SW()OS_TASK_SW()SPR1R2 RnPCPSWR1R2RnPCPSWR1R2RnPCPSWCPUCPU的各寄存器的各寄存器被中止任務(wù)被中止任務(wù)TCBTCB待運(yùn)行任務(wù)待運(yùn)行任務(wù)TCBTCBOSTCBStkPtrOSTCBStkPtrOSTCBStkPtrOSTCBStkPtr被中止任務(wù)堆棧被中止任務(wù)堆棧待運(yùn)行任務(wù)堆棧待運(yùn)行任務(wù)堆棧圖圖2-11 2-11 調(diào)度器進(jìn)行任務(wù)切換時的動作調(diào)度器進(jìn)行任
49、務(wù)切換時的動作斷點(diǎn)斷點(diǎn):任務(wù)被中止運(yùn)行時的位置。任務(wù)被中止運(yùn)行時的位置。斷點(diǎn)數(shù)據(jù)斷點(diǎn)數(shù)據(jù):當(dāng)時存放在當(dāng)時存放在CPU的各的各寄存器中的數(shù)據(jù)。寄存器中的數(shù)據(jù)。“無縫無縫”接續(xù)接續(xù):當(dāng)任務(wù)恢復(fù)運(yùn)行當(dāng)任務(wù)恢復(fù)運(yùn)行時,必須在斷點(diǎn)處以斷點(diǎn)數(shù)據(jù)作時,必須在斷點(diǎn)處以斷點(diǎn)數(shù)據(jù)作為初始數(shù)據(jù)接著運(yùn)行。為初始數(shù)據(jù)接著運(yùn)行。正確地恢復(fù)斷點(diǎn)數(shù)據(jù)的關(guān)鍵正確地恢復(fù)斷點(diǎn)數(shù)據(jù)的關(guān)鍵: CPU的堆棧指針的堆棧指針SP是否有正確的是否有正確的指向。指向。在系統(tǒng)中存在多個任務(wù)時,如果在系統(tǒng)中存在多個任務(wù)時,如果在恢復(fù)斷點(diǎn)數(shù)據(jù)使用另一個任務(wù)在恢復(fù)斷點(diǎn)數(shù)據(jù)使用另一個任務(wù)的任務(wù)堆棧指針(存放在的任務(wù)堆棧指針(存放在TCB的的OSTCBSt
50、kPtr中)來改變中)來改變CPU的的堆棧指針堆棧指針SP,那么,那么CPU運(yùn)行的就運(yùn)行的就不是剛才被中止運(yùn)行的任務(wù),而不是剛才被中止運(yùn)行的任務(wù),而使另一個任務(wù)了,也就是實現(xiàn)任使另一個任務(wù)了,也就是實現(xiàn)任務(wù)切換了。務(wù)切換了。為了了解調(diào)度器是如何進(jìn)行任務(wù)切換的,探討一下為了了解調(diào)度器是如何進(jìn)行任務(wù)切換的,探討一下一個被中止運(yùn)行的任務(wù),將來又要一個被中止運(yùn)行的任務(wù),將來又要“無縫無縫”地恢復(fù)地恢復(fù)運(yùn)行應(yīng)該滿足的條件運(yùn)行應(yīng)該滿足的條件2.7 2.7 任務(wù)的操作任務(wù)的操作創(chuàng)建創(chuàng)建 uC/OS-II uC/OS-II是通過任務(wù)控制塊來管理任務(wù)的。是通過任務(wù)控制塊來管理任務(wù)的。 uC/OS-IIuC/OS
51、-II有兩個用來創(chuàng)建任務(wù)的函數(shù):有兩個用來創(chuàng)建任務(wù)的函數(shù):TaskCreate()TaskCreate()、OSTaskCreateExt()OSTaskCreateExt() OSTaskCreate() OSTaskCreate()向下兼容,向下兼容,OSTaskCreateExt()OSTaskCreateExt()是前一函數(shù)的擴(kuò)展,提供是前一函數(shù)的擴(kuò)展,提供 了了一些附加功能。一些附加功能。 任務(wù)可以在多任務(wù)調(diào)度開始前建立,也可以在其他任務(wù)執(zhí)行過程中建立。任務(wù)可以在多任務(wù)調(diào)度開始前建立,也可以在其他任務(wù)執(zhí)行過程中建立。 任務(wù)不能由中斷服務(wù)程序建立。任務(wù)不能由中斷服務(wù)程序建立。創(chuàng)建任務(wù)的
52、一般方法創(chuàng)建任務(wù)的一般方法v 可在調(diào)用函數(shù)可在調(diào)用函數(shù)OSStart()OSStart()啟動任務(wù)調(diào)度之前來創(chuàng)建。啟動任務(wù)調(diào)度之前來創(chuàng)建。v 在任務(wù)中來創(chuàng)建。在任務(wù)中來創(chuàng)建。v uC/OS-IIuC/OS-II的規(guī)定:在的規(guī)定:在OSStart()OSStart()啟動任務(wù)調(diào)度之前必須創(chuàng)建至少一個啟動任務(wù)調(diào)度之前必須創(chuàng)建至少一個任務(wù)。任務(wù)。 這樣,在這樣,在OSStart()OSStart()之前先創(chuàng)建一個任務(wù),并賦予它最高的優(yōu)先級,之前先創(chuàng)建一個任務(wù),并賦予它最高的優(yōu)先級,從而使它從而使它 成為起始任務(wù),然后在這個起始任務(wù)中,在創(chuàng)建其它各任成為起始任務(wù),然后在這個起始任務(wù)中,在創(chuàng)建其它各任務(wù)
53、。務(wù)。 如果要使用系統(tǒng)提供的統(tǒng)計任務(wù),則統(tǒng)計任務(wù)的初始化函數(shù)必須在如果要使用系統(tǒng)提供的統(tǒng)計任務(wù),則統(tǒng)計任務(wù)的初始化函數(shù)必須在這個起始任務(wù)中來調(diào)用。這個起始任務(wù)中來調(diào)用。v uC/OS-IIuC/OS-II不允許在中斷服務(wù)程序中創(chuàng)建任務(wù)不允許在中斷服務(wù)程序中創(chuàng)建任務(wù)創(chuàng)建任務(wù)的一般方法創(chuàng)建任務(wù)的一般方法/ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *主函數(shù)主函數(shù)* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /void main(
54、void)void main(void) OSInit();OSInit();/ / 對對uC/OS-IIuC/OS-II初始化初始化OSTaskCreate(TaskStart,OSTaskCreate(TaskStart,); );/ / 創(chuàng)建起始任務(wù)創(chuàng)建起始任務(wù)OSStart();OSStart();/ / 開始多任務(wù)調(diào)度開始多任務(wù)調(diào)度 / /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *起始任務(wù)起始任務(wù)* * * * * * * * * * * * * * * * * * * * * * * * * * * * *
55、 * * * * */ /void TaskStart(void void TaskStart(void * *pdata)pdata) / / 在這個位置安裝并啟動在這個位置安裝并啟動uC/OS-IIuC/OS-II時鐘時鐘OSStatInit();OSStatInit();/ / 初始化統(tǒng)計任務(wù)初始化統(tǒng)計任務(wù)/ / 在這個位置創(chuàng)建其它任務(wù)在這個位置創(chuàng)建其它任務(wù)For(;)For(;) 起始任務(wù)的代碼起始任務(wù)的代碼 所謂掛起一個任務(wù),就是停止這個任務(wù)的運(yùn)行。所謂掛起一個任務(wù),就是停止這個任務(wù)的運(yùn)行。 在在uC/OS-IIuC/OS-II中,用戶任務(wù)可通過調(diào)用系統(tǒng)提供的函數(shù)中,用戶任務(wù)可通過調(diào)
56、用系統(tǒng)提供的函數(shù)OSTaskSuspend()OSTaskSuspend()來掛起來掛起自身或者除空閑任務(wù)之外的其他任務(wù)。用函數(shù)自身或者除空閑任務(wù)之外的其他任務(wù)。用函數(shù)OSTaskSuspend()OSTaskSuspend()掛起的任務(wù),只掛起的任務(wù),只能在其它任務(wù)中通過調(diào)用恢復(fù)函數(shù)能在其它任務(wù)中通過調(diào)用恢復(fù)函數(shù)OSTaskResume()OSTaskResume()使其恢復(fù)為就緒狀態(tài)。使其恢復(fù)為就緒狀態(tài)。等待狀態(tài)等待狀態(tài)就緒狀態(tài)就緒狀態(tài)運(yùn)行狀態(tài)運(yùn)行狀態(tài)OS_TASK_SW()OS_TASK_SW()OSTaskResume()OSTaskResume()OSTaskSuspend()OST
57、askSuspend() 任務(wù)的任務(wù)的CPUCPU使用權(quán)被剝奪使用權(quán)被剝奪圖圖 任務(wù)的掛起和恢復(fù)任務(wù)的掛起和恢復(fù)2.7 2.7 任務(wù)的操作任務(wù)的操作掛起與恢復(fù)掛起與恢復(fù) 刪除任務(wù),就是把該任務(wù)處于休眠狀態(tài)。刪除任務(wù),就是把該任務(wù)處于休眠狀態(tài)。 并不是說任務(wù)的代碼真的被刪除了,只是任務(wù)的代碼不再被操作系統(tǒng)調(diào)用。并不是說任務(wù)的代碼真的被刪除了,只是任務(wù)的代碼不再被操作系統(tǒng)調(diào)用。 通過調(diào)用通過調(diào)用OSTaskDel()OSTaskDel()就可以完成刪除任務(wù)自身或除了空閑任務(wù)之外的其他任務(wù)。就可以完成刪除任務(wù)自身或除了空閑任務(wù)之外的其他任務(wù)。 函數(shù)函數(shù)OSTaskDel()OSTaskDel()的原
58、型如下:的原型如下: #if OS_TASK_DEL_ENINT8U OSTaskDel ( INT8U prio / 要刪除任務(wù)的優(yōu)先級要刪除任務(wù)的優(yōu)先級 ); 如果任務(wù)刪除自己,則應(yīng)在調(diào)用函數(shù)時令函數(shù)的參數(shù)如果任務(wù)刪除自己,則應(yīng)在調(diào)用函數(shù)時令函數(shù)的參數(shù)prioprio為為OS_PRIO_SELFOS_PRIO_SELF。 刪除任務(wù)具體做法是,把被刪除任務(wù)的任務(wù)控制塊從任刪除任務(wù)具體做法是,把被刪除任務(wù)的任務(wù)控制塊從任務(wù)控制塊鏈表中刪除,并歸還給空任務(wù)控制塊鏈表,然務(wù)控制塊鏈表中刪除,并歸還給空任務(wù)控制塊鏈表,然后在任務(wù)就緒表中把該任務(wù)的就緒狀態(tài)位置后在任務(wù)就緒表中把該任務(wù)的就緒狀態(tài)位置0,
59、于是該,于是該任務(wù)就不能再被調(diào)度器調(diào)用了。任務(wù)就不能再被調(diào)度器調(diào)用了。2.7 2.7 任務(wù)的操作任務(wù)的操作刪除刪除請求刪除任務(wù)函數(shù)請求刪除任務(wù)函數(shù)OSTaskDelReq()OSTaskDelReq()的原型如下:的原型如下: INT8U OSTaskDelReq ( INT8U prio / 要刪除任務(wù)的優(yōu)先級要刪除任務(wù)的優(yōu)先級 ); 如果任務(wù)請求刪除自己,則應(yīng)在調(diào)用函數(shù)時令函數(shù)的參數(shù)如果任務(wù)請求刪除自己,則應(yīng)在調(diào)用函數(shù)時令函數(shù)的參數(shù)prioprio為為OS_PRIO_SELFOS_PRIO_SELF。 進(jìn)入進(jìn)入PrioPrio是空閑任務(wù)?是空閑任務(wù)? 返回返回OS_TASK_NOT_EXI
60、STOS_TASK_NOT_EXIST 返回返回OS_TASK_IDLE_PRIOOS_TASK_IDLE_PRIO返回被刪除任務(wù)返回被刪除任務(wù)TCBTCB的成的成員員OSTCBDelReqOSTCBDelReq的值的值NONOYESYESYESYESYESYES 返回返回 OS_NO_ERROS_NO_ERRNONOPrioPrio是合法優(yōu)先級?是合法優(yōu)先級? 返回返回OS_PRIO_INVALIDOS_PRIO_INVALIDNONOPrio=OS_PRIO_SELFPrio=OS_PRIO_SELF?PrioPrio任務(wù)的任務(wù)的TCBTCB不存在?不存在?NONOYESYES圖圖2-15
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年加盟合同合作協(xié)議書
- 2025年加盟東北菜館合作協(xié)議
- 二零二五年度高新技術(shù)企業(yè)監(jiān)事聘任及咨詢合同
- 2025年水泥編織袋行業(yè)綠色發(fā)展基金合作合同3篇
- 臨時洗碗工作人員2024年協(xié)議范本版B版
- 2025年度綠色有機(jī)茶葉全國獨(dú)家代理銷售合同3篇
- 二零二五年度不銹鋼欄桿工程材料研發(fā)與施工合同3篇
- 二零二五年度房屋買賣合同附屬設(shè)施移交范本3篇
- 個性化購車貸款條款與條件協(xié)議一
- 2025年送餐服務(wù)與客戶滿意度提升合作協(xié)議范本3篇
- 大數(shù)據(jù)管理與考核制度大全
- 大學(xué)面試后感謝信
- 2022屆上海高考語文調(diào)研試測卷詳解(有《畏齋記》“《江表傳》曰…”譯文)
- SBT11229-2021互聯(lián)網(wǎng)舊貨交易平臺建設(shè)和管理規(guī)范
- 如何打造頂尖理財顧問團(tuán)隊
- 土壤農(nóng)化分析課件
- 小區(qū)大型團(tuán)購活動策劃
- NEC(新生兒壞死性小腸結(jié)腸炎)92273
- 2023年租賃風(fēng)控主管年度總結(jié)及下一年展望
- 開關(guān)插座必看的七個安全隱患范文
- 高分子成型加工課件
評論
0/150
提交評論