今天小编要和大家分享的是RF,无线相关信息,接下来我将从浅谈Contiki下进程与中断时序Bug解决方案,cc2650launchpad 运行contiki hello-world示例程序这几个方面来介绍。
RF,无线相关技术文章浅谈Contiki下进程与中断时序Bug解决方案
几天前一个Bug,调试了2天才解决(已经有几年没有遇到过了),为此将该问题的原因和解决思路记载,以备忘和共享。生命有限,错误不能重犯。欢迎讨论,更欢迎您共享经验和智慧给我们。
需求引入:在无线组网通信中,为充分节能,Node一般需要深度睡眠,4秒内唤醒。Sink和Node通信时序如下
实现代码:基于Contiki操作系统的进程实现代码如下,其中PROCESS_YIELD()用于阻塞进程,等待信号。
/* Turn on RF to listen awake tone. */
NETSTACK_RADIO.on();
temptimer_Start(s_wWaitAwakeTime, InformTimeout);
PROCESS_YIELD();/* #1 阻塞进程,等待超时或接收到唤醒信号 */
if (PROCESS_EVENT_RX_AWAKE_TONE == ev) /* RX awake tone */
{
/* EXPLAIN: TIM is turned off by ISR of RF. */
temptimer_Start(s_wWaitDataTime, InformTimeout);
PROCESS_YIELD();/* #2 阻塞进程,等待超时或接收到数据帧 */
......
}
else /* Rx data that not to us */
{
......
}
错误原因:如下图所示,当node_process同时接收到2个信号时,上面代码的#2无法阻塞进程,导致出错。