Chinaunix首页 | 论坛 | 博客
  • 博客访问: 490202
  • 博文数量: 93
  • 博客积分: 1431
  • 博客等级: 上尉
  • 技术积分: 1006
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-18 10:30
文章分类

全部博文(93)

文章存档

2011年(20)

2010年(2)

2009年(71)

我的朋友

分类: LINUX

2009-06-18 14:54:04

Linux内核中定义了一个timer_list结构,我们在驱动程序中可以利用


 #include
 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);

增加定时器

void add_timer(struct timer_list * timer);

删除定时器

int del_timer(struct timer_list * timer);
  
  
int del_timer_sync(struct timer_list * timer);

需要确保定时器函数当前不在其他cpu上运行。

修改定时器的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。

 

例如:

struct timer_list mytimer;

void mytimer_ok(unsigned long expires)
{
   printk("\n--------my timer is ok----\n");
     mytimer.expires = jiffies +1000;
          add_timer(&mytimer);
}

static int timer_init(void)
{
   printk("---time_init  --- \n");
    init_timer(&mytimer);
    mytimer.expires = 1000;
    mytimer.function = mytimer_ok;
   add_timer(&mytimer);
   return 0;
}

jiffies 为1/100 秒

 来一个程序试试:
#include
#include
#include
MODULE_LICENSE("GPL");
struct timer_list mytimer;
void  mytimer_ok(unsigned long expires)
{
    printk("Mytimer is ok\n");
}

static int __init hello_init (void)

{

    printk("Hello module init\n");
    init_timer(&mytimer);
    mytimer.expires = 10000;
    mytimer.function = mytimer_ok;
    add_timer(&mytimer);
    return 0;

}

static void __exit hello_exit (void)

{
    del_timer(&mytimer);
    printk("Hello module exit\n");

}

module_init(hello_init);

module_exit(hello_exit);


运行结果如下:

[root@(none) nfs]$insmod ./timer.o                                             
Using ./timer.o                                                                
Hello module init                                                              
[root@(none) nfs]$Mytimer is ok  


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

guliangzeng2009-10-23 15:35:53

也可以再mytimer_ok中使用mod_timer函数 void mytimer_ok(unsigned long expires) { printk("\n--------my timer is ok----\n"); mod_timer(&mytimer,jiffies +1000); }