Chinaunix首页 | 论坛 | 博客
  • 博客访问: 631376
  • 博文数量: 1008
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 5175
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-31 09:44
文章分类
文章存档

2012年(1008)

我的朋友

分类:

2012-08-01 10:57:26

你需要调度一个动作以后发生, 而不阻塞当前进程直到到时, 内核定时器是给你的工具. 这些定时器用来调度一个函数在将来一个特定的时间执行,

定时器 API

内核提供给驱动许多函数来声明, 注册, 以及去除内核定时器. 下列的引用展示了基本的代码块:

#include

struct timer_list

{

        /* ... */

        unsigned long expires;

        void (*function)(unsigned long);

        unsigned long data;

};

void init_timer(struct timer_list *timer);

struct timer_list TIMER_INITIALIZER(_function, _expires, _data);

 

void add_timer(struct timer_list * timer);

int del_timer(struct timer_list * timer);

这个数据结构expires 字段表示定时器期望运行的 jiffies ; 在那个时间, 这个 function 函数被调用使用 data 作为一个参数. 如果你需要在参数中传递多项, 你可以捆绑它们作为一个单个数据结构并且传递一个转换为 unsiged long 的指针,

/**

 * ??

 * Lzy  2012\7\26

 */

 

#include

#include

#include

#include   /*timer*/

#include   /*jiffies*/

 

struct timer_list timer;

 

void timer_function(unsigned long para)

{

    printk("<0>Timer Expired and para is %ld !!\n",para);    

}

 

static int mem_module_init(void)

{

     init_timer(&timer);

   

     timer.data = 5;   

     timer.expires = jiffies + (5 * HZ);

     timer.function = timer_function;

     add_timer(&timer);

   

    return 0;

}

 

static void mem_module_exit(void)

{  

    del_timer( &timer );

}

 

module_init(mem_module_init);

module_exit(mem_module_exit);

 

MODULE_LICENSE("GPL"); /* ?? */

MODULE_AUTHOR("Lzy");   /* ???÷ */

MODULE_DESCRIPTION("memdev module"); /* ?? */

MODULE_VERSION("V1.0"); /* ??÷ */

 

源码: temp.rar   

 

定时器 API 包括几个比上面介绍的那些更多的功能. 下面的集合是完整的核提供的函数列表:

int mod_timer(struct timer_list *timer, unsigned long expires);

更新一个定时器的超时时间, 使用一个超时定时器的一个普通的任务(再一次, 关马达软驱定时器是一个典型例子). mod_timer 也可被调用于非激活定时器, 那里你正常地使用 add_timer.

int del_timer_sync(struct timer_list *timer);

如同 del_timer 一样工作, 但是还保证当它返回时, 定时器函数不在任何 CPU 上运行. del_timer_sync 用来避免竞争情况在 SMP 系统上, 并且在 UP 内核中和 del_timer 相同. 这个函数应当在大部分情况下比 del_timer 更首先使用. 这个函数可能睡眠如果它被从非原子上下文调用, 但是在其他情况下会忙等待. 要十分小心调用 del_timer_sync 当持有锁时; 如果这个定时器函数试图获得同一个锁, 系统会死锁. 如果定时器函数重新注册自己, 调用者必须首先确保这个重新注册不会发生; 这常常同设置一个" 关闭 "标志来实现, 这个标志被定时器函数检查.

int timer_pending(const struct timer_list * timer);

返回真或假来指示是否定时器当前被调度来运行, 通过调用结构的其中一个不透明的成员.

 

阅读(191) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~