定时器TIMER
📎 原始文档:https://www.kdocs.cn/l/cinMiNbyLmRw 定时器TIMER
- 定时器TIMER 定义 定时器功能主要是用作定时周期轮训处理,分为周期性和非周期性两种,下面介绍两种定时器的接口和使用。
- 定时器接口定义 定时器的id 必须是u16或者int/u32的类型,不能为char /u8的类型,否则会出现id 范围错误,会变成其他的id ,影响其他定时器id的功能。
/* *****************************
该定时器属于系统轮训定时器。
sys_timer_add 和sys_timer_del
需要成对使用,sys_timer_modify是
修改对应id的延时因子函数;改定时器为
周期性轮询,在不使用的时候需要通过id
删除对应的定时器功能,否则会一直存在。
<该定时器计时准确,但是会有功耗消耗>
****************************** */
u16 sys_timer_add(void *priv, void (*func)(void *priv), u32 msec);
void sys_timer_del(u16);
/* *****************************
该定时器在周期内只会执行一次。
sys_timeout_add 和sys_timeout_del
需要成对使用,sys_timer_modify是
修改对应id的延时因子函数;改定时器在定时
到来时只会执行一次,不会重复轮训,id 根据
实际看是否需要。
<该定时器计时准确,但是会有功耗消耗>
****************************** */
u16 sys_timeout_add(void *priv, void (*func)(void *priv), u32 msec);
void sys_timeout_del(u16);
void sys_timer_re_run(u16 id);//重新跑定时器
int sys_timer_modify(u16 id, u32 msec);// 修改定时器的延时因子
/* *****************************
该定时器属于中断类型,最后的优先级
priority配置代表是否能让系统进入低
功耗,进入低功耗后这个定时器的周期
是根据蓝牙心跳来决定,不是定时的周期。
usr timer add 和usr_timer del
需要成对使用,usr_timer_modify是
修改对应id的延时因子函数;改定时器为
周期性轮询,在不使用的时候需要通过id
删除对应的定时器功能,否则会一直存在。
****************************** */
u16 usr_timer_add(void *priv, void (*func)(void *priv), u32 msec, u8 priority);
int usr_timer_modify(u16 id, u32 msec);
void usr_timer_del(u16 id);
/* *******************************
usr_timeout_add 和usr_timeout_del
需要成对使用,usr_timeout_modify是
修改对应id的延时因子函数;改定时器在定时
到来时只会执行一次,不会重复轮训,id 根据
实际看是否需要。
******************************* */
u16 usr_timeout_add(void *priv, void (*func)(void *priv), u32 msec, u8 priority);
int usr_timeout_modify(u16 id, u32 msec);
void usr_timeout_del(u16 id);
三、定时器使用demo
1、sys_timer_add使用demo
//定时器周期函数
static void sys_timer_test(void)
{
static u16 cnt = 0;
cnt++;
printf("%s,cnt = %d\n",__func__,cnt);
}
int user_sys_timer_id = 0;//定时器id ,必须u16类型以上
//添加定时器
void user_sys_timer_add_test(void)
{
if(!user_sys_timer_id){
user_sys_timer_id = sys_timer_add(NULL,sys_timer_test,1000);
}
}
//删除定时器
void user_del_sys_timer_test(void)
{
if(user_sys_timer_id){
sys_timer_del(user_sys_timer_id);
user_sys_timer_id = 0;
}
}
//修改定时器周期
void user_sys_timer_modify(u32 mes)
{
if(user_sys_timer_id){
sys_timer_modify(user_sys_timer_id,mes);
}
}
2、sys_timeout使用demo
//定时器回调
static void sys_timeout_test(void)
{
static u16 cnt = 0;
cnt++;
printf("%s,cnt = %d\n",__func__,cnt);
}
int user_sys_timeout_id = 0;//定时器id ,必须u16类型以上
//定时器添加
void user_sys_timeout_add_test(void)
{
if(!user_sys_timeout_id){
user_sys_timeout_id = sys_timeout_add(NULL,sys_timeout_test,1000);
}
}
//定时器删除
void user_del_sys_timeout_test(void)
{
if(user_sys_timeout_id){
sys_timer_del(user_sys_timeout_id);
user_sys_timeout_id = 0;
}
}
//修改定时器周期
void user_sys_timer_modify(u32 mes)
{
if(user_sys_timeout_id){
usr_timeout_modify(user_sys_timeout_id,mes);
}
}
3、usr_timer 使用demo
//定时器回调
static void sys_usr_timer_add_test(void)
{
static u16 cnt = 0;
cnt++;
printf("%s,cnt = %d\n",__func__,cnt);
}
int usr_timer_add_id = 0;//定时器id ,必须u16类型以上
//定时器添加
void user_usr_timer_add_test(void)
{
if(!usr_timer_add_id){
usr_timer_add_id = usr_timer_add(NULL,sys_usr_timer_add_test,1000,0);
}
}
//定时器删除
void user_del_usr_timer_add_test(void)
{
if(usr_timer_add_id){
usr_timer_del(usr_timer_add_id);
usr_timer_add_id = 0;
}
}
//修改定时器周期
void user_usr_timer_modify(u32 mes)
{
if(usr_timer_add_id){
usr_timer_modify(usr_timer_add_id,mes);
}
}
4、usr_timeout 使用
//定时器回调
static void sys_usr_timeout_add_test(void)
{
static u16 cnt = 0;
cnt++;
printf("%s,cnt = %d\n",__func__,cnt);
}
int usr_timeout_add_id = 0;//定时器id ,必须u16类型以上
//定时器添加
void user_sys_timeout_add_test(void)
{
if(!usr_timeout_add_id){
usr_timeout_add_id = usr_timer_add(NULL,sys_usr_timeout_add_test,1000,0);
}
}
//定时器删除
void user_del_usr_timeout_add_test(void)
{
if(usr_timeout_add_id){
usr_timeout_del(usr_timeout_add_id);
usr_timeout_add_id = 0;
}
}
//修改定时器周期
void user_usr_timeout_modify(u32 mes)
{
if(usr_timeout_add_id){
usr_timeout_modify(usr_timeout_add_id,mes);
}
}