| 
		    
                       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);   }  }  … } | 
         
    
 
-- 原文链接: http://dev.yesky.com/220/2637720.shtml 
		    
                      
		      
		      
		   |