Contiki延迟时间为

时间:2017-04-03 07:57:49

标签: timer contiki protothread

我正在尝试开发一段代码,其中我需要等待三秒钟才能获得传感器输出。虽然这听起来很像传感器,但在开发时,我想以人类可读的速度模拟行为,因此我需要将计时器设置为3秒。

contiki计时器library非常好documented并且有一系列很好的例子,提到了计时器的创建,设置和重置。但是,如果我有以下代码:

timer_set(&transducerOutputWaitTimer);
bool if_blk_executed;
if(timer_expired(&&transducerOutputWaitTimer)){
    if_blk_executed = true;
    //do something
}
if(if_blk_executed)
   printf("Sunrise");
else
   printf("It is not dawned yet");

现在,在设置定时器后,不会立即触发到期。所以if块永远不会被执行。实际上它永远不会曙光。

现在我可以通过两种方式让系统等待。一,通过在计时器上添加while循环,如下所示:    (!timer_expired(安培;&安培; transducerOutputWaitTimer)),而{};    //做点什么

或    cpu_delay_usecs {mytimerdur_in_secs * 10 ^ 6 *};    //做点什么

我没有看到任何一种方法都很优雅。虽然浪费了CPU周期,但另一个会强制执行不必要的大量计算。

还有更好的方法吗?我知道那个时钟

这个问题附有以下两个:

  1. 如何从另一个触发一个Contiki protothread?如果我可以这样做,我可以获得导致transducerOutput调用一个进程的中断,我可以从中触发etimer并处理事件。

  2. CPU延迟究竟是什么意思?这是否意味着整个CPU时钟周期在给定的持续时间内被阻止?如果是,系统中当前正在运行的其他进程如何受到影响?

  3. 更新 更新1:while方法不起作用。代码可能进入无限循环。 更新2:我在设置计时器后尝试使用clock_delay(3 * CLOCK_SECOND)方法。有效。但是,在这种情况下,为什么我需要定时器方法呢?

    更新3(这会更改答案的上下文,因此根据建议添加此评论)

    My Timer需要在不同的void函数中的进程外使用。在这种情况下,我需要使用timer()库而不是etimer(特定于进程。所以如何让我的方法在这种情况下等待所需的时间?

1 个答案:

答案 0 :(得分:0)

在计时器库之上构建了几个Contiki抽象 - 通常不需要直接使用timer_t结构。相反,有一些事件计时器(struct etimer)与Contiki进程以及回调计时器(struct ctimer)一起发挥良好,两者都在内部使用struct timer。对于具有更有限API的较少RAM饥饿选项,存在第二个定时器(struct stimer)。最后,系统中有一个实时计时器(struct rtimer)。

example事件计时器用法:设置并等待3秒:

static struct etimer timer;
etimer_set(&timer, 3 * CLOCK_SECOND);
PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&timer));
  

如何从另一个触发一个Contiki protothread?

process_poll - 有关更多示例,请参阅流程API documentation

  

CPU延迟究竟是什么意思?

这是一种忙碌的等待。不要使用延迟功能或其他形式的忙等待延迟超过微秒 - 不节能,不允许其他进程运行,最坏情况下看门狗可能会过期。