如何在 linux 内核中实现准确的计时器

How to achieve accurate timer in linux kernel

写红外线遥控驱动的时候,需要控制PWM开启和关闭时的延迟准确时间

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

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

为此我应该使用什么功能?

在您上面提到的 post 中,ndelay 中存在舍入错误的问题,您通过使用较大的参数(10000 纳秒),然后进一步调用它 400 次。正如我所指出的,udelay 的舍入误差实际上很小。

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

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