深入浅出Linux设备驱动编程--定时器
2006-11-20 23:41:00
定时器
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 <linux/timer.h>
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: [url]http://tb.donews.net/TrackBack.aspx?PostId=1082425[/url]

本文出自 “宋宝华的博客” 博客,请务必保留此出处http://21cnbao.blog.51cto.com/109393/120092