uCOS-II任務的掛起和恢復


函數描述

OSTaskSuspend()
功能描述:無條件掛起一個任務。調用此函數的任務也可以傳遞參數OS_PRIO_SELF,掛起調用任務本身。
函數原型:INT8U OSTaskSuspend ( INT8U prio);
參數說明:prio為指定要獲取掛起的任務優先級,也可以指定參數OS_PRIO_SELF,掛起任務本身。此時,下一個優先級最高的就緒任務將運行。
返回值:
OSTaskSuspend()的返回值為下述之一:
 OS_NO_ERR:函數調用成功。
 OS_TASK_ SUSPEND_IDLE:試圖掛起μC/OS-II中的空閑任務(Idle task)。此為非法操作。
 OS_PRIO_INVALID:參數指定的優先級大於OS_LOWEST_PRIO或沒有設定OS_PRIO_SELF的值。
 OS_TASK_ SUSPEND _PRIO:要掛起的任務不存在。


OSTaskResume()
功能描述:喚醒一個用OSTaskSuspend()函數掛起的任務。OSTaskResume()也是唯一能“解掛”掛起任務的函數。
函數原型:NT8U OSTaskResume ( INT8U prio)
參數說明:prio指定要喚醒任務的優先級 
返回值:
OSTaskResume ()的返回值為下述之一:
 OS_NO_ERR:函數調用成功。
 OS_TASK_RESUME_PRIO:要喚醒的任務不存在。
 OS_TASK_NOT_SUSPENDED:要喚醒的任務不在掛起狀態。
 OS_PRIO_INVALID:參數指定的優先級大於或等於OS_LOWEST_PRIO。

使用注意

  當前任務掛起后,只有其他任務才能喚醒被掛起的任務。任務掛起后,系統會重新進行任務調度,運行下一個優先級最高的就緒任務。喚醒掛起任務需要調用函數OSTaskResume()。 任務的掛起是可以疊加到其他操作上的。例如,任務被掛起時正在進行延時操作,那么任務的喚醒就需要兩個條件:延時的結束以及其他任務的喚醒操作。又如,任務被掛起時正在等待信號量,當任務從信號量的等待對列中清除后也不能立即運行,而必須等到被喚醒后。 

 

一個測試范例

測試平台:STM32

測試代碼:

#define StartTaskPrio      4   
#define TASK1_PRIO         5  
#define TASK2_PRIO         6  

int main(void)
{
    USART1_Config();    
    OSInit();
    OSTaskCreate(StartTask, (void *)0, &StartTaskStk[StartTaskStkLength-1], StartTaskPrio);                     
    OSStart();
    return 0; 
}

void StartTask(void *p_arg)
{
    (void)p_arg;
    
USART1_printf("\nStartTask has been running !"); SysTick_Config(SystemCoreClock
/ OS_TICKS_PER_SEC); OSTaskCreate(Task1, (void *)0, &task1_stk[TASK1_STK_SIZE-1], TASK1_PRIO); OSTaskCreate(Task2, (void *)0, &task2_stk[TASK2_STK_SIZE-1], TASK2_PRIO); OSTaskSuspend(StartTaskPrio); } void Task1(void *p_arg) { (void)p_arg; while(1){ USART1_printf("\nTask1 has been running !"); OSTaskSuspend(TASK1_PRIO); } } void Task2(void *p_arg) { (void)p_arg; while(1){ USART1_printf("\n\nTask2 start running !"); OSTaskResume(TASK1_PRIO);
     USART1_printf("\nTask2 has been running !"); OSTimeDly(
2*OS_TICKS_PER_SEC); } }

程序執行時序流程:

運行結果:

 

參考資料:《杭電UCOS-II-ARM7實驗指導書》

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM