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。