linux定时器

    定时器,有时也称为动态定时器或内核定时器,是管理内核时间的基础。内核经常要推后执行某些代码,比如下半部机制就是为了将工作推后执行。我们需要一种工具,使工作能够在指定时间点上执行,正好在希望的时间点上,内核定时器正是这样一种工具。

    定时器使用简单,只须执行一些初始化工作,设置一个超时时间,指定超时发生后执行的函数,然后激活定时器就可以了。注意,定时器并不周期运行,它在超时后就自行销毁,这就是这种定时器被称为动态定时器的原因。动态定时器不断地创建和销毁,而且它的运行次数也不受限制。


    定时器由结构timer_list表示:

在<timer.h(include/linux)>中
<span style="font-size:14px;">2.struct timer_list {   
3. struct list_head entry;  //定时器链表的入口
4. unsigned long expires;   //定时器超时时的节拍数
5.  
6. void (*function)(unsigned long ); //定时器处理函数   
7. unsigned long data;   //传给定时器处理函数的长整型参数
8.  
9. struct tvec_t_base_s *base; //定时器内部值,用户不要使用
}</span>
 

内核提供了一组与定时器相关的接口用来简化管理定时器的操作。所有这些接口都声明在<linux/timer.h>中,大多数接口在<kernel/timer.c>中的到实现。



创建定时器首先要先定义它,然后通过一个辅助函数初始化定时器数据结构的内部值,初始化必须在使用其他定时器管理函数之前完成:

1.struct timer_list my_timer;  
2.init_timer(&my_timer); // 初始化定时器
3.my_timer.expires = jiffies + delay;// delay这个值一般为seconds*HZ                  
4.my_timer.data = 0;   // 传递给function的参数
5.my_timer.function = my_function;  
6.add_timer(&my_timer); //最后,激活定时器

定时器的使用中,下面3个概念非常重要:

  1. HZ 
  2. jiffies 
  3. 时间中断处理程序


HZ

Linux核心每隔固定周期会发出timer interrupt (IRQ 0)HZ是用来定义每一秒有几次timer interrupts。举例来说,HZ1000,代表每秒有1000timer interrupts

HZ可设定1002503001000


Tick

TickHZ的倒数,意即timer interrupt每发生一次中断的时间。如HZ100时,tick10ms(millisecond)


Jiffies

JiffiesLinux核心变数(32位元变数,unsigned long),它被用来纪录系统自开机以来,已经过多少的tick。每发生一次timer interruptJiffies变数会被加1。所以一个jiffies的精度是一个Tick = (1/HZ)s,从上面看出其精度通常在ms级内。


所以,timer.expires - jiffies相减的结果就是设置超时的时间间隔。







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值