动态定时器被动态的创建和撤销,使用Linux提供的一组函数与数据结构进行Timer的编程。
定时器数据结构:
time_list {
struct list_head entry;
unsigned long expires;
unsigned long data;
void (*function)(unsigned long);
}
expires: 定时器到期时间
function(): 定时器到期后执行函的数
data: 传入function()的参数
Linux提供的一组定时器函数
初始化定时器
void init_timer(struct timer_list *timer);
将定时器加入到内核定时器链表中
void add_timer(struct timer_list *timer);
修改定时器的expires
int mod_timer(struct timer_list *timer, unsigned long expires);
删除定时器
del_timer(struct timer_list *timer)
下面看一个例子:
1.创建两个结构体dev1,dev2, dev1每隔10s打印一次,dev2每隔20s打印一次。
2. 两个设备定时器,使用相同的定时器处理函数,在处理函数中再分别处理每个隔定时器。
#include <linux/module.h>
#include <linux/init.h>
MODULE_LICENSE("GPL v2");
typedef void (*fn_timer)(unsigned long);
typedef struct dev {
char name[10];
struct timer_list dev_timer;
fn_timer fn;
}dev_tt;
dev_tt dev1 = {"dev1"};
dev_tt dev2 = {"dev2"};
static void dev_timer(unsigned long arg)
{
dev_tt *dev = (dev_tt *)arg;
if(strcmp(dev->name,"dev1") == 0)
dev->dev_timer.expires = jiffies + 10 * HZ;
if(strcmp(dev->name,"dev2") == 0)
dev->dev_timer.expires = jiffies + 20 * HZ;
(dev->fn)(arg);
add_timer(&dev->dev_timer);
}
static void dev1_timer(unsigned long arg)
{
dev_tt *dev = (dev_tt *)arg;
printk("dev: %s\n",dev->name);
}
static void dev2_timer(unsigned long arg)
{
dev_tt *dev = (dev_tt *)arg;
printk("dev: %s\n",dev->name);
}
static int init_dev_timer(dev_tt* dev,fn_timer fn,int delay)
{
if(dev == NULL)
return -1;
init_timer(&dev->dev_timer);
dev->dev_timer.data = (unsigned long)dev;
dev->dev_timer.function = dev_timer;
dev->dev_timer.expires = jiffies + delay;
dev->fn = fn;
add_timer(&dev->dev_timer);
return 0;
}
static int __init dev_init(void)
{
init_dev_timer(&dev1, dev1_timer,5 * HZ);
init_dev_timer(&dev2, dev2_timer,10 * HZ);
printk(KERN_EMERG"init all timers......\n");
return 0;
}
module_init(dev_init);
static void __exit dev_exit(void)
{
del_timer(&dev1.dev_timer);
del_timer(&dev2.dev_timer);
printk("delete all timers......\n");
}
module_exit(dev_exit);