【推荐阅读】
1. 内核定时器介绍
内核定时器是内核用来控制在未来某个时间点(基于jiffies(节拍总数))调度执行某个函数的一种机制,相关函数位于 <linux/timer.h> 和 kernel/timer.c 文件中。
当内核定时器定时时间到达时,会进入用户指定的函数,相当于软中断。内核定时器注册开启后,运行一次就不会再运行(相当于自动注销),我们可以重新设置定时器的超时时间,让定时器重复运行。
每当时钟中断发生时,全局变量jiffies(一个32位的unsigned long 变量)就加1,因此jiffies记录了linux系统启动后时钟中断发生的次数,驱动程序常利用jiffies来计算不同事件间的时间间隔。内核每秒钟将jiffies变量增加HZ次。因此,对于HZ值为100的系统,jiffy+1等于隔了10ms,而对于HZ为1000的系统,jiffy+1仅为1ms。
内核定时器结构体:下面列出了需要关心的成员
struct timer_list {
unsigned long expires; //设置超时时间,用jiffies作为基准值
void (*function)(unsigned long); //类似中断服务函数,设置定时器到时后处理的函数
unsigned long data; //中断服务函数的参数
}
expires设置:以当前时间为基准加上延时时间,时间基准用jiffies变量表示,延时时间可以使用以下两个宏转换成jiffies单位。
2. 内核定时器相关API函数
2.1 修改定时器超时时间
函数原型 | *int mod_timer(struct timer_list timer, unsigned long expires) |
---|---|
函数功能 | 修改定时器超时时间 |
函数参数 | timer:对应的定时器结构体 expires:超时时间 |
函数返回值 | 成功返回 :修改成功的时间值 |
函数定义文件 | \linux-3.5\kernel\timer.c |
2.2 初始化定时器
函数原型 | #define init_timer(timer)\ |
---|---|
函数功能 | 初始化定时器结构 |