本內(nèi)容來自網(wǎng)絡(luò)轉(zhuǎn)載:
1、任務(wù)介紹任務(wù),其實就是一個死循環(huán)函數(shù),該函數(shù)實現(xiàn)一定的功能,一個工程可以有很多這
樣的任務(wù)(最多 255 個),UCOSII對這些任務(wù)進行調(diào)度管理,讓這些任務(wù)可以并發(fā)工作
(注意不是同時工作!!,并發(fā)只是各任務(wù)輪流占用 CPU,而不是同時占用,任何時候還是只有 1個任務(wù)能夠占用 CPU), 這就是 UCOSII 最基本的功能。 Ucos 任務(wù)的一般格式為: void MyTask (void *pdata) { 任務(wù)準備工作…While(1)//死循環(huán) { 任務(wù) MyTask 實體代碼; OSTimeDlyHMSM(x,x,x,x);//調(diào)用任務(wù)延時函數(shù),釋放 cpu 控制權(quán), } } 2. 任務(wù)優(yōu)先級ucos 中,每個任務(wù)都有唯一的一個優(yōu)先級,優(yōu)先級是任務(wù)的唯一標識 在 UCOSII 中,使用 CPU的時候,優(yōu)先級高(數(shù)值小)的任務(wù)比優(yōu)先級低的任務(wù)具有優(yōu)先使用權(quán),即任務(wù)就緒表中總是優(yōu)先級最高的任務(wù)獲得 CPU 使用權(quán),只有高優(yōu)先級
的任務(wù)讓出 CPU 使用權(quán)(比如延時)時,低優(yōu)先級的任務(wù)才能獲得 CPU 使用權(quán) UCOSII 不支持多個任務(wù)優(yōu)先級相同,也就是每個任務(wù)的優(yōu)先級必須不一樣 3. 任務(wù)堆棧就是存儲器中的連續(xù)存儲空間。為了滿足任務(wù)切換和響應(yīng)中斷時保存 CPU 寄存
器中的內(nèi)容以及任務(wù)調(diào)用其他函數(shù)時的需要,每個任務(wù)都有自己的堆棧。在創(chuàng)建任務(wù)的時候,任務(wù)堆棧是任務(wù)創(chuàng)建的一個重要入口參數(shù) 4. 任務(wù)控制塊任務(wù)控制塊 OS_TCB,用來記錄任務(wù)堆棧指針,任務(wù)當(dāng)前狀態(tài)以及任務(wù)優(yōu)先級等任務(wù)屬性 UCOSII 的任何任務(wù)都是通過任務(wù)控制塊(TCB)的東西來控制的,一旦任務(wù)創(chuàng)建了,任務(wù)控制塊 OS_TCB 就會被賦值 每個任務(wù)管理塊有 3 個最重要的參數(shù):1,任務(wù)函數(shù)指針;2,任務(wù)堆棧指針;3,任務(wù)優(yōu)先級;任務(wù)控制塊就是任務(wù)在系統(tǒng)里面的身份證( UCOSII 通過優(yōu)先級識
別任務(wù)) 5. 任務(wù)就緒表用來記錄系統(tǒng)中所有處于就緒狀態(tài)的任務(wù)。它是一個位圖,系
統(tǒng)中每個任務(wù)都在這個位圖中占據(jù)一個進制位,該位置的狀態(tài)( 1 或者 0)就表示任務(wù)是否處于就緒狀態(tài) 6. 任務(wù)調(diào)度任務(wù)調(diào)度的作用一是在任務(wù)就緒表中查找優(yōu)先級最高的就緒任務(wù),二是實現(xiàn)任務(wù)的切換。
比如說,當(dāng)一個任務(wù)釋放cpu控制權(quán)后,進行一次任務(wù)調(diào)度,這個時候任務(wù)調(diào)度器首先要去任務(wù)就緒表查詢優(yōu)先級最高的就緒任務(wù),查到之后,進行一次任務(wù)切換,轉(zhuǎn)而去執(zhí)行下一個任務(wù) 7、任務(wù)狀態(tài)UCOSII 的每個任務(wù)都是一個死循環(huán)。每個任務(wù)都處在以下 5 種狀態(tài)之一的狀態(tài)下,這 5
種狀態(tài)是:睡眠狀態(tài)、就緒狀態(tài)、運行狀態(tài)、等待狀態(tài)(等待某一事件發(fā)生)和中斷服務(wù)狀態(tài) 睡眠狀態(tài),任務(wù)在沒有被配備任務(wù)控制塊或被剝奪了任務(wù)控制塊時的狀態(tài)。 就緒狀態(tài),系統(tǒng)為任務(wù)配備了任務(wù)控制塊且在任務(wù)就緒表中進行了就緒登記,任務(wù)已經(jīng)準 備好了,但由于該任務(wù)的優(yōu)先級比正在運行的任務(wù)的優(yōu)先級低, 還暫時不能運行,這時任務(wù)的 狀態(tài)叫做就緒狀態(tài)。 運行狀態(tài),該任務(wù)獲得 CPU 使用權(quán),并正在運行中,此時的任務(wù)狀態(tài)叫做運行狀態(tài)。 等待狀態(tài),正在運行的任務(wù),需要等待一段時間或需要等待一個事件發(fā)生再運行時,該任 務(wù)就會把 CPU 的使用權(quán)讓給別的任務(wù)而使任務(wù)進入等待狀態(tài)。 中斷服務(wù)狀態(tài),一個正在運行的任務(wù)一旦響應(yīng)中斷申請就會中止運行而去執(zhí)行中斷服務(wù)程 序,這時任務(wù)的狀態(tài)叫做中斷服務(wù)狀態(tài)。 8、 建立任務(wù)函數(shù)OSTaskCreat
函數(shù)原型: OSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INTU prio); task:是指向任務(wù)代碼的指針; pdata:是任務(wù)開始執(zhí)行時,傳遞給任務(wù)的參數(shù)的指針; ptos:是分配給任務(wù)的堆棧的棧頂指針; prio 是分配給任務(wù)的優(yōu)先級 每個任務(wù)都有自己的堆棧,堆棧必須申明為 OS_STK 類型,并且由連續(xù)的內(nèi)存空間組
成 9、任務(wù)刪除函數(shù)所謂的任務(wù)刪除,其實就是把任務(wù)置于睡眠狀態(tài),并不是把任務(wù)代碼給刪除了。 UCOSII
提供的任務(wù)刪除函數(shù)原型為: INT8U OSTaskDel(INT8U prio); · 1 · 2 prio 就是我們要刪除的任務(wù)的優(yōu)先級,可見該函數(shù)是通過任務(wù)優(yōu)先級來實現(xiàn)
任務(wù)刪除的 特別注意:任務(wù)不能隨便刪除,必須在確保被刪除任務(wù)的資源被釋放的前提下才能刪
除! 10、請求任務(wù)刪除函數(shù)通過向被刪除任務(wù)發(fā)送刪除請求,來實現(xiàn)任務(wù)釋放自身占用資源后再刪除。 UCOSII 提供的請求刪除任務(wù)函數(shù)原型為: INT8U OSTaskDelReq(INT8U prio); 11、 改變?nèi)蝿?wù)優(yōu)先級函數(shù)INT8U OSTaskChangePrio(INT8U oldprio,INT8U newprio); 12、任務(wù)掛起函數(shù)與恢復(fù)函數(shù)任務(wù)掛起和任務(wù)刪除有點類似,但是又有區(qū)別,任務(wù)掛起只是將被掛起任務(wù)的就緒標
志刪除,并做任務(wù)掛起記錄,并沒有將任務(wù)控制塊任務(wù)控制塊鏈表里面刪除, 也不需要釋
放其資源, 而任務(wù)刪除則必須先釋放被刪除任務(wù)的資源,并將被刪除任務(wù)的任務(wù)控制塊也
給刪了。被掛起的任務(wù),在恢復(fù)(解掛)后可以繼續(xù)運行。 UCOSII 提供的任務(wù)掛起函數(shù)
原型為: INT8U OSTaskSuspend(INT8U prio); 有任務(wù)掛起函數(shù),就有任務(wù)恢復(fù)函數(shù),通過該函數(shù)將被掛起的任務(wù)恢復(fù),讓調(diào)度器能
夠重新調(diào)度該函數(shù)。 UCOSII 提供的任務(wù)恢復(fù)函數(shù)原型為: INT8U OSTaskResumeOSTaskResume(INT8U prio) 13、 STM32上運行ucos 使用任務(wù)1. 編寫任務(wù)函數(shù)并設(shè)置其堆棧大小和優(yōu)先級等參數(shù)//START 任務(wù)//設(shè)置任務(wù)優(yōu)先級#define START_TASK_PRIO 10 //開始任務(wù)的優(yōu)先級設(shè)置為最低//設(shè)置任務(wù)堆棧大小#define START_STK_SIZE 64//任務(wù)堆棧 OS_STK START_TASK_STK[START_STK_SIZE];//任務(wù)函數(shù)void start_task(void *pdata); //LED0任務(wù)//設(shè)置任務(wù)優(yōu)先級#define LED0_TASK_PRIO 7 //設(shè)置任務(wù)堆棧大小#define LED0_STK_SIZE 64//任務(wù)堆棧 OS_STK LED0_TASK_STK[LED0_STK_SIZE];//任務(wù)函數(shù)void led0_task(void *pdata);
//LED1任務(wù)//設(shè)置任務(wù)優(yōu)先級#define LED1_TASK_PRIO 6 //設(shè)置任務(wù)堆棧大小#define LED1_STK_SIZE 64//任務(wù)堆棧 OS_STK LED1_TASK_STK[LED1_STK_SIZE];//任務(wù)函數(shù)void led1_task(void *pdata);
/開始任務(wù)void start_task(void *pdata) { OS_CPU_SR cpu_sr=0; pdata = pdata; OS_ENTER_CRITICAL(); //進入臨界區(qū)(無法被中斷打斷) OSTaskCreate(led0_task,(void *)0,(OS_STK*)&LED0_TASK_STK[LED0_STK_SIZE-1],LED0_TASK_PRIO); OSTaskCreate(led1_task,(void *)0,(OS_STK*)&LED1_TASK_STK[LED1_STK_SIZE-1],LED1_TASK_PRIO); OSTaskSuspend(START_TASK_PRIO); //掛起起始任務(wù). OS_EXIT_CRITICAL(); //退出臨界區(qū)(可以被中斷打斷) } //LED0任務(wù)void led0_task(void *pdata) { while(1) { LED0=0; delay_ms(80); LED0=1; delay_ms(920); }; } //LED1任務(wù)void led1_task(void *pdata) { while(1) { LED1=0; delay_ms(300); LED1=1; delay_ms(300); }; } 編寫了三個任務(wù),堆棧大小都是64,優(yōu)先級分別是10、7、6 2. 初始化UCOSII,并在UCOSII中創(chuàng)建人物,啟動UCOSII調(diào)用OSInit 初始化UCOSII 調(diào)用 OSTaskCreate 函數(shù)創(chuàng)建任務(wù) 調(diào)用 OSStart,啟動 UCOSII int main(void) { delay_init(); //延時函數(shù)初始化 NVIC_Configuration(); LED_Init(); //初始化與LED連接的硬件接口 OSInit(); OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );//創(chuàng)建起始任務(wù) OSStart(); } 1、 OSTaskDel(START_TASK_PRIO); //開始任務(wù),創(chuàng)建完任務(wù)后不再使用,將其刪除 START_TASK_PRIO:是時間的優(yōu)先級,由于每個事件有唯一的優(yōu)先級 OSTaskSuspend(LED1_TASK_PRIO);//將任務(wù)掛起 OSTaskResume(LED1_TASK_PRIO);//將任務(wù)恢復(fù) 1、OSIdleTaskHook(),空閑任務(wù)調(diào)用這個函數(shù),可以用來讓CPU進入低功耗模式 2、OSInitHook(),系統(tǒng)初始化函數(shù)OSInit()調(diào)用此函數(shù)。 3、OSStatTaskHook(),統(tǒng)計任務(wù)每秒中都會調(diào)用這個函數(shù),此函數(shù)允許你向統(tǒng)計任務(wù)中添加自己的應(yīng)用函數(shù)。 4、OSTaskCreateHook(),任務(wù)創(chuàng)建的鉤子函數(shù)。 5、OSTaskDelHook(),任務(wù)刪除的鉤子函數(shù)。 6、OSTaskReturnHook(),任務(wù)意外返回時調(diào)用的鉤子函數(shù),比如刪除某個任務(wù) 7、OSTaskSwHook(),任務(wù)切換時候調(diào)用的鉤子函數(shù)。 8、OSTimeTickHook(),滴答定時器調(diào)用的鉤子函數(shù)。
|