【发布时间】:2017-04-03 07:57:49
【问题描述】:
我正在尝试开发一段 contiki 代码,我需要在其中等待三秒钟才能获得传感器输出。虽然这听起来很不像转换器,但在开发时,我想以人类可读的速度模拟行为,因此我需要将计时器设置为 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循环,如下所示: while(!timer_expired(&&transducerOutputWaitTimer)){}; //做点什么
或 cpu_delay_usecs{mytimerdur_in_secs*10^6*}; //做点什么
我认为这两种方法都不优雅。虽然一个会浪费 CPU 周期,但另一个会执行不必要的大型计算。
有没有更好的方法?我知道那个时钟
这个问题附有以下两个:
如何从另一个触发一个 Contiki protothread?如果我能做到这一点,我可以得到一个中断,它会导致传感器输出调用一个进程,我可以从中触发 etimer 和进程事件。
CPU 延迟究竟是什么意思?这是否意味着整个 CPU 时钟周期在给定的持续时间内被阻止?如果是,系统中当前运行的其他进程如何受到影响?
更新 更新 1:while 方法不起作用。代码可能进入了无限循环。 更新 2:我在设置计时器后尝试了 clock_delay(3*CLOCK_SECOND) 方法。有效。但是,在这种情况下,为什么我还需要 timer 方法呢?
更新 3(这会更改答案的上下文,因此根据建议添加此评论)
我的计时器需要在不同的 void 函数中的进程之外使用。在这种情况下,我需要使用 timer() 库而不是 etimer(它特定于某个进程。那么在这种情况下如何让我的方法等待所需的时间?
【问题讨论】:
-
问题已更新
标签: timer contiki protothread