Linux驱动中动态定时器的使用

动态定时器被动态的创建和撤销,使用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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值