现在的位置: 首页 > 综合 > 正文

(一)内核定时器总结_zzhere2007

2018年02月07日 ⁄ 综合 ⁄ 共 2361字 ⁄ 字号 评论关闭

zzhere2007整理 2013.06.17
/*************************************************************************************************************************/
定时器的使用很简单,只需要三部:
1、定义定时器结构体timer_list。
2、设置超时时间,定义定时器处理函数和传参。

3、激活定时器。

一、定义并初始化定时器结构体timer_list。

/*include/linux/timer.h*/
struct timer_list {
        struct           list_head entry;
        unsigned long    expires;                    //设置在执行定时器处理函数的时间
        void             (*function)(unsigned long); //定时器处理函数
        unsigned long    data;                       //处理函数的传参
        struct tvec_base *base;
        #ifdef CONFIG_TIMER_STATS
        void             *start_site;
        char             start_comm[16];
        int              start_pid;
        #endif
};

二、初始化
        静态定义并初始化:

struct      timer_list     TIMER_INITIALIZER(_function, _expires, _data); //初始化结构体的同时给指定测成员赋值

        动态初始化:
           1  定义一个名为my_timer的timer_list数据结构

struct timer_list my_timer;

           2  初始化my_timer的部分内部成员

init_timer(&my_timer);

          3  填充timer_list的三个成员:expires、function和data。

my_timer.expires = jiffies + 5*HZ;           //设定定时器处理函数触发时间为5秒
my_timer.function = timer_func;              //给结构体指定定时器处理函数
my_timer.data = (unsigned long)99;      //设定定时器处理函数的传参
定时器处理函数的要求定义一个定时器处理函数:
void timer_func(unsigned long data)    //定义定时器处理函数
{
        printk("time out![%d] [%s]\n", (int)data, current->comm);
}

三、激活定时器。
      其实就一个函数,一旦调用,内核就会知道,在当前时候的5秒后,执行相应的处理函数。 

add_timer(&my_timer); //激活定时器

 注:这里要注意,定时器激活后,它只会在指定时间执行一次处理函数,执行后会将定时器在内核中移除。

四、定时器的删除和修改 

       修改并重新执行

          1 激活定时器后只能执行一遍,如果要实现隔指定时间又重复执行,那就要修改一下代码,timer_func()添加下面的代码,就可以修改时间和重新执行。

my_timer.expires = jiffies + 2*HZ; //重新设定时间,在两秒后再执行add_timer(&my_timer); //再次激活定时器这样的话,每个2秒就会再次执行定时器处理函数。 

         2                    

mod_timer(&my_timer, jiffies + 2*HZ);

              int mod_timer(struct timer_list *timer, unsigned long expires) /*kernel/timer.c*/
              这是改变定时器超时时间的函数,如果在指定的定时器(timer)没超时前调用,超时时间会更新为新的新的超时时间(expires)。如果在定时器超时后调用,那就相 当于重               新指定超时时间并再次激活定时器。
      取消未运行的定时
                如果想在定时器没有超时前取消定时器,可以调用以下函数:        

 int del_timer(struct timer_list *timer) /*kernel/timer.c*/

                该函数用来删除还没超时的定时器。

五、常用示例
示例代码:这个是我在网上找的代码

#include <linux/module.h>
#include <linux/init.h>
#include <linux/sched.h>
#include <linux/timer.h>

struct timer_list my_timer; //1.定义定时器结构体timer_list
void timer_func(unsigned long data) //2.定义定时器处理函数
{
      printk("time out![%d] [%s]\n", (int)data, current->comm);
}
      static int __init test_init(void) //模块初始化函数
{
      init_timer(&my_timer); //初始化timer_list结构
      my_timer.expires = jiffies + 5*HZ; //设定定时器处理函数触发时间为5秒
      my_timer.function = timer_func; //给结构体指定定时器处理函数
      my_timer.data = (unsigned long)99; //设定定时器处理函数的传参
      add_timer(&my_timer); //激活定时器
      printk("hello timer,current->comm[%s]\n", current->comm);
      return 0;
}
static void __exit test_exit(void) //模块卸载函数
{
      printk("good bye timer\n");
}

抱歉!评论已关闭.