0

我正在尝试开发一段 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 周期,但另一个强制执行不必要的大计算。

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

这个问题附有以下两个:

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

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

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

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

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

4

1 回答 1

0

在计时器库之上构建了几个 Contiki 抽象——通常不需要timer_t直接使用这些结构。取而代之的是事件struct etimer计时器(对于具有更有限 API 的 RAM 消耗较少的选项,有第二个计时器 ( )。最后,系统中有一个实时计时器()。struct ctimerstruct timerstruct stimerstruct rtimer

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

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

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

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

CPU延迟到底是什么意思?

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

于 2017-04-03T09:36:30.083 回答