当前位置: 首页 > 文档资料 > 五天入门物联网 >

1.6.5.6 定时器

优质
小牛编辑
132浏览
2023-12-01

定时器允许我们在一个给定的时间触发事件,加快了从一个状态到另一个状态的转变,自动处理一个给定的进程或任务。例如,不需要按键就能每隔5秒闪烁一次LED灯。

Contiki OS包含4种定时器:

  • 简单定时器:一个简单的滴答。应用程序需要手动检查定时器是否到期了。更多信息请看core/sys/timer.h
  • 回调定时器:当一个定时器到期时,它能回调一个给定的函数。更多信息请看core/sys/ctimer.h
  • 事件定时器:与上面的基本相同,只是定时器到期时它不是回调一个函数,而是邮寄一个事件信号。更多信息请看core/sys/etimer.h
  • 实时定时器:实时模块处理实时任务的调度和执行。在同一时刻只允许一个这样的定时器。更多信息请看core/sys/rtimer.h

为了实现我们的目的,我们选择事件定时器,因为我们需要定时器到达一个给定周期时改变应用程序的行为。

我们创建一个定时器,并设定定时器超过给定秒数后所做的事。当定时器到期后,我们执行相应代码,并重置定时器。

创建一个例程文件,命名为test-timer.c

#include "contiki.h"
#include "dev/leds.h"
#include <stdio.h>
/*-------------------------------------------------*/
#define SECONDS 2
/*-------------------------------------------------*/
PROCESS(test_timer_process, "Test timer");
AUTOSTART_PROCESSES(&test_timer_process);
/*-------------------------------------------------*/
PROCESS_THREAD(test_timer_process, ev, data)
{
PROCESS_BEGIN();
static struct etimer et;
while(1) {
etimer_set(&et, CLOCK_SECOND*SECONDS); <1>
PROCESS_WAIT_EVENT():<2>
if(etimer_expired(&et)) {
printf("Hello world!\n");
etimer_reset(&et);
}
}
PROCESS_END();
}

CLOCK_SECOND是与微控制器每秒滴答数相关的数目。由于Contiki运行在不同的平台、不同的硬件上,CLOCK_SECOND也是各不相同的。

PRCESS_WAIT_EVENT()用于等待如何事件发生


练习:你可以打印CLOCK_SECOND的值来计算1秒有多少个滴答吗?尝试在某个确定的秒数时闪烁LED。写一个新的应用程序,当按下按键时才开始闪烁LED,当再次按键时才停止闪烁LED。