您的位置:首页 > 运维架构 > Linux

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

2020-04-07 12:30 1461 查看

动态定时器被动态的创建和撤销,使用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);
  • 点赞
  • 收藏
  • 分享
  • 文章举报
清风明月伴我行 发布了3 篇原创文章 · 获赞 0 · 访问量 133 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: