TinyOS通常都是以“先进先出”的顺序运行任务。一个任务经调度后,只有当前面的所有任务都运行完成后该任务才会运行。这意味着每个任务应该很短。如果一个组件有一个很长的计算,则应该把它分成多个任务。由于任务运行后就不会再存在于队列中,因此为反复运行一个任务,任务可以调度自身。
在当前的mote平台上,大约需要80个微控制器时钟周期来调度和执行一个任务。一般来说,应保持任务的运行时间最多为几个毫秒。因为一个任务运行结束后,一个长时运行的任务或者大量非长时运行的任务可导致任务调度和执行之间的较大的时延(几十毫秒)。
现考虑两种情况,这两种情况都有五个处理组件和一个无线协议栈。mote处理器以8MHz的速率运行。每个处理组件需要占用大量的CPU时间。情况一,处理组件调度任务运行5ms后重新调度自己来继续工作。情况二,处理组件调度任务运行0.5m后重新调度自己来继续工作。(www.xing528.com)
在第一种情况下,任务调度开销是0.02%:执行40000个周期中有80个周期是用做开销。在第二种情况下,任务调度的开销是0.2%:执行4000个周期中有80个周期是用做开销。所以执行完成的时间是没有明显差异的。然而,考虑到任务排队时延,在第一种情况下,当无线协议栈调度一个任务,通知已接收到一个数据包,预计它将大约等待25ms(5个处理任务×每个任务5ms时延)时,就限制了系统每秒最多处理40个数据包。在第二种情况下,当无线协议栈调度一个任务,预计它将大约等待2.5ms(5个处理任务×每个任务0.5m时延)时,就使得系统每秒可处理400个数据包。任务调度代价低,使用大量的短运行时间的任务可提高系统响应,而不会增加CPU的开销。
当然,这里还必须对短运行时间任务的数量和组件中状态数量进行折中。例如,假设要加密一个数据块。如果加密操作需要一段时间(如10ms),可把它分裂成多个任务来执行,以提高整个系统的响应。然而,如果按一个任务来执行,要为任务分配所需的所有状态和暂存空间。相反,分裂任务需要在组件中保持任务的状态和暂存空间。这里没有折中的硬性规定,但总体来说,长时间运行的任务可导致操作系统的其他部分出现问题,因此应尽可能地避免。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。