[Linux驱动入门]定时计数
2016-09-13 22:00
465 查看
第四章 定时计数
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); //删除定时
这种定时器不能完全保证实时,所以不能用这种定时器来实现任何硬实时任务。
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); //删除定时
这种定时器不能完全保证实时,所以不能用这种定时器来实现任何硬实时任务。
相关文章推荐
- Linux驱动入门
- Linux定时任务系统 Cron 入门
- Linux定时任务系统Cron入门
- Linux操作系统定时任务系统 Cron 入门
- Linux定时任务系统 Cron 入门
- Linux 2.6 驱动设计快速入门!
- 嵌入式linux驱动开发入门总结
- Linux定时任务系统Cron入门
- linux 驱动编程入门----hello world ----Makefile ---及简单的调试
- Linux驱动入门
- [转]Linux定时任务系统Cron入门
- linux 基础复习(9)设备驱动入门转
- Linux定时任务系统Cron入门
- Linux操作系统定时任务系统Cron入门
- 入门文章:教你学会编写Linux设备驱动
- Linux 2.6 驱动设计快速入门
- Linux字符设备驱动入门(一)
- linux驱动入门实验
- linux 基础复习(9)设备驱动入门转
- 嵌入式Linux字符设备入门之--LED驱动详解