Tinyos 2.0 笔记小结(1)

1. configure组件注意事项

 

一般在configure的配置中很少用到 uses interface (外部规格元素)。 常见的都是定义provides interface, 然后用“=”与相关的provider想关联(配线)。但如果定义了uses interface, 也同样需要用“=”与相关的user(内部)或provider(外部)想关联(配线)。

 

因为nesC 有三种配线陈述:

  • endpoint1=endpoint2:( 赋值配线) 任何连接包括一外部规格元素。这些有效地使两规格元素相等。设S1是endpoint1的规格要素,S2是endpoint2的规格要素。下面两个条件之一必须满足,否则就会产生编译时间错误:
        – S1 是内部的, S2 是外部的 (反之亦然) ,并且 S1 和 S2都是被提供或都是被使用
        – S1 和 S2 都是外部的,而且一个被提供,而另一个被使用.
  • endpoint1->endpoint2:( 联编配线) 一个连接包括二种内在的规格元素。.联编配线总是连结一由endpoint1指定的使用规格元素到一endpoint2指定的提供规格元素。如果这两个条件不能满足, 就会发生编译-时间错误.。
  • endpoint1<- endpoint2 与endpoint2 -> endpoint1是等价的。

 

2. 定义函数变量的要点

函数中定义局部成员变量,学要放在所有逻辑表达式的前面(即函数最前面,或局部代码的前面)。 否则会出现编译错误“syntax error”

 

 例如

void fun(){
        int i;
        uint8_t num;
        
        i=0;
        if(i!=0){
                //do some
        }
        
         int j; //会导致编译错误
         j=0;
}

 

修正这个错误可以通过把int j 移到函数的开头,或者

void fun(){
        int i;
        uint8_t num;
        
        i=0;
        if(i!=0){
                //do some
        }
        
         {
          int j; //会导致编译错误
         j=0;
         }
}

 

3.  Split-Phase注意事项

 

调用split-phase操作时注意防止‘死锁’

 

比如AMSend.send(...), 一般会用一个flag busySendif(busySend) 来防止冲突。

 

if(busySend)
    postTask();
else{
    busySend=TRUE;
    call AMSend.send(...);
}

...

event void AMSend.sendDone(...) {
    busySend=FALSE;
}
 

 

但是这样做有个问题, 就是如果send()调用失败的发返回FAILED的话就不会再激活event sendDone, 这样busySend将永远无法设回FALSE而导致死锁。 解决方法把上面的代码改为:

 

if(busySend)
    postTask();
else{
    if(call AMSend.send(...) == SUCCESS)
        busySend=TRUE;
}

 

 在成功执行send(成功占用资源)后在加锁。

 

 

4. Serial监听时出现 bad packet, packet too long等错误

试着调低serial的speed, 比如从115200改为57600。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值