【问题标题】:How to achieve accurate timer in linux kernel如何在linux内核中实现精确定时器
【发布时间】:2015-05-25 12:56:20
【问题描述】:

在编写红外遥控驱动程序时,我必须在启用和禁用 PWM 期间控制延迟准确时间。

起初我在内核中使用 udelay() 函数,但我发现它根本不准确,正如我在另一个 post 中所说的那样

AFAIK,内核提供的其他超时功能由于调度程序无法提供准确的时间,当超时时,内核仍然需要一些时间才能切换到我的进程。

为此我应该使用什么函数?

【问题讨论】:

  • 您需要什么分辨率?你试过hrtimer接口吗?
  • 我不能说我需要什么分辨率,因为我不知道。实际上在某些平台上 udelay() 有效,但有时 udelay() 不起作用....

标签: linux timer linux-kernel driver delay


【解决方案1】:

在您上面引用的帖子中,ndelay 中存在舍入错误,您通过使用大参数(10000 纳秒)调用函数,然后进一步增加了该错误调用它 400 次。正如我所指出的,udelay 的舍入误差实际上非常小。

要么您需要微秒级分辨率,在这种情况下,udelay 似乎就可以了。或者您需要纳秒级分辨率,在这种情况下,不要使用它来等待 400 万纳秒,这样您就不会出现那种级别的错误。 (我很难想象一种设备需要您等待数百万纳秒[甚至数万],然后期望您在几纳秒内做出反应。)

由于您显然希望在不允许任务切换的情况下进行轮询,另一种选择是使用ktime_get 来获得单调增加的纳秒分辨率时间,并仔细维护校正。然后,您可以自己计算差异,以确定您何时等待了足够长的时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    • 1970-01-01
    • 2014-01-06
    相关资源
    最近更新 更多