linux驱动怎么判断定时器正在运行,Linux设备驱动之定时器

Linux内核中定义了一个timer_list结构,我们在驱动程序中可以利用

#includestruct timer_list {

struct list_head list;

unsigned long expires; //定时器到期时间

unsigned long data; //作为参数被传入定时器处理函数

void (*function)(unsigned long);

};

下面是关于timer的API函数:初始化定时器

void add_timer(struct timer_list * timer);

增加定时器

void add_timer(struct timer_list * timer);

删除定时器

int del_timer(struct timer_list * timer);int del_timer_sync(struct timer_list * timer);

需要确保定时器函数当前不在其他cpu上运行。

修改定时器的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。

例如:

struct timer_list mytimer;

void mytimer_ok(unsigned long expires)

{

printk("\n--------my timer is ok----\n");

mytimer.expires = jiffies +1000;

add_timer(&mytimer);

}

static int timer_init(void)

{

printk("---time_init  --- \n");

init_timer(&mytimer);

mytimer.expires = 1000;

mytimer.function = mytimer_ok;

add_timer(&mytimer);

return 0;

}

jiffies 为1/100 秒

来一个程序试试:

#include #include #include MODULE_LICENSE("GPL");

struct timer_list mytimer;

void  mytimer_ok(unsigned long expires)

{

printk("Mytimer is ok\n");

}

static int __init hello_init (void)

{

printk("Hello module init\n");

init_timer(&mytimer);

mytimer.expires = 10000;

mytimer.function = mytimer_ok;

add_timer(&mytimer);

return 0;

}

static void __exit hello_exit (void)

{

del_timer(&mytimer);

printk("Hello module exit\n");

}

module_init(hello_init);

module_exit(hello_exit);

运行结果如下:

[root@(none) nfs]$insmod ./timer.o

Using ./timer.o

Hello module init

[root@(none) nfs]$Mytimer is ok

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值