一.概述
内核经常要推后执行某些代码,如底半部机制就是为了将工作推后执行。timer_list为我们提供一种方式,使工作能够在指定时间点上执行。
定时器使用简单,只须执行一些初始化工作,设置一个超时时间,指定超时发生后执行的函数,然后激活定时器就可以了。
定时器并不是周期运行的,它在超时后就自行销毁,这就是这种定时器被称为动态定时器的原因。动态定时器不断地创建和销毁,而且它的运行次数也不受限制。
二.头文件
linux/timer.h
三.结构体数据类型
struct timer_list {
struct list_head entry; //定时器链表的入口
unsigned long expires; //定时器超时时的节拍数
void (*function)(unsigned long ); //定时器处理函数
unsigned long data; //传给定时器处理函数的长整型参数
struct tvec_t_base_s *base; //定时器内部值,用户不要使用
#ifdef CONFIG_TIMER_STATS
void *start_site;
char start_comm[16];
int start_pid;
#endif
};
四.函数接口
①主要相关的API函数
init_timer(struct timer_list*):定时器初始化函数;
add_timer(struct timer_list*):往系统添加定时器;
mod_timer(struct timer_list *, unsigned long jiffier_timerout):修改定时器的超时时间为jiffies_timerout;
timer_pending(struct timer_list *):定时器状态查询,如果在系统的定时器列表中则返回1,否则返回0;
del_timer(struct timer_list*):删除定时器
②初始化
struct timer_list my_timer;
init_timer(&my_timer);// 初始化定时器
my_timer.expires = jiffies + delay; //
my_timer.data = 0; //
my_timer.function = my_function; //
add_timer(&my_timer); //最后,激活定时器
五.使用方法
使用的一般步骤为:
如果要完成周期性的重复工作,只要在初始化的基础上,在超时函数my_function内部加上以下代码,重新更新参数
my_timer.expires = jiffies + delay; //
my_timer.data = 0; //
my_timer.function = my_function; //
add_timer(&my_timer); //激活定时器
这样就能实现周期运行my_function函数了