900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > linux驱动怎么判断定时器正在运行 Linux设备驱动编程之定时器

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

时间:2022-10-04 17:47:41

相关推荐

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

Linux设备驱动编程之定时器

-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.

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。