Linux的内核中定义了一个定时器的结构:
#include<linux/timer.h>
struct timer_list
{
struct list_head list;
unsigned long expires; //定时器到期时间
unsigned long data; //作为参数被传入定时器处理函数
void (*function)(unsigned long);
};
例如要定义这个结构使用可以这样: struct timer_list testtimer;(testtimer可随意命名)
利用这个结构我们可以在驱动中很方便的使用定时器。
一: timer的API函数:
初始化定时器:
void init_timer(struct timer_list * timer);
增加定时器:
void add_timer(struct timer_list * timer);
删除定时器:
int del_timer(struct timer_list * timer);
修改定时器的expire:
int mod_timer(struct timer_list *timer, unsigned long expires);
二:使用定时器的一般流程为:
(1)创建timer、编写超时定时器处理函数function;
(2)为timer的expires、data、function赋值;
(3)调用add_timer将timer加入列表;
(4)在定时器到期时,function被执行;
(5)在程序中涉及timer控制的地方适当地调用del_timer、mod_timer删除timer或修改timer的expires。
下面是我写的一个demo程序,每隔一秒执行testtimer_czd一次,执行打印一次:
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/sched.h>//jiffies在此头文件中定义
#include <linux/init.h>
#include <linux/timer.h>
struct timer_list testtimer;//定义一个定时器
void testtimer_czd(unsigned long arg)
{
printk("My testtimer is ok\n");
printk("receive data from timer is: %ld\n",arg);
/*如果不添加以下三行代码,则只会执行一次上面的两行打印 */
testtimer.expires = jiffies+100;//设定超时时间,100代表1秒
testtimer.function = testtimer_czd;//设置定时器超时函数
add_timer(&testtimer); //添加定时器,定时器开始生效
}
static int __init testtimer_init (void)
{
printk("my testtimer init\n");
init_timer(&testtimer); //初始化定时器
testtimer.expires = jiffies+100;//设定超时时间,100代表1秒
testtimer.data = 111; //传递给定时器超时函数的值
testtimer.function = testtimer_czd;//设置定时器超时函数
//(注:以上3步可以用函数 setup_timer(&mytime, func_exec_timer , datap)代替,该函数实现赋值并初始化定时器 )
//setup_timer(&testtimer, testtimer_czd, data);
add_timer(&testtimer); //添加定时器,定时器开始生效
return 0;
}
static void __exit testtimer_exit (void)
{
del_timer(&testtimer);//卸载模块时,删除定时器
printk("testtimer module exit\n");
}
module_init(testtimer_init);
module_exit(testtimer_exit);
MODULE_AUTHOR("czd>");
MODULE_DESCRIPTION("testtimer Driver");
MODULE_LICENSE("GPL");