• uCOSIII实时操作系统 五 任务API(任务挂起与恢复)


    任务挂起和恢复

    任务挂起:

    OSTaskSuspend()将任务阻塞,也就是被剥夺CPU的使用权而暂时终止运行,转到阻塞状态,OSTaskSuspend()将任务转到阻塞态被挂起称为任务挂起。被挂起的任务得不到CPU的使用权,也不会参与调度,它相对于调度器而言是看不见的,除非他从挂起态中解除。

    注意:  被挂起的任务不能运行,直到其他任务以该优先级作为参数调用OSTaskResume()来恢复他,才能将该任务的状态重新设置为就绪状态。

    OSTaskSuspend()函数作用:因某些原因暂停运行,但以后还要运行,此函数挂起。

    位置:os_task.c       函数原型:

    1. void OSTaskSuspend (OS_TCB *p_tcb,//挂起指定控制块,可以通过NULL挂起自身
    2. OS_ERR *p_err)//保存该函数的错误码

    注意:任务的挂起与恢复函数在很多时候都是很有用的,比如我们想暂停某个任务运行一段时间,但是我们又需要在其恢复的时候继续工作,因为删除了任务的话,任务的所有信息都是不可能恢复的了,删除是完完全全删除了,里边的资源都会被系统释放掉,而调用挂起任务函数的时候,任务进入挂起态,其内部的资源都会保留下来,同时也不会参加任务调度,当调用恢复函数的时候,整个任务立即从挂起状态进入就绪状态,并且参与任务的调度,如果当前任务优先级是当前就绪态优先级最高的任务,那么立刻就会按照挂起前的任务状态继续执行该任务,

    任务恢复:

    OSTaskResume()函数作用:把挂起任务恢复

    位置:os_task.c

    函数原型:

    1. void OSTaskResume (OS_TCB *p_tcb,//恢复指定的任务块,可以通过NULL恢复自身
    2. OS_ERR *p_err)//保存该函数的错误码

    实例:OSTaskResume((OS_TCB*)&Task2_TaskTCB,&err);//恢复指定任务Task2_TaskTCB
                OSTaskResume((OS_TCB*)0,&err);//恢复自身任务

    注意:OSTaskResume() 函数用于恢复挂起的任务。任务在挂起时候调用过多少次OS_TaskSuspend() 函数,那么就需要调用多少次 OSTaskResume() 函数才能将任务恢复运行。

    任务的挂起与恢复实验:

    实验要求:

    1. 主函数中创建任务1,负责创建任务2和任务3执行完任务函数后删除自身
    2. 任务2和任务3早任务运行的过程中,将自身运行次数通过串口打印PC端
    3. 任务2在执行任务10次后将任务3挂起,在执行任务2 15次后恢复运行。

    此实验在上篇博客http://t.csdnimg.cn/yYrxq的基础上建立

    任务1:

    任务2、3:

    运行结果:

    例程源码:

    1. #include "led.h"
    2. #include "delay.h"
    3. #include "sys.h"
    4. #include "usart.h"
    5. #include "includes.h"
    6. //UCOSIII中以下优先级用户程序不能使用,ALIENTEK
    7. //将这些优先级分配给了UCOSIII的5个系统内部任务
    8. //优先级0:中断服务服务管理任务 OS_IntQTask()
    9. //优先级1:时钟节拍任务 OS_TickTask()
    10. //优先级2:定时任务 OS_TmrTask()
    11. //优先级OS_CFG_PRIO_MAX-2:统计任务 OS_StatTask()
    12. //优先级OS_CFG_PRIO_MAX-1:空闲任务 OS_IdleTask()
    13. //创建任务1
    14. //定义任务优先级
    15. #define TASK_1_PRIO 3
    16. //定义任务控制块
    17. OS_TCB TASK_1_TCB;
    18. //定义任务堆栈大小
    19. #define TASK_1_STK_SIZE 128
    20. //定义任务堆栈
    21. CPU_STK TASK_1_STK[TASK_1_STK_SIZE];
    22. //定义任务函数
    23. void TASK_1(void *arg);
    24. //创建任务2
    25. //定义任务优先级
    26. #define TASK_2_PRIO 4
    27. //定义任务控制块
    28. OS_TCB TASK_2_TCB;
    29. //定义任务堆栈大小
    30. #define TASK_2_STK_SIZE 128
    31. //定义任务堆栈
    32. CPU_STK TASK_2_STK[TASK_2_STK_SIZE];
    33. //定义任务函数
    34. void TASK_2(void *arg);
    35. //创建任务3
    36. //定义任务优先级
    37. #define TASK_3_PRIO 5
    38. //定义任务控制块
    39. OS_TCB TASK_3_TCB;
    40. //定义任务堆栈大小
    41. #define TASK_3_STK_SIZE 128
    42. //定义任务堆栈
    43. CPU_STK TASK_3_STK[TASK_3_STK_SIZE];
    44. //定义任务函数
    45. void TASK_3(void *arg);
    46. int main(void)
    47. {
    48. OS_ERR err1;//错误码变量
    49. CPU_SR_ALLOC();//定义临界区需要的变量
    50. //硬件初始化
    51. delay_init(); //延时初始化
    52. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断分组配置
    53. uart_init(115200); //串口波特率设置
    54. OSInit(&err1);//初始化UCOSIII
    55. OS_CRITICAL_ENTER();//进入临界区代码
    56. //创建开始任务1
    57. OSTaskCreate((OS_TCB * )&TASK_1_TCB, //任务控制块
    58. (CPU_CHAR * )"main TASK1", //任务名字
    59. (OS_TASK_PTR )TASK_1, //任务函数
    60. (void * )0, //传递给任务函数的参数
    61. (OS_PRIO )TASK_1_PRIO, //任务优先级
    62. (CPU_STK * )&TASK_1_STK[0], //任务堆栈基地址
    63. (CPU_STK_SIZE)TASK_1_STK_SIZE/10, //任务堆栈深度限位
    64. (CPU_STK_SIZE)TASK_1_STK_SIZE, //任务堆栈大小
    65. (OS_MSG_QTY )0, //任务内部消息队列能够接收的最大消息数目,为0时禁止接收消息
    66. (OS_TICK )0, //当使能时间片轮转时的时间片长度,为0时为默认长度,
    67. (void * )0, //用户补充的存储区
    68. (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //任务选项
    69. (OS_ERR * )&err1); //存放该函数错误时的返回值
    70. OS_CRITICAL_EXIT();//退出临界区代码
    71. OSStart(&err1);//开启UCOSIII
    72. while(1);
    73. }
    74. void TASK_1(void *arg)
    75. {
    76. OS_ERR err2_3;//错误码变量
    77. CPU_SR_ALLOC();//定义临界区需要的变量
    78. OS_CRITICAL_ENTER();//进入临界区代码
    79. //创建开始任务2
    80. OSTaskCreate((OS_TCB * )&TASK_2_TCB, //任务控制块
    81. (CPU_CHAR * )"main TASK2", //任务名字
    82. (OS_TASK_PTR )TASK_2, //任务函数
    83. (void * )0, //传递给任务函数的参数
    84. (OS_PRIO )TASK_2_PRIO, //任务优先级
    85. (CPU_STK * )&TASK_2_STK[0], //任务堆栈基地址
    86. (CPU_STK_SIZE)TASK_2_STK_SIZE/10, //任务堆栈深度限位
    87. (CPU_STK_SIZE)TASK_2_STK_SIZE, //任务堆栈大小
    88. (OS_MSG_QTY )0, //任务内部消息队列能够接收的最大消息数目,为0时禁止接收消息
    89. (OS_TICK )0, //当使能时间片轮转时的时间片长度,为0时为默认长度,
    90. (void * )0, //用户补充的存储区
    91. (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //任务选项
    92. (OS_ERR * )&err2_3); //存放该函数错误时的返回值
    93. //创建开始任务3
    94. OSTaskCreate((OS_TCB * )&TASK_3_TCB, //任务控制块
    95. (CPU_CHAR * )"main TASK3", //任务名字
    96. (OS_TASK_PTR )TASK_3, //任务函数
    97. (void * )0, //传递给任务函数的参数
    98. (OS_PRIO )TASK_3_PRIO, //任务优先级
    99. (CPU_STK * )&TASK_3_STK[0], //任务堆栈基地址
    100. (CPU_STK_SIZE)TASK_3_STK_SIZE/10, //任务堆栈深度限位
    101. (CPU_STK_SIZE)TASK_3_STK_SIZE, //任务堆栈大小
    102. (OS_MSG_QTY )0, //任务内部消息队列能够接收的最大消息数目,为0时禁止接收消息
    103. (OS_TICK )0, //当使能时间片轮转时的时间片长度,为0时为默认长度,
    104. (void * )0, //用户补充的存储区
    105. (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //任务选项
    106. (OS_ERR * )&err2_3); //存放该函数错误时的返回值
    107. OS_CRITICAL_EXIT();//退出临界区代码
    108. //任务一执行完函数之后删掉自身
    109. OSTaskDel((OS_TCB *)0,&err2_3);
    110. }
    111. void TASK_2(void *arg)
    112. {
    113. int num = 0;//任务2运行次数
    114. OS_ERR err2;
    115. while(1)
    116. {
    117. num++;
    118. if(10==num)
    119. {
    120. OSTaskSuspend((OS_TCB *)&TASK_3_TCB,&err2);
    121. printf("挂起任务三\r\n");
    122. }
    123. else if(15==num)
    124. {
    125. OSTaskResume((OS_TCB *)&TASK_3_TCB,&err2);
    126. printf("恢复任务三\r\n");
    127. }
    128. printf("任务2运行次数:%d\r\n",num);
    129. OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err2);//延时1S
    130. }
    131. }
    132. void TASK_3(void *arg)
    133. {
    134. int num = 0;//任务2运行次数
    135. OS_ERR err3;
    136. while(1)
    137. {
    138. num++;
    139. printf("任务3运行次数:%d\r\n",num);
    140. OSTimeDlyHMSM(0,0,0,500,OS_OPT_TIME_HMSM_STRICT,&err3);//延时500ms
    141. }
    142. }

  • 相关阅读:
    Redis数据库安装(Windows)
    解决Tomcat启动后的控制台乱码问题
    阿里云Redis开发遇到的问题总结
    [ARC116F] Deque Game
    《计算几何》学习笔记
    使用beef劫持用户浏览器
    https证书的常用版本有哪些
    Docker 批量导入镜像
    区间重叠问题
    nginx降权及匹配php
  • 原文地址:https://blog.csdn.net/ttdffmm/article/details/133770168