挂起任务OSTaskSuspend()

来源:互联网 发布:软件开发工作计划 编辑:程序博客网 时间:2024/06/06 01:06
  1. 有时候将任务挂起是很有用的。挂起任务可通过调用OSTaskSuspend()函数来完成。被挂起的任务只能通过调用OSTaskResume()函数来恢复。任务挂起是一个附加功能。也就是说,如果任务在被挂起的同时也在等待延时的期满,那么,挂起操作需要被取消,而任务继续等待延时期满,并转入就绪状态。任务可以挂起自己或者其它任务。  
  2.     OSTaskSuspend()函数的代码如程序清单 L4.16所示。通常OSTaskSuspend()需要检验临界条件。首先,OSTaskSuspend()要确保用户的应用程序不是在挂起空闲任务[L4.16(1)],接着确认用户指定优先级是有效的[L4.16(2)]。记住最大的有效的优先级数(即最低的优先级)是OS_LOWEST_PRIO。注意,用户可以挂起统计任务(statistic)。可能用户已经注意到了,第一个测试[L4.16(1)]在[L4.16(2)]中被重复了。笔者这样做是为了能与µC/OS兼容。第一个测试能够被移除并可以节省一点程序处理的时间,但是,这样做的意义不大,所以笔者决定留下它。  
  3.     接着,OSTaskSuspend()检验用户是否通过指定OS_PRIO_SELF来挂起调用本函数的任务本身[L4.16(3)]。用户也可以通过指定优先级来挂起调用本函数的任务[L4.16(4)]。在这两种情况下,任务调度程序都需要被调用。这就是笔者为什么要定义局部变量self的原因,该变量在适当的情况下会被测试。如果用户没有挂起调用本函数的任务,OSTaskSuspend()就没有必要运行任务调度程序,因为正在挂起的是较低优先级的任务。  
  4.     然后,OSTaskSuspend()检验要挂起的任务是否存在[L4.16(5)]。如果该任务存在的话,它就会从就绪表中被移除[L4.16(6)]。注意要被挂起的任务有可能没有在就绪表中,因为它有可能在等待事件的发生或延时的期满。在这种情况下,要被挂起的任务在OSRdyTbl[]中对应的位已被清除了(即为0)。再次清除该位,要比先检验该位是否被清除了再在它没被清除时清除它快得多,所以笔者没有检验该位而直接清除它。现在,OSTaskSuspend()就可以在任务的OS_TCB中设置OS_STAT_SUSPEND标志了,以表明任务正在被挂起[L4.16(7)]。最后,OSTaskSuspend()只有在被挂起的任务是调用本函数的任务本身的情况下才调用任务调度程序[L4.16(8)]。  
  5.   
  6. 程序清单 L 4.16 OSTaskSuspend().  
  7. INT8U OSTaskSuspend (INT8U prio)  
  8. {  
  9.     BOOLEAN   self;  
  10.     OS_TCB   *ptcb;  
  11.   
  12.     if (prio == OS_IDLE_PRIO) {                                               (1)  
  13.         return (OS_TASK_SUSPEND_IDLE);  
  14.     }  
  15.     if (prio >= OS_LOWEST_PRIO && prio != OS_PRIO_SELF) {                        (2)  
  16.         return (OS_PRIO_INVALID);  
  17.     }  
  18.     OS_ENTER_CRITICAL();  
  19.     if (prio == OS_PRIO_SELF) {                                               (3)  
  20.         prio = OSTCBCur->OSTCBPrio;  
  21.         self = TRUE;  
  22.     } else if (prio == OSTCBCur->OSTCBPrio) {                                (4)  
  23.         self = TRUE;  
  24.     } else {  
  25.         self = FALSE;  
  26.     }  
  27.     if ((ptcb = OSTCBPrioTbl[prio]) == (OS_TCB *)0) {                     (5)  
  28.         OS_EXIT_CRITICAL();  
  29.         return (OS_TASK_SUSPEND_PRIO);  
  30.     } else {  
  31.         if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) {          (6)  
  32.             OSRdyGrp &= ~ptcb->OSTCBBitY;  
  33.         }  
  34.         ptcb->OSTCBStat |= OS_STAT_SUSPEND;                                    (7)  
  35.         OS_EXIT_CRITICAL();  
  36.         if (self == TRUE) {                                                   (8)  
  37.             OSSched();  
  38.         }  
  39.         return (OS_NO_ERR);  
  40.     }  
  41. }  
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 上眼皮过敏肿了怎么办 上眼皮又痒又肿怎么办 上眼皮红肿痛是怎么办 上眼皮肿的厉害怎么办 眼皮肿了还痒痒怎么办 眼睛被手指戳到怎么办 打球眼睛撞肿了怎么办 打球时眼睛被戳怎么办 狗眼睛被打充血怎么办 一只眼睛磨的慌怎么办 5个月宝宝结膜炎怎么办 金毛眼屎多白色怎么办 金毛眼红有眼屎怎么办 狗狗眼睛上火了怎么办 狗上火了眼屎多怎么办 金毛走路扭腰怎么办 金毛流鼻涕微黄怎么办 狗狗下眼皮红了怎么办 金毛眼睛打肿了怎么办 金毛的眼睛红怎么办 眼睛干涩有红血丝怎么办 小孩子眼睛红有眼屎怎么办 狗狗的肉垫粗糙怎么办 狗狗眼睛变蓝色怎么办 脸被太阳晒伤了怎么办 皮肤晒伤红肿痒怎么办 3岁儿童频繁眨眼怎么办 狗狗的眼睛红肿怎么办 脸过敏发红怎么办不痒 上眼皮红肿痒是怎么办 眼睛痒了几天了怎么办 眼睛肿了还痒怎么办 孩子脸上有红血丝怎么办 脸上长了红血丝怎么办 指甲受创出血了怎么办 手指被挤压紫了怎么办 眼睛撞了有淤血怎么办 下眼底有小白点怎么办 狗的白眼球充血怎么办 眼球有出血点是怎么办 吃阿胶上火了该怎么办