软件定时器

Pursue

简介

可设置定时周期,当指定时间到达后要调用回调函数,用户在回调函数中处理信息,软件定时器的超时回调函数是完全由用户自定义的,并且会在软件定时器定时器超时的时候被自动地调用,且可以设置函数的传入参数。

支持裁剪,如需使能软件定时器,需将OS_CFG_TMR_EN配置项配置为1。

单次定时器和周期定时器

1. 单次定时器
单次定时器的一旦定时超时,只会执行一次其软件定时器超时回调函数,超时后可以被手动重新开启,但单次定时器不会自动重新开启定时。

2. 周期定时器
周期定时器的一旦被开启,会在每次超时时,自动地重新启动定时器,从而周期地执行其
软件定时器回调函数。

软件定时器的状态

1. 未使用态
当软件定时器被定义但还未被创建或软件定时器被删除时,软件定时器就处于未使用态。

2. 停止态
当软件定时器被创建但还未开启定时器或处于运行态的软件定时器被停止时,软件定时器就处于停止态。

3. 运行态
当处于停止态的软件定时器被启动或单次定时器定时超时后重新启动或周期定时器定时超时后自动重新启动时,软件定时器处于运行态。

4. 完成态
当单次定时器定时超时后,软件定时器处于完成态。

注意:不能在软件定时器的超时回调函数中使用可能到时任务被阻塞、被挂起甚至被删除的函数。

软件定时器定时频率

软件定时器分辨率=OS_CFG_TICK_RATE_HZ/OS_CFG_TMR_TASK_RATE_HZ
例如,将OS_CFG_TMR_TASK_RATE_HZ设为10,那么软件定时器分辨率为100ms,那么在$10*100ms=1000ms$后超时。

API函数

创建软件定时器

1
2
3
4
5
6
7
8
void OSTmrCreate(OS_TMR               *p_tmr,           //指向软件定时器结构体的指针
CPU_CHAR *p_name, //为软件定时器名
OS_TICK dly, //开启延时时间
OS_TICK period, //定时周期时间
OS_OPT opt, //是单次定时器还是周期定时器
OS_TMR_CALLBACK_PTR p_callback, //超时回调函数
void *p_callback_arg, //超时回调函数参数
OS_ERR *p_err) //错误代码

删除、启动

1
2
3
4
5
CPU_BOOLEAN OSTmrStart(OS_TMR  *p_tmr,
OS_ERR *p_err)

CPU_BOOLEAN OSTmrDel(OS_TMR *p_tmr, //指向软件定时器结构体的指针
OS_ERR *p_err) //错误代码

停止软件定时器

1
2
3
4
CPU_BOOLEAN  OSTmrStop (OS_TMR  *p_tmr,         //指向软件定时器结构体的指针
OS_OPT opt,
void *p_callback_arg,//回调函数参数
OS_ERR *p_err) //错误代码
opt 描述
OS_OPT_TMR_NONE 仅停止软件定时器
OS_OPT_TMR_CALLBACK 执行一次回调函数,代入原始参数
OS_OPT_TMR_CALLBACK_ARG 执行一次回调函数,代入指定参数

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
OS_TMR timer1;
void Timer1Callback(OS_TMR *p_tmr, void *p_arg);


OSTmrCreate(&timer1, "timer1", 10, 10, OS_OPT_TMR_PERIODIC, (OS_TMR_CALLBACK_PTR)Timer1Callback, 0, &err);

OSTmrStart(&timer1, &err);

void Timer1Callback(OS_TMR *p_tmr, void *p_arg)
{
if (p_tmr == &timer1)
{
printf("cALLBACK\n");
HAL_GPIO_TogglePin(LED_B_GPIO_Port, LED_B_Pin);
}
}
评论