第四章 定时计数
4.1 定时器基本概念
系统定时器频率(节拍率)是通过静态预处理器定义的,也就是Hz。连续两次时钟的间隔时间叫做节拍,它等于1/Hz秒。
全局变量jiffies用来记录自系统启动以来产生的节拍的总数,jiffies在
一秒内增加的值就是Hz,系统运行的时间以秒为单位计算,就等于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编译器通常只将变量装载一次,一般情况下不能保证循环中的jiffies变量在每次的循环中被读取时都重新被载入,所以关键字volatile指示编译器在每次访问变量时都重新从主内存中获得,而不是通过寄存器中的变量别名来访问。
如果节拍数达到最大值后还要继续增加的话,它的值会回绕到0,这就叫做jiffies回绕。内核提供四种宏来解决jiffies回绕问题,即time_after、time_before、time_after_eq、time_before_eq.
例:
unsigned long time = jiffies + Hz; //1s后超时
if(time_before(jiffies,timeout))
{
// 没有超时处理
}
else
{
//超时了的处理
}
体系结构提供两种设备进行计时——系统定时器和实时时钟。系统定时器提供一种周期性触发中断机制,实时时钟最主要的作用是在启动时初始化墙上的时间(实际时间)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); //删除定时
这种定时器不能完全保证实时,所以不能用这种定时器来实现任何硬实时任务。