4,469
社区成员
发帖
与我相关
我的任务
分享各位大佬,我现在想在驱动层中使用精度为100us的定时器,于是搜到了hrtimer高精度定时器,我用网上帖子上 hrtimer定时器的demo编译成驱动,放在我的设备中跑。关于hrtimer的介绍是高精度定时器,可以达到us级,于是我测试超时时间20ms、10ms、1ms、500us,其中20ms、10ms时还是很精准的,但是在1ms时定时器就不准了,这个有可能是什么原因呢?
测试代码如下:
enum hrtimer_restart kthread_hrtimer_func2(struct hrtimer *timer)
{
ktime_t ktime;
ktime = ktime_set(0, 1*1000000);
//ktime = ktime_set(0, 20*1000000);
//ktime = ktime_set(0, 10*1000000);
//struct timespec tc;
//getnstimeofday(&tc);
//printk("oldtc_sec:%ld, oldtc_nsec:%ld; tc_sec:%ld, tc_nsec:%ld...\n", oldtc.tv_sec, oldtc.tv_nsec, tc.tv_sec, tc.tv_nsec);
//printk("interval:%ld - %ld = %ld us\n", tc.tv_nsec/1000, oldtc.tv_nsec/1000, tc.tv_nsec/1000 - oldtc.tv_nsec/1000);
//oldtc = tc;
//hrtimer_forward_now(timer, ktime);
hrtimer_forward(timer, timer->base->get_time(), ktime);
printk("########### hrtimer 1 ms\n");
return HRTIMER_RESTART;
}
static int __init hrtime_init(void) {
printk("now enter hrtime_init...\n");
//getnstimeofday(&oldtc);
ktime_t ktime;
ktime = ktime_set(10, 0);
//hrtimer_init(&hr_timer, CLOCK_REALTIME, HRTIMER_MODE_ABS);
hrtimer_init(&hr_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
hr_timer.function = kthread_hrtimer_func2;
hrtimer_start(&hr_timer, ktime, HRTIMER_MODE_REL);
return 0;
}
static void __exit hrtime_exit(void) {
printk("now leave hrtime_exit...\n");
hrtimer_cancel(&hr_timer);
printk(KERN_ALERT "pdmac driver exit\n");
}
module_init(hrtime_init);
module_exit(hrtime_exit);
MODULE_LICENSE("GPL v2");
测试结果:
20ms的:

10ms的:

1ms的:

我觉得你的测试方法可能有问题,内核打印日志属于耗时操作,你这样直接打印和可能会影响时间精度。我之前测试都是通过GPIO口的电平变化来测试时间精度。
内核编译选项里有个选项需要放开下 有没有放开