通用模块是可以使用诸如类型、常量等通用参数的模块。比如下面QueueC的例子中,通用模块的形参类型queue_t像标准的C类型一样,可以用于声明数组(队列)的类型、接口函数返回值的类型等。参数QUEUE_SIZE就像C常量一样,定义模块中的数组queue(队列)的大小。
例3.35:QueueC
1.类型参数
声明通用组件要检查类型。默认情况下,允许对类型参数的操作只有声明变量和赋值。
例:类型参数的操作。
下面两条语句是合法的。
如下的操作是不合法的。
然而,如果需要的话,可以在类型参数后添加后缀@integer()。属性@integer()允许对该类型参数进行整数操作。
例:在类型参数后添加后缀@integer()以允许整数操作。(www.xing528.com)
在通用模块ConstantSensorC中,在类型参数width_t后使用了属性@integer(),表明可以进行整数方面的操作。该类型参数用于指定通用接口Read的类型,进一步的,在通用模块的实现代码中,该类型参数在接口Read的通知事件Read.readDone(SUCCESS,(width_t)val)中,用该类型参数对读取的感知数据val进行了类型强制转换,即val可以被强制转换为整数类型。
例3.36:
实例化通用组件ConstantSensorC时,width_t必须作为整型类型使用,下面两条语句中,第一条是合法的,而第二条是不合法的。
另外,也有属性@number()可以作为后缀,这表示类型参数是一个整型或浮点型。对该类型参数只可进行整型操作或浮点型操作。@number()和@integer()表示nesC语句的属性。
2.通用抽象数据类型
在TinyOS中,有些数据类型,比如队列、比特向量以及通信消息等都是较为通用的,也就是说,往往多个组件都要使用。这些组件对这些通用数据类型可能的需求也不尽一致,比如,对于队列来说,不同的组件可能需要使用不同类型、不同最大长度的队列。如何以一种较为方便的方式来使用这些通用数据类型呢?
通用模块是一种有效的方式,具体的做法是:使用模块变量来存放通用数据状态;使用接口中的命令来访问这些通用数据状态。通过上述的通用模块QueueC例子,不难理解这一点。在通用模块的变量queue中存放队列的状态,为了对队列进行访问,可以使用通用接口Queue<queue_t>,该接口中提供了一系列命令(访问操作),如取队列头元素head()、入队enqueue()、出队dequeue()等等。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。