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(" StartTask 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(" Task1 has been running !"); OSTaskSuspend(TASK1_PRIO); } } void Task2(void *p_arg) { (void)p_arg; while(1){ USART1_printf(" Task2 start running !"); OSTaskResume(TASK1_PRIO);
     USART1_printf(" Task2 has been running !"); OSTimeDly(
2*OS_TICKS_PER_SEC); } }

程序执行时序流程:

运行结果:

参考资料:《杭电UCOS-II-ARM7实验指导书》

原文地址:https://www.cnblogs.com/amanlikethis/p/4150452.html