Chinaunix首页 | 论坛 | 博客
  • 博客访问: 10507073
  • 博文数量: 2905
  • 博客积分: 20098
  • 博客等级: 上将
  • 技术积分: 36298
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-23 05:00
文章存档

2012年(1)

2011年(3)

2009年(2901)

分类: LINUX

2009-03-23 11:08:38

定时器
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.
        */
       if (!up_flag && !raw_mode) {
              kbd_repeatkeycode = keycode;
              if (vc_kbd_mode(kbd, VC_REPEAT)) {
                     if (rep)
                            key_autorepeat_timer.expires = jiffies + kbd_repeatinterval;
                     else
                            key_autorepeat_timer.expires = jiffies + kbd_repeattimeout;
                     add_timer(&key_autorepeat_timer);
              }
       }
}


Trackback:

阅读(749) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~