zoukankan      html  css  js  c++  java
  • 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实验指导书》

  • 相关阅读:
    Ensemble.Tofino运行报错Unexpected java bridge exception的解决
    【Flex Viewer】源码介绍(3)Flex Viewer架构解析
    【Flex Viewer】源码介绍(1)Flex Viewer简介
    【Flex Viewer】 开发教程(4)Widget与WidgetTemplate
    【Flex Viewer】源码介绍(2)Flex Viewer源码包结构
    Flex与.NET互操作:基于WebService的数据访问
    浅谈我对几个Web前端开发框架的比较【转帖】
    11个GIS相关的iphone应用程序(Apps)
    【Flex Viewer】 开发教程(1)Flex Viewer配置文件
    VS2010 设置include路径
  • 原文地址:https://www.cnblogs.com/amanlikethis/p/4150452.html
Copyright © 2011-2022 走看看