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