2017-04-03 122 views
0

我想开发一个contiki代码片段,我需要等待传感器输出三秒钟。尽管在开发时这听起来可能听起来很像传感器,但我想模拟人类可读速度下的行为,因此我需要将计时器设置为3秒。Contiki在几秒钟内延迟

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. 我怎样才能触发一个半自助旅游旅行社protothread从另一个?如果我可以做到这一点,我可以得到中断,导致transducerOutput调用一个可以触发etimer并处理事件的进程。

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

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

更新3(这改变了答案的上下文中,因此加入此评论按照建议)

我的计时器需要以不同的空隙功能的处理之外使用。在这种情况下,我需要使用定时器()库,而不是etimer(这是特定的一个过程。那么,如何让我的方法,以等待在这种情况下所需的时间?

+0

问题更新 –

回答

0

有几个半自助旅游旅行社内置计时器库顶抽象 - 通常没有必要用户timer_t结构,而不是直接,也有事件计时器(struct etimer),这与半自助旅游旅行社流程一起玩好,回调定时器(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)); 

我怎样才能触发一个半自助旅游旅行社protothread从另一个?

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

究竟是什么CPU的延迟意味着什么呢?

它的忙等待的形式。不要使用延时函数或其他形式的忙等待延误超过微秒长 - 不节能,不允许其他进程运行,而在最坏的情况下监视可能会失效。

+0

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

+0

您应该更新问题这一要求 - 这是非常相关的,制约的答案简短的回答是,半自助旅游旅行社方法的收率在处理功能本身只支持你要么需要有移动你的代码或分开,在两个功能:第一个将设置。等候,第二个将继续等待后,使用'ctimer'将是很好的办法如何做到这一点。 – kfx

+0

BTW,我如何获得句柄到事件的来源是什么?我说,我已经PROCESS_EVENT_EXITED。我怎么知道这是退出的过程吗?我可以从process.c或process.h库获取指针来执行此操作吗?搜索了这两个源文件,但无法完成。 –