一、定时器的一般流程为:
(1)编写function;
(2)为timer的expires、data、function赋值;
(3)调用add_timer将timer加入列表;
(4)在定时器到期时,function被执行;
(5)在程序中涉及timer控制的地方适当地调用del_timer、mod_timer删除timer或修改timer的expires。
二、参数
(1)expires主要是用来定义定时器到期的时间,通常采用jiffies这个全局变量和HZ这个全局变量配合设置该元素
的值。比如expires = jiffies + n*HZ,其中jiffies是自启动以来的滴答数,HZ是一秒种的滴答数。
(2)function函数就是定时器的处理函数,类似我们在中断中的中断函数,其实定时器和中断有很大的相似性。定
时器处理函数是自己定义的函数。
(3)data通常是实现参数的传递,从function的参数类型可以知道,data可以作为定时器处理函数的参数。
三、要点
(1)先声明一个timer_list结构,调用init_timer对它进行初始化。
(2)time_list结构里expires是标明这个时钟的周期,单位采用jiffies的单位。
(3)"function"就是时间到了以后的回调函数,它的参数就是timer_list中的data。
(4)data这个参数在初始化时钟的时候赋值,一般赋给它设备的device结构指针。
(5)在预置时间到系统调用function,同时系统把这个time_list从定时队列里清除,
如果需要一直使用定时函数,要在function里再次调用mod_timer()。
四、代码实例
这一小段代码实现的是每秒打印一次hello
struct test_data
{
struct timer_list test_timer;
};
struct test_data *exam;
void poll_func(unsigned long arg)
{
printk("hello\n");
mod_timer(&(exam->test_timer), jiffies + HZ*1);
}
exam = kzalloc(sizeof(*exam), GFP_KERNEL);
init_timer(&exam->test_timer);
exam->test_timer.function = poll_func;
exam->test_timer.data = 0;
exam->test_timer.expires = jiffies + HZ*1;
add_timer(&(exam->test_timer));