Chinaunix首页 | 论坛 | 博客
  • 博客访问: 99734
  • 博文数量: 23
  • 博客积分: 516
  • 博客等级: 中士
  • 技术积分: 315
  • 用 户 组: 普通用户
  • 注册时间: 2011-10-29 16:45
文章分类
文章存档

2012年(11)

2011年(12)

分类: LINUX

2011-10-30 02:08:23

一、HZ与jiffies的使用   
    时钟中断由系统的定时硬件以周期的时间间隔产生,这个间隔由内核根据HZ来确定,HZ是一个与体系结构无关的常数,可配置(50-1200),在X86平台,默认值为1000。
    HZ:表示1s产生多少次时钟中断。
    每当时钟中断发生时,全局变量jiffies(unsigned long)就加1,因此jiffies记录了自linux启动后时钟中断发生的次数。驱动程序常用jiffies来计算不同事件间的时间间隔。
    
    如果对延迟的精度要求不高,最简单实现方法如下--忙等待:
    unsigned long j = jiffies + jit_delay*HZ
    while(jiffies < j)
    {
         ;
     }
二、内核定时器的使用
    1、功能:定时器用于控制某个函数在未来的某个特定时间执行。内核定时器注册的处理函数只执行一次--不是循环执行的。
    2、定时器的结构描述
    内核定时器被组织成双向链表,并使用timer_list结构描述
    struct timer_list{
         struct list_head entry; /*内核使用*/
         unsigned long expires;  /*超时的jiffies值*/
         void (*function)(unsigned long); /*超时处理函数*/
         unsigned long data; /*超时处理函数参数*/
         struct tvec_base *bse; //内核使用
    }
    3、内核定时器的使用
    a、初始化定时器:void init_timer(struct timer_list *timer)
    b、启动定时器:void add_timer(struct timer_list *timer)
    c、int del_timer(struct timer_list *timer)
       在定时器超时前将它删除。当定时器超时后,系统会自动将它删除。
    4、实例
#include
#include
#include
#include
#include

MODULE_LICENSE("GPL");
MODULE_ALIAS("timer module");

struct timer_list timer;

void timer_function(int para)
{
    printk("TImer Expired and para is %d!!\n",para);
}

int timer_init()
{
    init_timer(&timer);
    timer.data = 5;
    timer.expires = jiffies + (5 * HZ);
    timer.function = timer_function;
    add_timer(&timer);

    return 0;
}

void timer_exit()
{
    del_timer(&timer);
}

module_init(timer_init);
module_exit(timer_exit);

实验现象:
1、加载内核模块5秒后将打印TImer Expired and para is 5
2、加载内核模块5秒期间将内核模块卸载后,将无打印信息。
阅读(1560) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~