UCOSIII任務掛起和恢復
有時候在某個時間段內我們不需要某個任務繼續運行,這時,我們可以將它掛起,但是,過了這個時間段后又需要它繼續運行,這時,我們可以將它恢復;
小理解點:理論上不需要時將任務刪除,需要時再重新創建,這樣也行,但是太麻煩。。。。
UCOSIII任務掛起函數:
void OSTaskSuspend (OS_TCB *p_tcb,OS_ERR *p_err);
參數一 “*p_tcb”:被掛起任務的任務控制塊;
參數二 “*p_err”:錯誤碼,不同錯誤碼有不同的含義,具體見UCOSIII源代碼中這個函數原型那里,那里有詳細注釋;
函數原型所在位置:UCOSIII源碼中,“os_task.c”的大概第1737行;
小知識點:空閑任務不能掛起,如果試圖掛起一個空閑任務,這個函數返回值會為:“OS_ERR_TASK_SUSPEND_INT_HANDLER”,這一點在上面說的函數原型所在位置中關於函數返回值的說明那里有詳細說明;再有,....同上....,系統任務也不能掛起,比如系統中斷服務任務也不能掛起;
UCOSIII任務恢復函數:
void OSTaskResume(OS_TCB *p_tcb,OS_ERR *p_err);
參數一:“*p_tcb”:被掛起任務的任務控制塊;
參數二:“*p_err”:錯誤碼,.........同上.........同上...........
函數原型所在位置:UCOSIII源碼中,“os_task.c”的大概第1175行;
小知識點:基本同上........同上.........同上.......同上.........沒事多看看源碼就知道了
例程:這個例程和前面那篇《UCOSIII任務創建》中的例程基本一樣,下面給出不一樣的地方:
1 //"Led0_task"任務: 2 void Led0_task(void *p_arg) 3 { 4 OS_ERR err; 5 static char i=0; 6 p_arg = p_arg; //故意使用一下這個參數,否則編譯器會警告說此參數沒有使用 7 while(1) 8 { 9 LED0=~LED0; 10 OSTimeDlyHMSM(0,0,0,300,OS_OPT_TIME_HMSM_STRICT,&err); 11 i++; 12 if(i==15)//上面定義了一個靜態變量,當i加到15就將“Led1_task”任務掛起 13 { 14 OSTaskSuspend((OS_TCB*)&Led1TaskTCB,&err);//任務掛起函數 15 printf("掛起了\"Led1_task\"任務\r\n"); 16 } 17 if(i==25)//當i加到25,再將“Led1_task”任務恢復,這樣,任務的掛起和恢復就測試完了 18 { 19 OSTaskResume((OS_TCB*)&Led1TaskTCB,&err);//任務恢復函數 20 printf("恢復了\"Led1_task\"任務\r\n"); 21 } 22 } 23 }
在上邊我們可以看出,任務的掛起和恢復就是在“Led0_task”這個任務中完成的,通過定義一個變量“i”,任務一每次將“i”加1,在 i 等於15和25處分別將“Led1_task”任務掛起和恢復,那么任務現象自然就是,“Led1_task”任務本來是正常執行的,當“i”等於15時,暫停執行了,當“i”等於25時恢復執行了。