Linux定时器在驱动程序中的应用

        内核提供了一组与定时器相关的接口用来简化管理定时器的操作。所有这些接口都声明在<linux/Timer.h>中,大多数接口在<kernel/timer.c>中的到实现。
  创建定时器首先要先定义它,然后通过一个辅助函数初始化定时器数据结构的内部值,初始化必须在使用其他定时器管理函数之前完成:
  
        #including <linux/Timer.h>


  struct timer_list my_timer;              //创建定时器
  init_timer(&my_timer);                    // 初始化定时器
  my_timer.expires = jiffies + HZ/10; //100ms
  my_timer.data = 0;                        //
  my_timer.function = my_function; //my_function自定义的定时器处理函数
  add_timer(&my_timer);                //最后,激活定时器

  【补充】
  也可以这样调用:
  1、setup_timer(struct timer_list, function,data); //初始化timer并赋值func和data
  2、mod_timer();修改并启动之。另外,定时值可以这样设定:msecs_to_jiffies(50);
  调用方式:
  mod_timer(&mytimer, jiffies + msecs_to_jiffies(50) );

注意: 定时器只执行一次,若想周期性的启动定时器,在my_function()函数中添加mod_timer()函数。

static void my_function(struct work_struct *work)
 {
     mod_timer(&button_time,jiffies + HZ/10);
  }

timer_list结构体如下:

struct timer_list {
  struct list_head entry; //定时器链表的入口
  unsigned long expires; //定时器超时时的节拍数
  void (*function)(unsigned long ); //定时器处理函数
  unsigned long data; //传给定时器处理函数的长整型参数
  struct tvec_t_base_s *base; //定时器内部值,用户不要使用
  #ifdef CONFIG_TIMER_STATS
  void *start_site;
  char start_comm[16];
  int start_pid;
  #endif
  };

linux定时器在按键中断驱动中的实际应用可参考:

https://www.cnblogs.com/ape-ming/p/5110996.html

参考:https://blog.csdn.net/yihui8/article/details/45900871

猜你喜欢

转载自blog.csdn.net/qq_33463028/article/details/85929223