Timer 初始化
void blt_soft_timer_init(void);
Timer 的查询处理
void blt_soft_timer_process(int type);
添加定时器任务
typedef int (*blt_timer_callback_t)(void);
int blt_soft_timer_add(blt_timer_callback_t func, u32 interval_us);
- func 为定期执⾏的任务函数;
- interval_us 为定时时间,单位为 us。
定时任务 func 的 int 返回值三种处理⽅法为:
- 返回值⼩于 0,则该任务执⾏后被⾃动删除。可以使⽤这个特性来控制定时器执⾏的次数。
- 返回 0,则⼀直使⽤之前的 interval_us 来定时。
- 返回值⼤于 0,则使⽤该返回值做为新的定时周期,单位 us。
代码实现中,当定时器数量超过最⼤值时,添加失败。每添加⼀个新的 timer 任务,必须重新做⼀下 排序,以确保定时器任务在任何时候都是按照时间排序的,时间上最近的那个 timer 任务对应的 index 为 0。
删除定时器任务
除了使⽤上⾯返回值⼩于 0 来⾃动删除定时器任务,还可以使⽤下⾯ API 来指定要删除的定时器任务。
int blt_soft_timer_delete(blt_timer_callback_t func);
Demo
int gpio_test0(void)
{
DBG_CHN3_TOGGLE;
return 0;
}
int gpio_test1(void)
{
DBG_CHN4_TOGGLE;
static u8 flg = 0;
flg = !flg;
if(flg){
return 7000;
}
else{
return 17000;
}
}
int gpio_test2(void)
{
DBG_CHN5_TOGGLE;
if(clock_time_exceed(0, 5000000)){
//return -1;
blt_soft_timer_delete(&gpio_test2);
}
return 0;
}
int gpio_test3(void)
{
DBG_CHN6_TOGGLE;
return 0;
}
初始化
blt_soft_timer_init();
blt_soft_timer_add(&gpio_test0, 23000);
blt_soft_timer_add(&gpio_test1, 7000);
blt_soft_timer_add(&gpio_test2, 13000);
blt_soft_timer_add(&gpio_test3, 27000);
定义了 4 个任务,这 4 个定时任务各有特点:
- gpio_test0 每 23ms toggle ⼀次。
- gpio_test1 使⽤了 7ms/17ms 两个时间的切换定时。
- gpio_test2 在 5s 后将⾃⼰删掉。代码中有两种⽅式都可以实现这个功能:⼀是调⽤ blt_soft_timer_delete (&gpio_test2);⼆是 return -1。
- gpio_test3 每 27ms toggle ⼀次。
总结:
从上面的demo可以看出,定时器的一次性和周期性的决定性因素是回调函数的返回值
- 返回值为0,是周期性的定时器
- 返回值为大于0,是周期性的T(返回值的大小)的定时器
- 返回值为小于0,是一次性的定时器,并同时删除定时器
厂商的定义:
我们预定:blt soft timer 的使⽤场景为定时时间⼤于 5ms、且对于时间误差要求不是特别⾼的情况。
⽬前设计上最多同时⽀持 4 个 timer 运⾏,实际 user 可以修改下⾯的宏来实现更多的或者更少的 timer:
#define MAX_TIMER_NUM 4 //timer max number
参考文档: