首页 理论教育 强大的通用化配件:TimerMilliC及其应用实例

强大的通用化配件:TimerMilliC及其应用实例

时间:2023-06-28 理论教育 版权反馈
【摘要】:nesC也有通用配件,这个通用配件是在建设TinyOS抽象和服务上的一个非常强大的工具。通用配件也是用关键字generic声明的。在深入研究通用配件之前,我们来看一下没有通用配件时的代码。通用配件通过定义一个可以实例化的连接结构来简化这个问题。TimerMilliC是一个提供单一定时器接口的通用配件。下面我们来看一个使用通用化配件TimerMilliC()的应用实例BlinkAppC。其代码可参考例3.19。

强大的通用化配件:TimerMilliC及其应用实例

连接时,组件实例不用带参数。

模块是一个包含可执行代码的组件,配件定义了组件之间的关系,形成更高层次的抽象;通用模块是可重复使用的执行代码,因此,通用配件是组件之间的重复模式,形成了一个更高级别的抽象。nesC也有通用配件,这个通用配件是在建设TinyOS抽象和服务上的一个非常强大的工具。通用配件也是用关键字generic声明的。

在深入研究通用配件之前,我们来看一下没有通用配件时的代码。

例3.37:HilTimerMilliC。这是一个非常重要的组件,但程序中从来没有直接命令它,但是定时器实例化通用组件的一个应用被命名为TimerMilliC,后面我们将会讲到Timer MilliC。HilTimerMilliC是定时器服务的核心部分。许多组件需要定时器,HilTimerMilliC通过它的参数化接口提供了这种能力。HilTimerMilliC封装VirtualizeTimerC,其入参取值是unique(UQ_TIMER_MILLI)的返回值。这意味着如果一个组件AppP需要一个定时器,则它的配件AppC需要这样写:

而实际中AppP需要三个定时器,所以代码应为:

这种方法可以很好地了解TimerC在TinyOS 1.x中是如何工作的。但它存在一些问题。首先,有UQ_TIMER_MILLI散置在系统中的许多个组件中,导致使用的标识符不太可能改变,因而调用一个错误的但有效的参数unique()将不会返回error。例如,如下组件:

其次,有时会有两个组件都连接到定时器的同一个实例,这会导致使用unique的定时器系统内部执行暴露给其他组件。通常情况下,所有的组件都想分配一个新的计时器,但它不关心是如何实现的。

通用配件通过定义一个可以实例化的连接结构来简化这个问题。例如,所有定时器的使用者都想连接一个毫秒定时器,而且它们不必担心unique函数的入参到底是什么。

下面是一个通用配件的例子:TimerMilliC。

例3.38:TimerMilliC。TimerMilliC提供了毫秒定时器这种抽象。TimerMilliC是一个提供单一定时器接口的通用配件。它的实现语句完成的工作是:将提供的定时器接口连接到一个实例,这个实例使用关键词“UQ_TIMER_MILLI”作为函数unique的入参,并以函数unique(UQ_TIMER_MILLI)的结果来参数化定时器接口TimerMilli的参数。这意味着unique()只在一个文件中被调用,只要所有的组件用TimerMilliC分配定时器,就不会存在错误。TimerMilliC的执行非常简单:(www.xing528.com)

其中,TimerMilliP是一个单独的配件,自动连接HilTimerMilliC到启动顺序,并输出HilTimerMilliC的参数化接口:

TimerMilliC封装了一个连接结构给其他组件使用,这个连接结构调用unique wiring到定时器服务。当一个组件实例化TimerMilliC时,它创建一个TimerMilliC代码的副本,这个副本包括调用unique(UQ_TIMER_MILLI)。实例化TimerMilliC的代码如下:

在本质上是:

TimerMilliP在本质上是一个配件,连接到HilTimerMilliC配件。当一个组件在Timer MilliC上调用Timer.start()时,它调用的实际功能是VirtualizeTimerC上的Timer.start()。

下面我们来看一个使用通用化配件TimerMilliC()的应用实例BlinkAppC。

例3.39:BlinkAppC。BlinkAppC连接BlinkC模块到它的三个定时器。其代码可参考例3.19。

连接Blink.Timer0到Timer0,建立如下连接链:

BlinkC和VirtualizeTimerC是两个模块,中间的组件都是配件。当nesC编译这段代码时,所有的中间层将被优化,BlinkC.Timer().start将会在VirtualizeTimerC.Timer[…].start上开始直接函数调用

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

我要反馈