内核函数add_timer 内核版本2.6.32

struct timer_list {
    struct list_head entry;               //将多个定时器连城链表
    unsigned long expires;              //超时时间,用节拍表示,此值小于或等于jiffies的时候说明定时器到期或终止
    void (*function)(unsigned long);//超时后执行的函数
    unsigned long data                    //传递个函数的参数
    struct tvec_base *base;             //用来指定执行的CPU
#ifdef CONFIG_TIMER_STATS    //此配置用来采集定时器通用基本信息
    void *start_site;                          //通过gcc支持的__builtin_return_address(0)来设置成当前函数返回地址
    char start_comm[16];                 //设置成进程的task->comm
    int start_pid;                               //设置成进程的pid
#endif
#ifdef CONFIG_LOCKDEP
    struct lockdep_map lockdep_map;  //映射lock实例到lock-class对象,用于调试模块死锁检测
#endif
};

init_timer(timer)
功能:这是一个宏用来动态地定义一个定时器
timer:struct timer_list结构指针
头文件:#include <linux/timer.h>

init_timer_deferrable(timer)
功能:这是一个宏用来动态地定义一个定时器,此处定义的timer可以被短暂的延时,减少cpu唤醒的次数
timer:struct timer_list结构指针
头文件:#include <linux/timer.h>

void add_timer(struct timer_list *timer)
功能:把一个定时器对象加入到内核的管理队列,内部调用mod_timer
timer:定时器对象
头文件:#include <linux/timer.h>

int mod_timer(struct timer_list *timer, unsigned long expires)
功能:若定时器存在队列中则修改定时器超时时间,否则添加一个定时器到对列中
timer:定时器对象
expires:新的超时时间
返回值:若定时器在内核对列上,则修改超时后返回1
             若定时器不在内核对列上,则将定时器添加到队列中后返回0
头文件:#include <linux/timer.h>

int del_timer(struct timer_list *timer)
功能:在内核队列中删除一个定时器, 定时器到期后,内核会自动将定时器从内核队列中删除,但若想在
         定时器未超时之前删除一个定时器,那么就可以调用此函数
timer:定时器对象
返回值: 若删除定时器时,此定时器以超时,并不在内核对列中则返回0
              若定时器未超时,则将定时器从内核对列删除后返回1
头文件:#include <linux/timer.h>

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


struct timer_list timer;
//定时器超时函数
void func(unsigned long data)
{
    printk("**************************timer is execute\n");
    printk("***modtimer=%d\n",mod_timer(&timer,jiffies+2000));
    return;
}

static int __init  yld_init(void){

   //初始化定时器对象
   init_timer(&timer);
   timer.expires = jiffies+9000;
   timer.function = func;
   timer.data = 0;
   
   //添加定时器
   add_timer(&timer);

   //修改定时器超时时间  
   printk("**init *modtimer=%d\n",mod_timer(&timer,jiffies+5000));

   return 0;
}
static void __exit yld_exit(void)
{
   printk("*******************%d\n",del_timer(&timer));
   return;
}

猜你喜欢

转载自blog.csdn.net/yldfree/article/details/81212211