找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3074|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

單片機的Ucous-II操作系統(tǒng)——事件

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:842875 發(fā)表于 2020-11-13 22:19 | 只看該作者 回帖獎勵 |正序瀏覽 |閱讀模式
本內(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)先級分別是107、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ù)。
    4OSTaskCreateHook(),任務(wù)創(chuàng)建的鉤子函數(shù)。
    5OSTaskDelHook(),任務(wù)刪除的鉤子函數(shù)。
    6、OSTaskReturnHook(),任務(wù)意外返回時調(diào)用的鉤子函數(shù),比如刪除某個任務(wù)
    7OSTaskSwHook(),任務(wù)切換時候調(diào)用的鉤子函數(shù)。
8OSTimeTickHook(),滴答定時器調(diào)用的鉤子函數(shù)。

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表