TinyOS调度是任务和事件的二级调度,采用FIFO的简单的策略,任务之间不允许互相抢占,但事件可抢占正在运行的任务或低优先级事件。在通用操作系统里,这种先进先出的调度策略是不可接受的,因为长任务一旦占据了处理器,其他任务无论是否紧急,都必须一直等待至长任务执行完毕。TinyOS之所以可以采用FIFO的调度策略是基于这样一个事实:在传感器网络绝大多数应用中,所需要执行的任务都是短任务。典型的任务有采集一个数据;接收一条消息;发送一条消息。尽管如此,为进一步缩减任务的运行时间,TinyOS采用了分阶段操作模式来减少任务的运行时间。该操作模式下,数据采集、接收消息、发送消息等需要和低速外部设备交互的操作都被分为两个阶段进行。第一阶段:程序启动硬件操作后迅速返回;第二阶段:硬件完成操作后通知程序。分阶段操作的实质就是使请求操作的过程与实际操作的过程相分离。
TinyOS的中断处理程序具有比所有任务更高的优先级,一旦发生中断,处理器将停止执行任务,转而执行相应的中断服务程序。不同的是,TinyOS中断处理程序往往是提交一个任务,而其他操作系统的中断处理程序则一般会向因等待该中断事件而被阻塞的任务发送一条消息。TinyOS的这种运行方式被称为事件驱动。采用事件驱动执行模型对节省能量有十分重要的作用。如果在持续的一段时间内没有中断事件发生,任务队列为空,TinyOS就可使处理器进入休眠模式。
通过研究TinyOS源代码可以发现:TinyOS具有一个长度为8个单元的环形任务队列,每个单元用于存储任务函数入口地址,两个指针FULL和FREE分别指向最早进入队列的任务单元和第一个为空的单元。提交一个任务就是将任务函数入口地址填入到FREE指针所指向的队列单元,然后将FREE指针移至下一个单元;任务调度器在执行一个任务后,将把FULL指针移至下一个单元。如果任务调度器发现FREE指针与FULL指针相等,则表明队列中无任务,系统将进入睡眠状态。(www.xing528.com)
事件用于实时性有要求的应用中,可分为硬件事件和软件事件。硬件事件就是由底层硬件发出的中断,随后进入中断处理函数;软件事件则是带有async关键字的命令或事件函数,以通知相应组件做出适当的处理。在TinyOS 2.x中,SchedulerBasicP是主要的TinyOS调度器,提供带参数的TaskBasic接口。TinySchedulerC是默认的调度器配件(configura-tion),可连接到SchedulerBasicP。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。