以秒为单位的连续延迟



我正在尝试开发一段连续的代码,我需要等待三秒钟才能获得换能器输出。虽然这听起来很不像换能器,但在开发时,我想以人类可读的速度模拟行为,因此我需要将计时器设置为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 周期时,另一个会强制执行不必要的大型计算。

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

附在这个问题上的是以下两个:

  1. 如何从一个 Contiki 原型线程触发另一个?如果我能做到这一点,我就可以得到导致 transducerOutput 调用一个进程的中断,从中我可以触发 etimer 和进程事件。

  2. 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 延迟到底是什么意思?

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

相关内容

  • 没有找到相关文章

最新更新