我正在尝试开发一段连续的代码,我需要等待三秒钟才能获得换能器输出。虽然这听起来很不像换能器,但在开发时,我想以人类可读的速度模拟行为,因此我需要将计时器设置为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 原型线程触发另一个?如果我能做到这一点,我就可以得到导致 transducerOutput 调用一个进程的中断,从中我可以触发 etimer 和进程事件。
CPU 延迟到底是什么意思?这是否意味着整个 CPU 时钟周期在给定的持续时间内被推迟?如果是,系统中当前运行的其他进程如何受到影响?
更新更新1:while 方法不起作用。代码可能进入了一个无限循环。 更新 2:设置计时器后,我尝试使用 clock_delay(3*CLOCK_SECOND) 方法。成功了。但是,在这种情况下,为什么我需要计时器方法?
更新 3(这会更改答案的上下文,因此根据建议添加此评论)
我的计时器需要在进程外部使用不同的 void 函数。在这种情况下,我需要使用 timer() 库而不是 etimer(特定于进程)。那么在这种情况下,我如何让我的方法等待所需的时间呢?
在计时器库之上构建了几个 Contiki 抽象 - 通常不需要直接使用timer_t
结构。取而代之的是事件计时器(struct etimer
),它们与Contiki进程配合得很好,以及回调计时器(struct ctimer
),两者都在内部使用struct timer
。对于具有更有限 API 的 RAM 需求较少的选项,有第二个计时器 (struct stimer
)。最后,系统中有一个实时计时器(struct rtimer
)。
事件计时器用法示例:设置并等待 3 秒:
static struct etimer timer;
etimer_set(&timer, 3 * CLOCK_SECOND);
PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&timer));
如何从一个 Contiki 原型线程触发另一个
?
有process_poll
- 有关更多示例,请参阅过程 API 文档。
CPU 延迟到底是什么意思?
这是一种忙碌等待的形式。不要使用延迟功能或其他形式的繁忙等待超过微秒的延迟 - 不节能,不允许其他进程运行,在最坏的情况下,看门狗可能会过期。