低精度定时器
所谓低精度定时器,是指这种定时器的计时单位基于jiffies值的计数,也就是说,它的精度只有1/HZ,假如你的内核配置的HZ是1000,那意味着系统中的低分辨率定时器的精度就是1ms。
函数接口
struct timer_list {
struct list_head entry;
unsigned long expires;
void (*function)(unsigned long);
unsigned long data;
struct tvec_base *base;
......
};
其中expires
字段表示期望定时器执行的jiffies
值,到达jiffies
值时,将调用function
函数,并传递data
作为参数(如果function
函数需要不止一个参数时,那么可以将几个参数组成一个结构体,并将结构体的指针赋值给data
)。
entry
字段用来连接该定时器到一个内核链表中。base
字段是内核内部实现所使用的字段(一般情况不用管这两个字段)。
初始化
定时器初始化时可使用如下方法(exp):
struct timer_list mytimer;
init_timer(&mytimer);
mytimer.expires = jiffies + HZ;
mytimer.data = (unsigned long) dev;
mytimer.function = timer_test_func;
注册
使用add_timer(struct timer_list *timer)
,初始化的定时器会被连接到内核专门的链表中。
mod_timer(struct timer_list *timer, unsigned long expires)
该函数会重新注册定时器到内核,而不管定时器函数是否被运行过。
注销
同add_timer
函数相反,del_timer
类的函数负责从系统的定时器管理队列中摘除一个定时器对象。也可以使用del_timer_sync
。
del_timer
与del_timer_sync
的函数原型是:
<kernel/timer.c>
int del_timer(struct timer_list *timer);
int del_timer_sync(struct timer_list *timer);
两者的区别del_timer
是当前处理器没有执行定时器时会将其注销,而是del_timer_sync
是当所有处理器都没有执行定时器时会进行注销。
测试程序
#define CNT 32
static int g_get_time_index = 0;
static struct timer_list mytimer_test;
static struct timespec64 current_time[CNT];
static void timer_test_func(struct timer_list *t)
{
if(g_get_time_index >= CNT){
printk("timer test done!\n");
return;
}
mytimer_test.expires = jiffies + HZ;
add_timer(&mytimer_test);
getnstimeofday64(¤t_time[g_get_time_index++]);
}
static int timer_test_init(void)
{
mytimer_test.function = (void *