zzhere2007整理 2013.06.17
/*************************************************************************************************************************/
定时器的使用很简单,只需要三部:
1、定义定时器结构体timer_list。
2、设置超时时间,定义定时器处理函数和传参。
3、激活定时器。
一、定义并初始化定时器结构体timer_list。
/*include/linux/timer.h*/ struct timer_list { struct list_head entry; unsigned long expires; //设置在执行定时器处理函数的时间 void (*function)(unsigned long); //定时器处理函数 unsigned long data; //处理函数的传参 struct tvec_base *base; #ifdef CONFIG_TIMER_STATS void *start_site; char start_comm[16]; int start_pid; #endif };
二、初始化
静态定义并初始化:
struct timer_list TIMER_INITIALIZER(_function, _expires, _data); //初始化结构体的同时给指定测成员赋值
动态初始化:
1 定义一个名为my_timer的timer_list数据结构
struct timer_list my_timer;
2 初始化my_timer的部分内部成员
init_timer(&my_timer);
3 填充timer_list的三个成员:expires、function和data。
my_timer.expires = jiffies + 5*HZ; //设定定时器处理函数触发时间为5秒 my_timer.function = timer_func; //给结构体指定定时器处理函数 my_timer.data = (unsigned long)99; //设定定时器处理函数的传参 定时器处理函数的要求定义一个定时器处理函数: void timer_func(unsigned long data) //定义定时器处理函数 { printk("time out![%d] [%s]\n", (int)data, current->comm); }
三、激活定时器。
其实就一个函数,一旦调用,内核就会知道,在当前时候的5秒后,执行相应的处理函数。
add_timer(&my_timer); //激活定时器
注:这里要注意,定时器激活后,它只会在指定时间执行一次处理函数,执行后会将定时器在内核中移除。
四、定时器的删除和修改
修改并重新执行
1 激活定时器后只能执行一遍,如果要实现隔指定时间又重复执行,那就要修改一下代码,timer_func()添加下面的代码,就可以修改时间和重新执行。
my_timer.expires = jiffies + 2*HZ; //重新设定时间,在两秒后再执行add_timer(&my_timer); //再次激活定时器这样的话,每个2秒就会再次执行定时器处理函数。
2
mod_timer(&my_timer, jiffies + 2*HZ);
int mod_timer(struct timer_list *timer, unsigned long expires) /*kernel/timer.c*/
这是改变定时器超时时间的函数,如果在指定的定时器(timer)没超时前调用,超时时间会更新为新的新的超时时间(expires)。如果在定时器超时后调用,那就相 当于重 新指定超时时间并再次激活定时器。
取消未运行的定时
如果想在定时器没有超时前取消定时器,可以调用以下函数:
int del_timer(struct timer_list *timer) /*kernel/timer.c*/
该函数用来删除还没超时的定时器。
五、常用示例
示例代码:这个是我在网上找的代码
#include <linux/module.h> #include <linux/init.h> #include <linux/sched.h> #include <linux/timer.h> struct timer_list my_timer; //1.定义定时器结构体timer_list void timer_func(unsigned long data) //2.定义定时器处理函数 { printk("time out![%d] [%s]\n", (int)data, current->comm); } static int __init test_init(void) //模块初始化函数 { init_timer(&my_timer); //初始化timer_list结构 my_timer.expires = jiffies + 5*HZ; //设定定时器处理函数触发时间为5秒 my_timer.function = timer_func; //给结构体指定定时器处理函数 my_timer.data = (unsigned long)99; //设定定时器处理函数的传参 add_timer(&my_timer); //激活定时器 printk("hello timer,current->comm[%s]\n", current->comm); return 0; } static void __exit test_exit(void) //模块卸载函数 { printk("good bye timer\n"); }