7、linux之定时器

(1) 一个timer_list 结构体的实例对应一个定时器,其定义如下:

struct timer_list {
struct list_head entry, /*定时器列表*/
unsigned long expires, /*定时器到期时间*/
void (*function) (unsigned long), /*定时器处理函数*/
unsigned long data,/*作为参数被传入定时器处理函数*/
struct timer_base_s *base,
...
};

(2) 初始化定时器

void init_timer (struct timer_list *timer);
TIMER_INITIALIZER (_function, _expires, _data)
DEFINE_TIMER (_name, _function, _expires, _data)
setup_timer ();

(3) 增加定时器

void add_timer (struct timer_list *timer);

(4) 删除定时器

int del_timer (struct timer_list *timer);

(5) 修改定时器的expire

int mod_timer (struct timer_list *timer, unsigned long expires);

(6) 对于周期性的任务,linux内核还提供了一种delayed_work机制来完成,本质上用工作队列和定时器实现。

 

驱动中定时器模块:

//设备结构体

struct xxx_dev{
struct cdev cdev;
...
struct timer_list xxx_timer;//定义定时器
}
//驱动中某函数
xxx_funcl(...)
{
struct xxx_dev *dev = filp->private_data;
...
//初始化定时器
init_timer(&dev->xxx_time);
dev->xxx_timer.function = &xxx_do_timer;//定义定时器处理函数
dev->xxx_timer.data = (unsigned long)dev;//设备结构体指针作为定时器处理参数
dev->xxx_timer.expires = jiffies + delay;//定义到期时间
add_timer(&dev->xxx_timer);//注册定时器
...
}
//驱动中某函数
xxx_func2(...)
{
...
//删除中断
del_timer(&dev->xxx_timer);
...
}
//定时器处理函数
static void xxx_do_timer(unsigned long arg)
{
struct xxx_dev *dev = filp->private_data;
...
dev->xxx_timer.expires = jiffies + delay;//重新设置定时时间
add_timer(&dev->xxx_timer);
...
}

posted on 2018-03-11 22:18  拉风摊主  阅读(141)  评论(0编辑  收藏  举报

导航