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

Linux设备驱动编程之定时器

2006-10-26 13:34

作者:

出处:Linux

责任编辑:方舟

相关专题:

Linux设备驱动程序开发入门

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

struct 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);

删除定时器

int del_timer(struct timer_list * timer);

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

我们可以参考drivers\char\keyboard.c中键盘的驱动中关于timer的部分:

#include

static struct timer_list key_autorepeat_timer =

{

function: key_callback

};

static void

kbd_processkeycode(unsigned char keycode, char up_flag, int autorepeat)

{

char raw_mode = (kbd->kbdmode == VC_RAW);

if (up_flag) {

rep = 0;

if(!test_and_clear_bit(keycode, key_down))

up_flag = kbd_unexpected_up(keycode);

} else {

rep = test_and_set_bit(keycode, key_down);

/* If the keyboard autorepeated for us, ignore it.

* We do our own autorepeat processing.

*/

if (rep && !autorepeat)

return;

}

if (kbd_repeatkeycode == keycode || !up_flag || raw_mode) {

kbd_repeatkeycode = -1;

del_timer(&key_autorepeat_timer);

}

/*

* Calculate the next time when we have to do some autorepeat

* processing. Note that we do not do autorepeat processing

* while in raw mode but we do do autorepeat processing in

* medium raw mode.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值