久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3044|回復: 0
收起左側

單片機的Ucous-II操作系統——事件

[復制鏈接]
ID:842875 發表于 2020-11-13 22:19 | 顯示全部樓層 |閱讀模式
本內容來自網絡轉載:

1任務介紹
任務,其實就是一個死循環函數,該函數實現一定的功能,一個工程可以有很多這
樣的任務(最多 255 個),UCOSII對這些任務進行調度管理,讓這些任務可以并發工作
(注意不是同時工作!!,并發只是各任務輪流占用 CPU,而不是同時占用,任何時候還是只有 1個任務能夠占用 CPU 這就是 UCOSII 最基本的功能。 Ucos 任務的一般格式為:
void MyTask (void *pdata)
{
任務準備工作…While(1)//死循環
{ 任務 MyTask 實體代碼;
OSTimeDlyHMSM(x,x,x,x);//調用任務延時函數,釋放 cpu 控制權,
}
}
2. 任務優先級
ucos 中,每個任務都有唯一的一個優先級,優先級是任務的唯一標識
UCOSII 中,使用 CPU的時候,優先級高(數值小)的任務比優先級低的任務具有優先使用權,即任務就緒表中總是優先級最高的任務獲得 CPU 使用權,只有高優先級
的任務讓出 CPU 使用權(比如延時)時,低優先級的任務才能獲得 CPU 使用權
UCOSII 不支持多個任務優先級相同,也就是每個任務的優先級必須不一樣
3. 任務堆棧
就是存儲器中的連續存儲空間。為了滿足任務切換和響應中斷時保存 CPU 寄存
器中的內容以及任務調用其他函數時的需要,每個任務都有自己的堆棧。在創建任務的時候,任務堆棧是任務創建的一個重要入口參數
4. 任務控制塊
任務控制塊 OS_TCB,用來記錄任務堆棧指針,任務當前狀態以及任務優先級等任務屬性
UCOSII 的任何任務都是通過任務控制塊(TCB)的東西來控制的,一旦任務創建了,任務控制塊 OS_TCB 就會被賦值
每個任務管理塊有 3 個最重要的參數:1,任務函數指針;2,任務堆棧指針;3,任務優先級;任務控制塊就是任務在系統里面的身份證( UCOSII 通過優先級識
別任務)
5. 任務就緒表
用來記錄系統中所有處于就緒狀態的任務。它是一個位圖,系
統中每個任務都在這個位圖中占據一個進制位,該位置的狀態( 1 或者 0)就表示任務是否處于就緒狀態
6. 任務調度
任務調度的作用一是在任務就緒表中查找優先級最高的就緒任務,二是實現任務的切換。
比如說,當一個任務釋放cpu控制權后,進行一次任務調度,這個時候任務調度器首先要去任務就緒表查詢優先級最高的就緒任務,查到之后,進行一次任務切換,轉而去執行下一個任務
7任務狀態
UCOSII 的每個任務都是一個死循環。每個任務都處在以下 5 種狀態之一的狀態下,這 5
種狀態是:睡眠狀態、就緒狀態、運行狀態、等待狀態(等待某一事件發生)和中斷服務狀態
睡眠狀態,任務在沒有被配備任務控制塊或被剝奪了任務控制塊時的狀態。
就緒狀態,系統為任務配備了任務控制塊且在任務就緒表中進行了就緒登記,任務已經準
備好了,但由于該任務的優先級比正在運行的任務的優先級低, 還暫時不能運行,這時任務的
狀態叫做就緒狀態。
運行狀態,該任務獲得 CPU 使用權,并正在運行中,此時的任務狀態叫做運行狀態。
等待狀態,正在運行的任務,需要等待一段時間或需要等待一個事件發生再運行時,該任
務就會把 CPU 的使用權讓給別的任務而使任務進入等待狀態。
中斷服務狀態,一個正在運行的任務一旦響應中斷申請就會中止運行而去執行中斷服務程
序,這時任務的狀態叫做中斷服務狀態。
8 建立任務函數
OSTaskCreat
函數原型:
OSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INTU prio)
task:是指向任務代碼的指針;
pdata:是任務開始執行時,傳遞給任務的參數的指針;
ptos:是分配給任務的堆棧的棧頂指針;
prio 是分配給任務的優先級
每個任務都有自己的堆棧,堆棧必須申明為 OS_STK 類型,并且由連續的內存空間組
9任務刪除函數
所謂的任務刪除,其實就是把任務置于睡眠狀態,并不是把任務代碼給刪除了。 UCOSII
提供的任務刪除函數原型為:
INT8U OSTaskDel(INT8U prio)
· 1
· 2
prio 就是我們要刪除的任務的優先級,可見該函數是通過任務優先級來實現
任務刪除的
特別注意:任務不能隨便刪除,必須在確保被刪除任務的資源被釋放的前提下才能刪
除!
10請求任務刪除函數
通過向被刪除任務發送刪除請求,來實現任務釋放自身占用資源后再刪除。 UCOSII 提供的請求刪除任務函數原型為:
INT8U OSTaskDelReq(INT8U prio)
11 改變任務優先級函數
INT8U OSTaskChangePrio(INT8U oldprio,INT8U newprio)
12任務掛起函數與恢復函數
任務掛起和任務刪除有點類似,但是又有區別,任務掛起只是將被掛起任務的就緒標
志刪除,并做任務掛起記錄,并沒有將任務控制塊任務控制塊鏈表里面刪除, 也不需要釋
放其資源, 而任務刪除則必須先釋放被刪除任務的資源,并將被刪除任務的任務控制塊也
給刪了。被掛起的任務,在恢復(解掛)后可以繼續運行。 UCOSII 提供的任務掛起函數
原型為:
INT8U OSTaskSuspend(INT8U prio)
有任務掛起函數,就有任務恢復函數,通過該函數將被掛起的任務恢復,讓調度器能
夠重新調度該函數。 UCOSII 提供的任務恢復函數原型為:
INT8U OSTaskResumeOSTaskResume(INT8U prio)
13、 STM32上運行ucos 使用任務1. 編寫任務函數并設置其堆棧大小和優先級等參數
//START 任務//設置任務優先級#define START_TASK_PRIO                 10 //開始任務的優先級設置為最低//設置任務堆棧大小#define START_STK_SIZE                  64//任務堆棧  
OS_STK START_TASK_STK[START_STK_SIZE];//任務函數void start_task(void *pdata);   
//LED0任務//設置任務優先級#define LED0_TASK_PRIO                  7 //設置任務堆棧大小#define LED0_STK_SIZE                   64//任務堆棧  
OS_STK LED0_TASK_STK[LED0_STK_SIZE];//任務函數void led0_task(void *pdata);

//LED1任務//設置任務優先級#define LED1_TASK_PRIO                  6 //設置任務堆棧大小#define LED1_STK_SIZE                   64//任務堆棧
OS_STK LED1_TASK_STK[LED1_STK_SIZE];//任務函數void led1_task(void *pdata);

/開始任務void start_task(void *pdata)
{
  OS_CPU_SR cpu_sr=0;
    pdata = pdata;
    OS_ENTER_CRITICAL();            //進入臨界區(無法被中斷打斷)   
    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); //掛起起始任務.
    OS_EXIT_CRITICAL();             //退出臨界區(可以被中斷打斷)
}
//LED0任務void led0_task(void *pdata)
{      
    while(1)
    {
        LED0=0;
        delay_ms(80);
        LED0=1;
        delay_ms(920);
    };
}
//LED1任務void led1_task(void *pdata)
{     
    while(1)
    {
        LED1=0;
        delay_ms(300);
        LED1=1;
        delay_ms(300);
    };
}
編寫了三個任務,堆棧大小都是64,優先級分別是1076
2. 初始化UCOSII,并在UCOSII中創建人物,啟動UCOSII
調用OSInit 初始化UCOSII
調用 OSTaskCreate 函數創建任務
調用 OSStart,啟動 UCOSII
int main(void)
{  
    delay_init();            //延時函數初始化  
  NVIC_Configuration();  
    LED_Init();         //初始化與LED連接的硬件接口
    OSInit();   
    OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );//創建起始任務
    OSStart();  
}
1、
OSTaskDel(START_TASK_PRIO); //開始任務,創建完任務后不再使用,將其刪除
START_TASK_PRIO是時間的優先級,由于每個事件有唯一的優先級
OSTaskSuspend(LED1_TASK_PRIO);//將任務掛起
OSTaskResume(LED1_TASK_PRIO);//將任務恢復
1OSIdleTaskHook(),空閑任務調用這個函數,可以用來讓CPU進入低功耗模式
    2OSInitHook(),系統初始化函數OSInit()調用此函數。
    3OSStatTaskHook(),統計任務每秒中都會調用這個函數,此函數允許你向統計任務中添加自己的應用函數。
    4OSTaskCreateHook(),任務創建的鉤子函數。
    5OSTaskDelHook(),任務刪除的鉤子函數。
    6OSTaskReturnHook(),任務意外返回時調用的鉤子函數,比如刪除某個任務
    7OSTaskSwHook(),任務切換時候調用的鉤子函數。
8OSTimeTickHook(),滴答定時器調用的鉤子函數。

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产激情精品一区二区三区 | 高清久久久 | 国产一区二区三区色淫影院 | 久久久五月天 | 天天人人精品 | 中文字幕在线视频免费视频 | 北条麻妃99精品青青久久主播 | 97国产一区二区精品久久呦 | 亚洲午夜一区二区 | 91视频在线看 | 中文字幕欧美一区 | 欧美一区免费 | 视频三区| 日韩aⅴ片 | 涩涩视频在线播放 | 日韩超碰在线 | 亚洲精品一区二区在线观看 | 精品久久久久香蕉网 | 国产第1页 | 男人电影天堂 | 青青草视频免费观看 | 欧美成人综合 | 国产成人综合网 | 欧美一区二区三区精品免费 | 国产精品综合色区在线观看 | 伊人网伊人网 | 一区二区日韩 | 特黄视频| 在线看一区二区三区 | 一区二区成人 | 成人精品一区亚洲午夜久久久 | 久久久视| 亚洲精品视频在线播放 | 精品一二区 | 免费一区| 午夜a区| 免费观看毛片 | 日日夜夜天天干 | 日韩中文一区二区三区 | 日韩有码在线观看 | 免费成人在线网站 |