必威体育Betway必威体育官网
当前位置:首页 > IT技术

挂起任务OSTaskSuspend()

时间:2019-10-06 11:45:42来源:IT技术作者:seo实验室小编阅读:59次「手机版」
 

ostasksuspend

  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. }  

相关阅读

基于quartz的任务调度插件封装,快速集成项目

simple-quartz-tasks基于quartz的任务调度插件,引入到spring项目中实现任务信息装载接口即可使用,依赖于redis的订阅完成对任务的立

win10 任务栏全透明,一键设置(translucentTB)

方式1: 通过系统个性化设置任务栏为透明,但此方法可能行不通,就算设置成功了也是只有50%的透明度 要使任务栏全透明,只能采用方式2,

Android近期任务列表Recent List(Recents Screen)的实现

一、明确android的近期任务是什么:我们的手机下方一般有三个键,一个是返回键,中间的是home键,另一个是RecentList键,也就是最近浏览记

dnf安图恩攻坚前置任务完成攻略 dnf使命四个任务怎么

dnf安图恩攻坚前置任务完成攻略,dnf使命四个任务怎么做?想必不少友友都不太清楚,下面跟随小编冉冉一起去看看吧!dnf安图恩攻坚前置

大学生校园创业商机 校园任务能够解决高校什么问题?

“双十一”前夕,随着零点校园生活服务平台逐步完善,新上线的以校园跑腿为主的任务大厅将带给同学们全新的体验。时间不够

分享到:

栏目导航

推荐阅读

热门阅读