首页 理论教育 参数化接口实现的优化方法

参数化接口实现的优化方法

时间:2023-06-28 理论教育 版权反馈
【摘要】:相对于前面介绍的接口函数而言,参数化接口中函数的定义与调用稍有不同,需要增加接口参数部分。参数化接口可以提供多个实例,但只有一个实现。由于每个使用该服务的客户连接了不同的参数标识符,因此,对于分阶段接口而言,这样能够避免完成事件的扇出情形。因此,SourceAC和SourceBC必须作进一步的判断才能了解该事件是否是发给自己的。参数化接口与通用配件的结合能够在编译时虚拟抽象,不会造成空间浪费,也不需要使用函数指针。

参数化接口实现的优化方法

ActiveMessageC是个配件,封装了特定无线通信芯片通信协议栈,如CC2420无线通信芯片的通信组件CC2420ActiveMessageC,而后者也是一个配件,它继续封装了一个模块CC2420ActiveMessageP。也就是说,在模块CC2420ActiveMessageP中,真正定义了参数化接口AMSend的命令。相对于前面介绍的接口函数而言,参数化接口中函数的定义与调用稍有不同,需要增加接口参数部分。接口参数在函数形参列表之前,程序实现在处理接口参数时会像其他变量一样。

例如,在模块CC2420ActiveMessageP中的参数化接口的函数AMSend.send定义如下面代码所示,其中,at_id_t指定了接口参数id的数据类型,而且接口参数位于函数(命令send)形式参数列表之前。这实际上是个函数参数,nesC编译器在编译时即可确定该值。当CC2420 ActiveMessageP要通知sendDone事件时,它取出分组的协议标识符(类型字段),并将其作为接口参数。如果分组AM类型字段值为240,分发代码将通知连接到ActiveMessageC.AMSend[240]的sendDone事件,并最终会调用到模块TestAMC的事件AMSend.send Done()。接收过程类似,不再赘述。

参数化接口可以提供多个实例,但只有一个实现。相对的,上述对于基于名字的方法(比如send240)而言,每个接口实例都要对应一个实现,即便这些实现是完全一样的,这样会造成代码空间的浪费。另外,由于参数是数值,它可以随意设置或更改,比如,下面这种写法。

由于参数是在编译时确定的,nesC能自动填写并以此参数为基础提交分组,因此,参数化接口既简化了代码,又提高了函数调用效率

由于每个使用该服务的客户连接了不同的参数标识符,因此,对于分阶段接口而言,这样能够避免完成事件的扇出情形。

考虑如下两种情况:(www.xing528.com)

情况1

情况2

对于情况1,如果RouterC通知Send.sendDone,会把这个完成事件扇出给SourceAC和SourceBC。因此,SourceAC和SourceBC必须作进一步的判断才能了解该事件是否是发给自己的。对于情况2,由于RouterC中保持了Send[…]中传递的参数标识符,它能够向正确的组件通知完成事件。例如,SourceBC调用了Send.send,它实际是调用了RouteC[1].Send.send()。由于RouterC存放了参数标识符1,因此,它通知完成事件时,就会通过Send.send Done[1](),即直接通知给SourceBC,避免了扇出。

参数化接口与通用配件的结合能够在编译时虚拟抽象,不会造成空间浪费,也不需要使用函数指针

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

我要反馈