如何在linux内核中实现精确定时器



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

起初我在内核中使用了uddelay()函数,但我发现它根本不准确,因为我在另一个

当然,由于调度程序的原因,内核提供的其他超时函数不能提供准确的时间,当超时时,内核仍然需要一些时间切换到我的进程。

我应该使用什么函数来达到这个目的?

在你上面提到的帖子中,问题是ndelay有一个舍入误差,这个错误通过使用一个大参数(10000纳秒)调用函数而大大增加,然后通过调用它400次。正如我所指出的, delay的舍入误差实际上非常小。

要么你需要微秒级的分辨率,在这种情况下,延迟似乎是好的。或者你需要纳秒级的分辨率,在这种情况下,不要用它来等待400万纳秒你就不会有那种级别的错误。(我很难想象一种设备需要你等待数百万纳秒(甚至数万纳秒),但却期望你在几纳秒内做出反应。)

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

最新更新