函數描述
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實驗指導書》