TinyOS 事件 return 类型含义
TinyOS event return type meaning
因此在 TinyOS 中,一个界面由 commands 和 events 组成。当模块使用接口时,它会调用其命令并提供其事件的实现(提供事件处理程序)。
return类型命令的含义很清楚,它与任何编程语言中的任何function/method命令的含义相同,但是,return类型的命令事件结果我不清楚。
举个例子:
interface Counter{
command int64_t getCounter(int64_t destinationId);
event int64_t counterSent(int64_t destinationId);
}
让我们定义一个提供 Counter 接口的模块。
module Provider{
provides interface Counter;
}
implementation {
int64_t counter;
counter = 75; //Random number
/**
Returns the value of the counter and signals an event that
someone with id equal to destinationId asked for the counter.
**/
command int64_t getCounter(int64_t destinationId){
int64_t signalReturnedValue;
signalReturnedValue = signal counterSent(destinationId);
return counter;
}
}
现在让我们定义两个使用这个接口的模块。
module EvenIDChecker{
uses interface Counter;
}
implementation{
/**
Returns 1 if the destinationId is even, 0 otherwise
**/
event int64_t counterSent(int64_t destinationId){
if(destinationId % 2 == 0){
return 1;
} else {
return 0;
}
}
}
现在让我们定义另一个模块,它使用相同的接口,但执行与 EvenIDChecker 模块相反的操作。
module OddIDChecker{
uses interface Counter;
}
implementation{
/**
Returns 1 if the destinationId is odd, 0 otherwise
**/
event int64_t counterSent(int64_t destinationId){
if(destinationId % 2 == 1){
return 1;
} else {
return 0;
}
}
}
最后,var signalReturnedValue 的最终值是多少?
该值未指定,或者此代码甚至可能无法编译。
在TinyOS中,有一个组合函数的概念,它具有签名type f(type, type)
,其目的是合理组合相同类型的两个值。对于 error_t
定义了这样一个函数:
error_t ecombine(error_t e1, error_t e2) {
return (e1 == e2) ? e1 : FAIL;
}
在您的代码片段等情况下,会自动调用组合函数。
如果你想在这个例子中定义一个组合函数,你需要定义事件的return类型。有关详细信息,请参阅 4.4.3 Combine Functions。
请注意,命令的情况是对称的。您可以将一个接口的两个实现连接到单个 uses
声明,如下所示:
configuration ExampleC {
ExampleP.Counter -> Counter1;
ExampleP.Counter -> Counter2;
}
假设 Counter
有一个 return 的命令,每当 ExampleP
调用该命令时,都会执行两个实现并合并两个 return 值。
因此在 TinyOS 中,一个界面由 commands 和 events 组成。当模块使用接口时,它会调用其命令并提供其事件的实现(提供事件处理程序)。
return类型命令的含义很清楚,它与任何编程语言中的任何function/method命令的含义相同,但是,return类型的命令事件结果我不清楚。
举个例子:
interface Counter{
command int64_t getCounter(int64_t destinationId);
event int64_t counterSent(int64_t destinationId);
}
让我们定义一个提供 Counter 接口的模块。
module Provider{
provides interface Counter;
}
implementation {
int64_t counter;
counter = 75; //Random number
/**
Returns the value of the counter and signals an event that
someone with id equal to destinationId asked for the counter.
**/
command int64_t getCounter(int64_t destinationId){
int64_t signalReturnedValue;
signalReturnedValue = signal counterSent(destinationId);
return counter;
}
}
现在让我们定义两个使用这个接口的模块。
module EvenIDChecker{
uses interface Counter;
}
implementation{
/**
Returns 1 if the destinationId is even, 0 otherwise
**/
event int64_t counterSent(int64_t destinationId){
if(destinationId % 2 == 0){
return 1;
} else {
return 0;
}
}
}
现在让我们定义另一个模块,它使用相同的接口,但执行与 EvenIDChecker 模块相反的操作。
module OddIDChecker{
uses interface Counter;
}
implementation{
/**
Returns 1 if the destinationId is odd, 0 otherwise
**/
event int64_t counterSent(int64_t destinationId){
if(destinationId % 2 == 1){
return 1;
} else {
return 0;
}
}
}
最后,var signalReturnedValue 的最终值是多少?
该值未指定,或者此代码甚至可能无法编译。
在TinyOS中,有一个组合函数的概念,它具有签名type f(type, type)
,其目的是合理组合相同类型的两个值。对于 error_t
定义了这样一个函数:
error_t ecombine(error_t e1, error_t e2) {
return (e1 == e2) ? e1 : FAIL;
}
在您的代码片段等情况下,会自动调用组合函数。
如果你想在这个例子中定义一个组合函数,你需要定义事件的return类型。有关详细信息,请参阅 4.4.3 Combine Functions。
请注意,命令的情况是对称的。您可以将一个接口的两个实现连接到单个 uses
声明,如下所示:
configuration ExampleC {
ExampleP.Counter -> Counter1;
ExampleP.Counter -> Counter2;
}
假设 Counter
有一个 return 的命令,每当 ExampleP
调用该命令时,都会执行两个实现并合并两个 return 值。