概括
在裸机开发中,经常要使用定时器来实现某些定时功能,面对需要比较多定时器的场合,以前都是使用一个吻硬件定时器作为提供时间基准,然后使用计数器+标志位的方法来实现,其实就是采用时间片的方法。
比如:
1 | while(1) |
现在发现了某位大佬开源的软件定时器multi_timer项目,令人耳目一新。
很棒的是,软件定时器multi_timer 将上面的方法抽象出来,同样也是基于一个硬件定时器,但是无需自己在while循环上加各种判断语句,让程序看起来更加简洁,更加好维护。
multi_timer的使用方法
1、定义一个multi_timer结构体变量1
Timer timer1 ;
2、注册并初始化multi_timer定时器1
timer_init(&timer1, timer1_callback, TIMER_TIMEOUT_500MS, TIMER_TIMEOUT_500MS);
3、启动multi_timer定时器1
timer_start(&timer1);
4、设置1ms硬件定时器循环调用计数器以提供时基1
2
3
4void xxx_callback(void)
{
timer_ticks();
}
5、在while循环中循环调用multi_timer的后台处理函数1
2
3
4
5while(1)
{
//....
timer_loop();
}
项目源代码和个人的注释
multi_timer.h1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32/*
* Copyright (c) 2016 Zibin Zheng <znbin@qq.com>
* All rights reserved
*/
typedef struct Timer {
uint32_t timeout; // 超时时间(用来与定时器心跳比较)
uint32_t repeat; // 循环定时触发时间(周期定时设置),为0时代表单次定时
void (*timeout_cb)(void); // 定时器回调处理函数
struct Timer* next; // 指向下一个定时器节点
}Timer;
extern "C" {
void timer_init(struct Timer* handle, void(*timeout_cb)(), uint32_t timeout, uint32_t repeat);
int timer_start(struct Timer* handle);
void timer_stop(struct Timer* handle);
void timer_ticks(void);
void timer_loop(void);
}
multi_timer.c
1 | /* |