介绍
在操作系统中,通常软件定时器以系统节拍(tick)为单位。比如节拍为10ms,那就只能定时10ms的倍数,如10、20、30,像5、15这些就不行。当定时到了,也也叫超时了,就会执行设定好的回调函数(就比拟是硬件定时器中的中断服务函数)。
定时器创建和删除
函数原型
rt_timer_t rt_timer_create(const char *name,
void (*timeout)(void *parameter),
void *parameter,
rt_tick_t time,
rt_uint8_t flag)
rt_err_t rt_timer_delete(rt_timer_t timer)
这里重点是创建定时器的“flag”,include/rtdef.h中定义了一些定时器相关的宏,如下。
#define RT_TIMER_FLAG_DEACTIVATED 0x0 /* 定时器为非激活态*/
#define RT_TIMER_FLAG_ACTIVATED 0x1 /* 定时器为激活状态*/
#define RT_TIMER_FLAG_ONE_SHOT 0x0 /* 单次定时*/
#define RT_TIMER_FLAG_PERIODIC 0x2 /* 周期定时*/
#define RT_TIMER_FLAG_HARD_TIMER 0x0 /* 硬件定时器*/
#define RT_TIMER_FLAG_SOFT_TIMER 0x4 /* 软件定时器*/
测试
timer1 = rt_timer_create("timer1", timer_callback, (void *)1, 1000, RT_TIMER_FLAG_PERIODIC);
timer2 = rt_timer_create("timer2", timer_callback, (void *)2, 1000, RT_TIMER_FLAG_ONE_SHOT);
rt_thread_mdelay(8000);
rt_timer_delete(timer1);
rt_timer_delete(timer2);
创建之后,通过msh指令
list_timer
能查看到定时器确实已经创建了,随后也删除了。
定时器初始化和脱离
前面的创建和删除都是动态的,定时器也很类似线程那样,也支持静态的添加和脱离。
函数原型
rt_timer_t rt_timer_create(const char *name,
void (*timeout)(void *parameter),
void *parameter,
rt_tick_t time,
rt_uint8_t flag)
rt_err_t rt_timer_delete(rt_timer_t timer)
测试
struct rt_timer timer3;
rt_timer_init(&timer3, "timer3", timer_callback, (void *)3, 1000, RT_TIMER_FLAG_PERIODIC);
rt_thread_mdelay(8000);
rt_timer_detach(&timer3);
定时器启动和停止
虽然前面已经创建了定时,通过命令也能查到定时器的存在,但是,定时器并不会运行。完成创建之后,还需要启动定时器,定时器才会开始运行。
函数原型
rt_err_t rt_timer_start(rt_timer_t timer)
rt_err_t rt_timer_stop(rt_timer_t timer)
回调函数
void timer_callback(void* parameter)
{
rt_uint32_t t_no = (rt_uint32_t)parameter;
rt_kprintf("timer%d callback\r\n", t_no);
}
测试代码
rt_timer_t timer1;
rt_timer_t timer2;
struct rt_timer timer3;
rt_kprintf("create entry!\r\n");
timer1 = rt_timer_create("timer1", timer_callback, (void *)1, 1000, RT_TIMER_FLAG_PERIODIC);
if (timer1 != RT_NULL)
{
rt_timer_start(timer1);
}
timer2 = rt_timer_create("timer2", timer_callback, (void *)2, 1000, RT_TIMER_FLAG_ONE_SHOT);
if (timer2 != RT_NULL)
{
rt_timer_start(timer2);
}
rt_timer_init(&timer3, "timer3", timer_callback, (void *)3, 1000, RT_TIMER_FLAG_PERIODIC);
rt_timer_start(&timer3);
rt_thread_mdelay(8000);
rt_timer_delete(timer1);
rt_timer_stop(timer2);
rt_timer_detach(&timer3);
测试结果
定时器控制
RT_thread也额外提供了定时器控制函数接口,以获取或设置更多定时器的信息。
函数原型
rt_err_t rt_timer_control(rt_timer_t timer, rt_uint8_t cmd, void* arg);
其中“cmd”有如下选择
#define RT_TIMER_CTRL_SET_TIME 0x0 /* 设置定时器超时时间*/
#define RT_TIMER_CTRL_GET_TIME 0x1 /* 获得定时器超时时间*/
#define RT_TIMER_CTRL_SET_ONESHOT 0x2 /* 设置定时器为单一超时型*/
#define RT_TIMER_CTRL_SET_PERIODIC 0x3 /* 设置定时器为周期型定时器*/
“arg”与command相对应的控制命令参数。
结尾
rtthread学习中,打开主页查看更多笔记