Chinaunix首页 | 论坛 | 博客
  • 博客访问: 96011
  • 博文数量: 28
  • 博客积分: 1435
  • 博客等级: 上尉
  • 技术积分: 265
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-26 11:40
文章分类

全部博文(28)

文章存档

2017年(1)

2012年(1)

2011年(6)

2010年(20)

我的朋友

分类: LINUX

2010-05-14 14:45:42

内核有一个定时器的实现,可以实现在N个jiffies之后执行某个任务。
实现:kernel/timer.c
头文件:include/linux/timer.h
核心数据结构:struct timer_list
主要操作函数:init_timer,add_timer,del_timer_sync,mod_timer

demo 如下:


  1 #include <linux/timer.h>
  2 #include <linux/module.h>
  3
  4 struct timer_list timer;
  5
  6 static void func(unsigned long p)
  7 {
  8 printk("LZJ:jiffies in func %ld\n",jiffies);
  9 }
 10
 11 static int __init timer_init(void)
 12 {
 13 init_timer(&timer);
 14 timer.expires=jiffies+1000;
 15 timer.data=(unsigned long)timer.expires-jiffies;
 16 timer.function=func;
 17
 18 printk("LZJ:jiffies now:%ld\n",jiffies);
 19
 20 add_timer(&timer);
 21 return 1;
 22 }
 23
 24 static void __exit timer_exit(void)
 25 {
 26 del_timer_sync(&timer);
 27 printk("LZJ:timer exit\n");
 28 }
 29
 30 MODULE_AUTHOR("zhijie Li");
 31 MODULE_DESCRIPTION("This is a linux kernel timer test.");
 32 MODULE_LICENSE("Dual BSD/GPL");
 33 module_init(timer_init);
 34 module_exit(timer_exit);


编译后insmod,输出结果如下:
lzj@lzj-laptop:~/documents/kernel_timer$ dmesg | grep "LZJ"
[ 2460.886284] LZJ:jiffies now:540221
[ 2464.884061] LZJ:jiffies in func 541221

正好相差1000.

    一个低级错误:开始我把struct timer_list timer 定义放在timer_init函数中,这个函数当insmod的时候执行。每次刚insmod,系统就挂掉。原因如下:
    如果把timer作为局部变量,它的内存将分配在堆栈上,然后给它赋值(其中包括func),当1000个jiffies之后这个函数已经结束,堆栈释放。此时timer已经不存在。
阅读(743) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~