首页 理论教育 如何在TinyOS中调度任务?

如何在TinyOS中调度任务?

时间:2023-06-28 理论教育 版权反馈
【摘要】:使用关键字post为稍后的执行调度一个任务:在上例中,一旦TinyOS完成初始化序列,它将运行setupTask()。发布一个任务总是返回SUCCESS,除非该任务被挂起。如果中断处理程序发布一个或者多个任务,TinyOS将会一直执行到没有任务可执行,然后进入睡眠状态。接收处理器把数据包放入队列,并在应用不发送数据包时调度send任务。例如,BaseStationP不能将一个指向消息的指针作为参数传递给任务sendTask。

如何在TinyOS中调度任务?

任务是由nesC提供的一个简单的延期计算机制,任务有一个void的返回值,不带参数(不带参数可以保持任务调度的简单性),并且用关键字task声明。

使用关键字post为稍后的执行调度一个任务:

在上例中,一旦TinyOS完成初始化序列(信号初始化,初始化所有组件),它将运行setupTask()。

和其他模块的代码类似,任务可以访问变量,调用命令,给事件发送信号,调用内部或全局的C函数。任务的调度操作就如同调用一个返回值为error_t的函数。发布一个任务总是返回SUCCESS,除非该任务被挂起。从另一个角度说,一个组件不能同时调度同一个任务的多个备份。但是,一个任务一旦开始运行,它可以再次调度它自己。

下面的代码是在系统初始化后运行的TinyOS核心调度循环,这个函数没有返回值。它执行任务直到任务队列为空,然后让微控制器进入睡眠状态。

这段代码的伪代码是:(www.xing528.com)

TinyOS一直处于睡眠状态直到中断唤醒处理器为止。如果中断处理程序发布一个或者多个任务,TinyOS将会一直执行到没有任务可执行,然后进入睡眠状态。任务是一个接一个执行的,不可抢先占用,直到当前任务执行完成,下一个任务才可执行。任务的这种属性极大地简化了代码编写的任务量,所有的同步代码不需要任何机制来保护共享变量。同步例程假设直到它完成前,它已经完全控制处理器。

以BaseStation应用为例。BaseStation连接UART串口无线通信模块。BaseStation把所有通过无线信道接收到的数据包发送给UART,并把所有接收到的UART数据包发送到无线通信模块。因为无线和UART可能有不同的吞吐量,BaseStation在每个方向都有一个发送队列。当它从无线信道接收到一个数据包时,它把该数据包置于无线模块到UART的发送队列中。当它接收到一个UART数据包时,它把该数据包置于UART到无线模块的发送队列中。

BaseStationP是执行BaseStation应用的模块,它使用任务从队列中提取数据包并发送数据包。接收处理器把数据包放入队列,并在应用不发送数据包时调度send任务。其伪代码如下。

任务不带参数。如果一个组件需要传递一个数据给任务,则这个数据必须存储在这个组件的变量中。例如,BaseStationP不能将一个指向消息的指针作为参数传递给任务sendTask。相反,sendTask必须直接从队列中提取数据包。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈