Linux c ——定时计数

来源:互联网 发布:如何提高淘宝店铺权重 编辑:程序博客网 时间:2024/06/14 03:18


系统的定时器频率(节拍率)是通过静态预处理器定义的,也就是HZHZ是变化的,连续两次时钟的间隔时间就叫做节拍,为1/HZ秒,高HZ有利于提高函数的运行精度,有利于提高抢占的准确度,有利于获得更精细的解析度,但是会减少其他处理器工作的时间,会更频繁的扰乱处理器的高速缓存,增加耗电。

全局变量jiffies用来记录自系统启动以来产生的节拍总数,jiffies在一秒内增加的值就是HZ

extern  unsigned  long volatile jiffies;    //定义Jiffies

unsigned long later = jiffies + 5 * HZ      //从现在开始5s

1)jiffies类型为unsigned long,内核时间管理代码使用整个64位的jiffies_64,而jiffies仅是读取jiffies_64的低32位。

2)C编译器通常只将变量装载一次,关键词volatile将编译器在每次访问变量时都重新从主内存中获取,而不是通过寄存器的变量别名来访问。

Jiffies回绕:节拍数达到最大值之后还要继续增加的话,jiffies0开始计数。

内核提供四种宏来解决jiffies回绕问题,即time_aftertime_beforetime_after_eqtime_before_eq.

体系结构提供两种设备进行计时——系统定时器和实时时钟。系统定时器提供一种周期性触发中断机制,实时时钟最主要的作用是在启动时初始化墙上的时间(实际时间)xtime变量。

4.2 动态定时器的使用

Struct time_list my_timer;                //创建定时器

Init_timer(&my_timer);                  //初始化定时器

my_timer.expires = jiffies + delay;          //填充超时时间

my_timer.data = 0;                      //填充超时处理函数void my_function(unsigned        

                                      long data )形参

my_timer.function = my_function;         //填充超时处理函数

add_timer(&my_timer);                 //激活定时器

mod_timer(&my_timer,jiffies+new_delay);  //修改新的定时时间并激活

del_timer_sync(&my_timer);             //删除定时

说明:

动态定时器不是周期运行,它在超时后就自动撤销,所以不需要为已经超时的定时器调用删除函数,删除定时器时需要等待可能在其他处理器上运行的定时器处理程序都退出,所以要使用del_timer_sync,而del_timer只能保证定时器不再被激活,这种定时器不能完全保证实时,不能用这种定时器实现任何硬实时任务。

 

0 0
原创粉丝点击