定时器是管理内核所花时间的基础,利用它可以实现在未来某个时间,触发一个事件。它的使用比较简单,只需要执行一些初始化工作,设置一个时间期限,指定到时候执行的函数,然后激活计时器就可以了,指定的函数将在定时器到期后自动执行。定时器不是周期运行的,它在到期后就自行销毁。
定时器timer_list结构定义:
struct timer_list {
struct list_head entry;//定时器组织链表
unsigned long expires;//以节拍位单位的倒计时
struct tvec_base *base;
void (*function)(unsigned long);//定时器到了要执行的函数(回调函数)
unsigned long data;//回调函数参数的值
int slack;//定时器可延迟时间
...;
}
定时器的初始化
init_timer(&timer);
timer.expires=expire;
timer.data=(unsigned long)current;
timer.function=my_process_time;
激活定时器
add_timer(&timer);
停止定时器
del_timer(&timer);
《Linux操作系统原理与应用》P158定时器应用例子调试代码
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/timer.h>
#include <asm/param.h>
#include <linux/sched.h>
MODULE_LICENSE("GPL");
long timeout=2*HZ;
long remaining;
static void my_process_time(unsigned long data)
{
struct tast_struct *p=(struct task_struct *)data;
wake_up_process(p);
printk(KERN_ALERT"p is waked up\n");
}
static long my_schedule_timeout(long timeout)
{
struct timer_list timer;
unsigned long expire;
expire=timeout+jiffies;
init_timer(&timer);
timer.expires=expire;
timer.data=(unsigned long)current;
timer.function=my_process_time;
add_timer(&timer);
schedule();
del_timer(&timer);
printk(KERN_ALERT"ex %lu jf %lu\n",expire,jiffies);
timeout=expire-jiffies;
printk(KERN_ALERT"schedule_time %d\n",timeout);
return (timeout<0?0:timeout);
}
static int __init timer_init(void)
{
printk(KERN_ALERT"timer init\n");
set_current_state(TASK_INTERRUPTIBLE);
remaining=my_schedule_timeout(timeout);
printk(KERN_ALERT"remianing is %d\n",remaining);
return 0;
}
static void __exit timer_exit(void)
{
printk(KERN_ALERT"timer exit\n");
}
module_init(timer_init);
module_exit(timer_exit);