当我编写红外遥控驱动程序时,我必须在启用和禁用PWM期间控制延迟准确时间。
起初我在内核中使用了udelay()函数,但我发现它根本不准确,就像我在另一个post
中所说的那样AFAIK,内核提供的其他超时功能因为调度程序无法提供准确的时间,当超时时,内核仍需要一段时间才能切换到我的进程。
我应该为此目的使用什么功能?
答案 0 :(得分:1)
在上面提到的帖子中,问题是 ndelay 中存在一个舍入错误,这个错误通过调用带有大参数的函数(10000纳秒)而大大增加,然后进一步叫它400次。正如我所指出的, udelay 的舍入错误实际上非常小。
要么你需要微秒分辨率,在这种情况下,udelay似乎没问题。或者你需要纳秒分辨率,在这种情况下,不要使用它等待400万纳秒,你就不会有这样的错误。 (我很难设想一个需要等待数百纳秒[甚至数万]的设备,但后来希望你在几纳秒内做出反应。)
由于您显然希望在不允许任务切换的情况下进行轮询,另一种选择是使用ktime_get
来获得单调增加的纳秒分辨率时间并仔细维护校正。然后,您可以进行自己的差异计算,以确定何时等待足够长的时间。