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 {
struct list_head entry
unsigned long expires;
struct tvec_base * base
void ( * function) ( unsigned long ) ;
unsigned long data;
}
2.内核定时器相关API函数
struct timer_list mytimer;
void init_timer ( struct timer_list * timer) ;
void add_timer ( struct timer_list * timer)
int mod_timer ( struct timer_list * timer, unsigned long expire)
int del_timer ( struct timer_list * timer)
2.1 修改定时器超时时间
函数原型 *int mod_timer(struct timer_list timer, unsigned long expires) 函数功能 修改定时器超时时间 函数参数 timer:对应的定时器结构体 expires:超时时间 函数返回值 成功返回 :修改成功的时间值
2.2 初始化定时器
函数原型 #define init_timer(timer) 函数功能 初始化定时器结构 函数参数 timer:对应的定时器结构体
2.3 关闭定时器
函数原型 int del_timer(struct timer_list *timer) 函数功能 关闭定时器,停用一个定时器。 函数参数 timer:对应的定 时器结构体 函数返回值 返回0:成功
2.4 关闭定时器
函数原型 int del_timer_sync(struct timer_list *timer) 函数功能 关闭定时器,停用一个定时器,多处理器使用。 函数参数 timer:对应的定时器结构体 函数返回值 返回0:成功
2.5 转换时间(微妙单位)
函数原型 unsigned long usecs_to_jiffies(const unsigned int m) 函数功能 转换时间(微妙单位),用于填充定时器结构体,设置超时时间 函数参数 m:要转换的时间值(微妙为单位) 函数返回值 成功返回转换成功的时间。用于填充定时器结构体,设置超时时间
2.6 转换时间(毫秒为单位)
函数原型 unsigned long msecs_to_jiffies(const unsigned int m) 函数功能 转换时间(毫秒为单位),用于填充定时器结构体,设置超时时间 函数参数 m:要转换的时间值(毫秒为单位) 函数返回值 成功返回转换成功的时间。用于填充定时器结构体,设置超时时间
3.使用定时器的步骤
void callback ( unsigned long arg) {
int * strp = ( int * ) arg
printf ( strp) ;
tm. expires = jiffies+ 1 * HZ
add_timer ( & tm) ;
}
( 1 ) 定义定时器结构体timer_list。
static struct timer_list mytimer ;
( 2 ) 设置超时时间,定义定时器处理函数和传参。
mytimer. expires= jiffies+ msecs_to_jiffies ( 1000 ) ;
mytimer. function = callback;
mytimer. data = 12 ;
( 3 ) 启动定时器
add_timer ( & tm) ;