快捷搜索:  www.ymwears.cn  test

浅谈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无法壅闭进程,导致掉足。

TIM和RF中断“竞态”导致node_ process接管到2个旌旗灯号

办理措施:当TIM和RF中断“互斥”时,node_process只能接管到1个旌旗灯号,它就能壅闭在#2语句上,时序精确。

TIM和RF中断“互斥”使node_ process只接管到1个旌旗灯号

履历总结:

1. 思维路线差错:进程与中断的时序掉足,本人老是狐疑“准时器中断非常爆发”导致#2壅闭语句掉败,然后一起         错下去:做准时器中断实验,查数据手册,测试库函数,到网上搜索文章,问询STM8L开拓的职员...... 没有隔离差错源,应该一开始就编写测试用例,查明是不是“准时器中断非常爆发”.

2. 没有彻底测试TempTimer驱动模块,人们对付狐疑的器械,思维上轻易更狐疑它,只管它可能是对的。开拓时,照样要模块化测试,尤其是底层驱动。

3. 像上述对照繁杂的时序和进程开拓,必然要画出时序图,写出逻辑流程图。“进程竞态”的差错,轻易发生,再加上它有时才爆发,难以调试。对于它的良药是:时序图+逻辑流程图。

附:逻辑流程图:

您可能还会对下面的文章感兴趣: