文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>深入浅出Linux设备驱动编程--定时器

深入浅出Linux设备驱动编程--定时器

时间:2009-03-23  来源:sjhf

定时器
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: http://tb.donews.net/TrackBack.aspx?PostId=1082425
相关阅读 更多 +
排行榜 更多 +
未来教育考试

未来教育考试

学习教育 下载
我要整个活

我要整个活

动作格斗 下载
神力女超人

神力女超人

休闲益智 下载