【问题标题】:Contiki delay in secondsContiki 延迟秒数
【发布时间】: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 周期,但另一个会执行不必​​要的大型计算。

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

这个问题附有以下两个:

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

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

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

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

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

【问题讨论】:

  • 问题已更新

标签: timer contiki protothread


【解决方案1】:

在计时器库之上构建了几个 Contiki 抽象 - 通常不需要直接使用 timer_t 结构。取而代之的是事件计时器 (struct etimer),它与 ​​Contiki 进程配合得很好,还有回调计时器 (struct ctimer),两者都在内部使用 struct timer。对于具有更有限 API 的 RAM 消耗较少的选项,有第二个计时器 (struct stimer)。最后,系统中有一个实时定时器(struct rtimer)。

一个example事件定时器用法:设置并等待3秒:

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

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

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

CPU 延迟究竟是什么意思?

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

【讨论】:

  • 我的计时器需要在不同的 void 函数中的进程之外使用。在这种情况下,我需要使用 timer() 库而不是 etimer(它特定于某个进程。那么在这种情况下如何让我的方法等待所需的时间?
  • 您应该更新具有此要求的问题 - 这是非常相关的并且限制了答案。简短的回答是,Contiki 流程产量仅在流程功能本身得到支持。您需要将代码移到那里或将其分成两个函数:第一个将设置等待,第二个将在等待后继续。使用ctimer 会是一个不错的方法。
  • 顺便说一句,我如何获取事件源的句柄?说,我有 PROCESS_EVENT_EXITED。我怎么知道哪个是退出的进程?我可以从 process.c 或 process.h 库中获取指针来执行此操作吗?搜索了这两个源文件,但无法辨认。
猜你喜欢
  • 2013-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 2012-08-19
  • 2011-12-28
  • 2019-12-01
相关资源
最近更新 更多