本內容來自網絡轉載:
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,優先級分別是10、7、6 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);//將任務恢復 1、OSIdleTaskHook(),空閑任務調用這個函數,可以用來讓CPU進入低功耗模式 2、OSInitHook(),系統初始化函數OSInit()調用此函數。 3、OSStatTaskHook(),統計任務每秒中都會調用這個函數,此函數允許你向統計任務中添加自己的應用函數。 4、OSTaskCreateHook(),任務創建的鉤子函數。 5、OSTaskDelHook(),任務刪除的鉤子函數。 6、OSTaskReturnHook(),任務意外返回時調用的鉤子函數,比如刪除某個任務 7、OSTaskSwHook(),任務切換時候調用的鉤子函數。 8、OSTimeTickHook(),滴答定時器調用的鉤子函數。
|