目录
这里的定时器指的是软件定时器,功能与硬件定时器一样,它也是创建一个线程,超时函数运行在线程里面,该线程具有线程的属性,优先级,栈大小等,不过没有时间片的概念。
1. 创建定时器
#define rtosTimerCreate( \
handle, /*Timer Handle*/ \
name, /*Timer Name*/ \
timeout, /*timeout function*/ \
parameter, /*the parameter of function*/ \
time, /*the tick of timer*/ \
flag /*the flag of timer*/ \
) \
{ \
handle = rt_timer_create(name, timeout, \
parameter, time, flag); \
}
参数handle是定时器的handle值,
#define RTOS_TIME_HANDLE rt_timer_t
接下来3个参数含义与进程创建类似,参数time表示定时器溢出的时间长度(以tick为单位),参数flag指定时器的类型,分为单次定时和周期性定时。
#define RTOS_TIMER_ONE_SHOT RT_TIMER_FLAG_ONE_SHOT
#define RTOS_TIMER_PERIODIC RT_TIMER_FLAG_PERIODIC
例如创建2个定时器,分别为单次和周期性。
static RTOS_TIIME_HANDLE timer1;
static RTOS_TIIME_HANDLE timer2;
static void timerout1(void *parameter)
{
Printf("T1\n");
}
static void timerout2(void *parameter)
{
Printf("T2\n");
}
rtosTimerCreate(timer1, "timer1", timerout1, NULL, 300, RTOS_TIMER_PERIODIC);
rtosTimerCreate(timer2, "timer2", timerout2, NULL, 601, RTOS_TIMER_ONE_SHOT);
2. 启动定时器
#define rtosTimerStart( \
handle \
) \
{ \
rt_timer_start(handle); \
}
当定时器被创建或者初始化以后,并不会被立即启动,必须在调用该函数接口后,才开始工作。
启动上例中的2个定时器,打印结果如下
T1
T1
T2
T1
T1
T1
T1
T1
T1
T1是周期性的300ms定时器,所以会每隔300ms运行一次,而T2是601ms一次性定时器,所以在T1运行2次后执行了一次。
3. 停止定时器
#define rtosTimerStop( \
handle \
) \
{ \
rt_timer_stop(handle); \
}
启动定时器以后,若想使它停止,可以调用该函数接口。
将Timer1的溢出函数修改为10次后停止该定时器。
static uint8_t timeCount = 0;
static void timerout1(void *parameter)
{
timeCount++;
Printf("T1\n");
if(timeCount > 9)
rtosTimerStop(timer1);
}
打印结果:
T1
T1
T2
T1
T1
T1
T1
T1
T1
T1
T1