关于hrtimer定时器的疑惑

别熬夜 2021-08-29 17:28:21

各位大佬,我现在想在驱动层中使用精度为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的:

...全文
1214 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
四点能 2021-09-02
  • 打赏
  • 举报
回复

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

别熬夜 2021-09-02
  • 举报
回复
@四点能 您好,使用1ms、几百us精度时,是用示波器看gpio电平变化吗
weiwei11234567890 2021-09-08
  • 举报
回复
@四点能 有点道理,等确认结果.
四点能 2021-09-12
  • 举报
回复
@别熬夜 有示波器最好,如果没有的话找个逻辑分析仪也可以
yoveldf 2021-08-31
  • 打赏
  • 举报
回复

内核编译选项里有个选项需要放开下 有没有放开

别熬夜 2021-09-01
  • 举报
回复
@yoveldf 您好,请问是哪个选项啊
yoveldf 2021-09-02
  • 举报
回复
@别熬夜 CONFIG_SND_HRTIMER 这个选项看看
别熬夜 2021-09-02
  • 举报
回复
@yoveldf 您好我用的是mips架构的,我没找到您说的这个配置项,但发现了选项/Device Drivers ---> /Sound card support ---> /Advanced Linux Sound Architecture --> /HR-timer backed support,不知道这个是否有用,我晚上试一下

4,469

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧