第三章 TinyOS编程语言nesC
第二节 组件定义
例3.4:
configuration MainC{
provides interface Boot;
uses interface Init as SoftwareInit;
}
组件的规范部分可以为空,表明组件是顶层应用配件,如PowerupAppC。
3.2.2 关键字as
细心的读者会发现,上面MainC配件规范部分的第二条语句中引入了一个新的关键字as。关键字as的作用是为接口定义一个别名。这里是为接口Init定义了一个别名SoftwareInit,表明使用该接口对软件进行初始化。从这个角度来看,使用as可以提高程序的可读性。
除了上述情况外,还有一种情况要求在组件规范中必须使用关键字as。
在组件规范中可能需要多次提供或使用同一接口,此时必须使用关键字as来区分同一类型接口的多个实例。例如,配件LedsC通过Leds接口提供了三个二极管的抽象。LedsC是一个配件,没有可执行代码,它将二极管模块LedsP连接到更为底层的能够激励二极管的组件上。模块LedsP的规范见例3.5,通过使用关键字as,为接口GeneralIO的三个实例定义了不同的别名。总之,在组件规范中,必须确保每个接口实例都具有唯一的名字,才能保证配件实现组件连接的过程中不至于产生混乱。在模块LedsP后的“@”代表属性,详见3.7.5小节。
例3.5:模块LedsP的规范
module LedsP @safe(){
provides{
interface Init;
interface Leds:
}
uses{
interface GeneralIO as Led0;
interface GeneralIO as Led1;
interface GeneralIO as Led2;
}
}
事实上,接口声明中已经隐性地使用了as。下述两条nesC语句中,第一条语句实际上是第二条语句的缩写。
uses interface Leds;
uses interface Leds as Leds;
关键字as不仅可以应用于组件规范中为接口设定别名,还可以应用于配件实现部分,为声明的组件设定别名。他们的作用类似于变量名字和函数名字。有效使用关键字as,会大大提高程序代码的可读性。
3.2.3 将接口分成组
如果组件规范中提供多个接口或者使用多个接口,可以将提供或者使用的多个接口分成组。上面提到的模块LedsP是一个典型的例子,使用大括号将提供的Init接口和Leds接口括起来,并用关键字provides标识,将使用的Led0、Led1和Led2接口括起来,用关键字uses标识。这只是一种编程风格而已,目的是使得代码更加清晰易读。也就是说,例3.6中的两个版本是等价的,这两种写法在语法和代码执行效率方面没有差异。