我正在尝试开发一段 contiki 代码,我需要在其中等待三秒钟才能获得换能器输出。虽然这听起来很不像转换器,但在开发时,我想以人类可读的速度模拟行为,因此我需要将计时器设置为 3 秒。
Contiki 计时器库有很好的文档记录,并且有一系列很好的示例,其中提到了计时器的创建、设置和重置。但是,如果我有如下代码:
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?如果我能做到这一点,我就可以得到一个中断,它会导致transducerOutput 调用一个进程,我可以从这个进程中触发etimer 和进程事件。
CPU延迟到底是什么意思?这是否意味着整个 CPU 时钟周期在给定的持续时间内被阻止?如果是,系统中当前运行的其他进程如何受到影响?
更新 更新 1:while 方法不起作用。代码可能进入了无限循环。更新 2:我在设置计时器后尝试了 clock_delay(3*CLOCK_SECOND) 方法。有效。但是,在这种情况下,为什么我需要 timer 方法呢?
更新 3(这会改变答案的上下文,因此根据建议添加此评论)
我的计时器需要在不同的 void 函数中的进程之外使用。在这种情况下,我需要使用 timer() 库而不是 etimer(它特定于进程。那么在这种情况下如何让我的方法等待所需的时间呢?