【发布时间】:2014-01-07 15:08:02
【问题描述】:
我正在尝试设置一个周期性计时器,每秒钟触发一次功能,但每次调用之间会有一点偏差。经过一番调查,我发现这是 add_timer() 调用,它向 expires 字段添加了 2 的偏移量(在我的情况下约为 2ms)。
为什么要添加这种漂移?有没有干净的方法来防止它?我并不是想获得准确的毫秒精度,我对内核实时限制有一个模糊的了解,但至少要避免每次调用时故意延迟。
这是一个测试模块的输出。每对数字是调用前后expires 字段的值:
[100047.127123] Init timer 1000
[100048.127986] Expired timer 99790884 99790886
[100049.129578] Expired timer 99791886 99791888
[100050.131146] Expired timer 99792888 99792890
[100051.132728] Expired timer 99793890 99793892
[100052.134315] Expired timer 99794892 99794894
[100053.135882] Expired timer 99795894 99795896
[100054.137411] Expired timer 99796896 99796898
[...]
[100071.164276] Expired timer 99813930 99813932
[100071.529455] Exit timer
这里是来源:
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/jiffies.h>
#include <linux/time.h>
static struct timer_list t;
static void timer_func(unsigned long data)
{
unsigned long pre, post;
t.expires = jiffies + HZ;
pre = t.expires;
add_timer(&t);
post = t.expires;
printk("Expired timer %lu %lu\n", pre, post);
}
static int __init timer_init(void)
{
init_timer(&t);
t.function = timer_func;
t.expires = jiffies + HZ;
add_timer(&t);
printk("Init timer %d\n", HZ);
return 0;
}
static void __exit timer_exit(void)
{
del_timer(&t);
printk("Exit timer\n");
}
module_init(timer_init);
module_exit(timer_exit);
【问题讨论】:
标签: linux timer kernel real-time