最近对实时操作系统比较感兴趣,然后就仔细阅览了一番uC/OS-II的代码,之前也初略的阅览过,可是这次阅览的确有不少的收成。
uC/OS-II是经典的实时操作系统,开源的长处便是能够运用者自己去剖析和裁剪。我就简略的阐明一下uC/OS-II中的使命挂起以及使命唤醒操作。
在uC/OS-II中使命之间的切换比较简略,便是运转态-安排妥当态-挂起态(等候态)-中止服务态-睡觉态,其间睡觉态主要是指没有被创立的使命,也便是咱们能够界说许多的使命,可是不必定悉数创立,当然也能够是被删除今后的使命,咱们也能够称之为睡觉态,这也是咱们不常常运用的使命。其他的中止服务态实际上便是在中止服务中,他的运转级别是最高的。安排妥当态便是现已做好运转预备的状况,运转态永久只要一个使命处于运转态。而挂起态或许称等候态是最杂乱的进程,其间牵涉到许多中不同的挂起状况。
几种典型的挂起态我做一下总结:
1、使命的挂起操作,一般都是选用OSTaskSuspend()将使命挂起,这种挂起的操作一般都是比较简略的将安排妥当表中优先级对应的位和组别离铲除即可,而这种挂起的方法被唤醒的方法有且只要一种,即选用OSTaskResume()函数将安排妥当表中优先级对应的位和组安排妥当即可。这也应该说是最精确的挂起,而不是所谓的等候态。
2、使命中调用时间推迟函数的挂起方法,精确的说这种挂起便是等候态,咱们所谓的推迟等候,根本的完成原理便是经过节拍服务函数OSTimeTick()减小推迟等候时间,这个实际上便是对使命操控块OS_TCB中的变量OSTCBDly操作而完成的。在OSTCBDly>0期间将使命在安排妥当表中的位和组别离铲除,是使命处于挂起操作,这种挂起本质和使命的挂起方法相同。可是OSTimeTick()的完成进程会检测使命是否是被OSTaskSuspend()挂起,也便是真实的挂起态,只要当使命不是被OSTaskSuspend()挂起时才干被唤醒,这是需求留意的。
3、关于通讯机制、同步进程中的使命挂起,这种使命挂起本质上是使命等候状况,完成的进程中会涉及到两个续表,其间一个便是使命安排妥当表,另一个是使命等候续表,别的为了完成等候超时等问题,将OSTCBDly也考虑了进来,这样也就使得这种使命的等候比之前的两种挂起方法要杂乱。可是等候超时与等候推迟有必定的相似之处,但不同的当地便是需求将等候续表中对应的优先级方位铲除,再设置安排妥当表中的方位位1,回来超时过错,这样就能完成超时的挂起操作,而一般的事情等候机制,都是涉及到中止、使命与使命之间的通讯或许同步问题,挂起操作首先将使命在安排妥当表中的安排妥当标志位铲除,一起设置使命的状况为某种方式的挂起,然后设置等候续表中的相关方位,最终完成使命的调度。使命的唤醒操作是另一个使命宣布信号,然后从等候续表中铲除最高优先级的使命,然后设置该使命在安排妥当表中的方位,并设置使命的状况,最终完成使命的调度操作。一行就能完成使命的挂起操作。
归纳上面的总结能够知道uC/OS-II的使命挂起操作主要是3种,其间前两种比较而言比较简略,仅仅简略的依托安排妥当表或许时间推迟变量即可完成。而当涉及到使命的同步等机制时就会依托安排妥当表,等候续表,以及时间推迟变量。可是使命的挂起和睡觉本质上也是存在不同的,并不是同一种概念,因而咱们在学下uC/OS-II的进程中需求特别留意。