首页 理论教育 任务和调用循环的方案介绍

任务和调用循环的方案介绍

时间:2023-06-28 理论教育 版权反馈
【摘要】:驱动程序以10ms周期采样磁力计,并利用EWMA平滑读数。如果因为某种原因,应用程序将FastSamplerC连接到FliterMagC,将会在read和readDone中直接有一个循环调用。如果编译器不能优化函数调用,将会引起堆栈显著增长。在请求完成通知事情中发出新的请求是一种常见的调用模式。它需要对随后调用的函数进行调度,正确的方式是使用任务。一段时间后,TinyOS运行该任务,该任务用滤波器值作为参数发送给Read.readDone。

任务和调用循环的方案介绍

回顾Read操作,大多数传感器接口可为用户提供生成的传感器读数。Read操作有一个命令read和一个单独的事件(readDone)。若一个传感器有噪声,为了尽量滤掉一些噪声,应用程序需要一个简单的滤波器组件,指数加权移动平均(EWMA)平滑原始读数。

驱动程序以10ms周期采样磁力计,并利用EWMA平滑读数。当应用通过调用Read.read来采样已滤波的值时,FilterMagC仅发送给Read.readDone缓存的已滤波的值。

一方面,这种方法非常简单和快速;但另一方面,它也可导致堆栈中的重大问题。例如,如果FastSamplerC组件想要多次快速地采样传感器数据,它将调用Read.readDone处理程序中的Read.read。

如果因为某种原因,应用程序将FastSamplerC连接到FliterMagC,将会在read和readDone中直接有一个循环调用。如果编译器不能优化函数调用,将会引起堆栈显著增长。给定的motes仅有有限的RAM并且没有硬件的内存保护,快速增长的堆栈会损坏数据内存,并导致程序崩溃

当然,利用上述例子中Read操作采集高频率的信号是不合理的。对于一个缓存值,多于一次的采样是没有任何帮助的。在请求完成通知事情中发出新的请求是一种常见的调用模式。(www.xing528.com)

在FilterMagC中该如何给readDone事件发送一个信号呢?它需要对随后调用的函数进行调度,正确的方式是使用任务。下面是数据滤波器组件的代码。

当FilterMagC的Read.read被调用时,FilterMagC调度readDoneTask并直接返回。一段时间后,TinyOS运行该任务,该任务用滤波器值作为参数发送给Read.readDone。

同步代码几乎可以满足所有的应用层程序编写的需要。但是,在高性能应用程序和底层驱动程序中,有时会要求额外的功能和并发模式。在下一部分将主要介绍两种额外的机制:异步代码和资源锁。异步代码是nesC语言的一个特点,资源锁是TinyOS的一组组件和机制。

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

我要反馈