我正在使用msecs_to_jiffies(msecs)來獲取延遲。我需要16毫秒的延遲。但問題是輸入1-10的函數返回1,11-20的函數返回2,21-30和3的函數返回3。因此我無法設置適當的延遲。我可以設置延遲只有10毫秒的因素。我不能改變HZ值,功能也不能睡覺。將msec轉換爲jiffies
請提出解決此問題的方法。 謝謝
我正在使用msecs_to_jiffies(msecs)來獲取延遲。我需要16毫秒的延遲。但問題是輸入1-10的函數返回1,11-20的函數返回2,21-30和3的函數返回3。因此我無法設置適當的延遲。我可以設置延遲只有10毫秒的因素。我不能改變HZ值,功能也不能睡覺。將msec轉換爲jiffies
請提出解決此問題的方法。 謝謝
看來如果你想中止執行了用於分辨率較低,那麼系統HZ一段時間你的系統HZ值設置爲100
,你需要使用高精度計時器(使用納秒分辨率,而不是jiffies),在你的主板上支持並在內核中啓用。在這裏看到如何使用它們的接口:http://lwn.net/Articles/167897/
因此,要麼將系統HZ更改爲1000,並獲得1毫秒的jiffie分辨率或使用高分辨率計時器。
即使使用更高分辨率的定時器或1毫秒的jiffie分辨率,也不能保證線程只會在16毫秒內休眠/延遲(即使有一些擺動空間)。你需要專門的硬件和中斷。 –
因爲它是一個內核驅動程序,所以可能不存在諸如線程之類的調度實體。如果設備驅動程序希望,它可以很容易地鎖定內核而不被預先佔用,但這是一個糟糕的主意。 – nos
@ MahmoudAl-Qudsi除了支持一次性模式和所需分辨率的計時器之外,您不需要專門的硬件。你需要一個能夠實時操作的操作系統,Linux是Linux-RT補丁。請參閱:https://www.osadl.org/Single-View.111+M59e3481cdfe.0.html對於一些延遲編號 – gby
你不能睡16毫秒。你可以睡至少 16ms,但不是16ms。這不是Linux(或任何其他桌面操作系統)的工作方式 - 它們不是實時操作系統,它們以非確定性方式進行安排,您無法對此做任何事情。
無論你想要做什麼,你都必須以另一種方式去做。有了你提供的少量信息,我所能說的就是你所要做的事情是無法完成的。
請記住,延遲16ms _without sleeping_是非常糟糕的,因爲無論採用哪種方法,您都可能會將CPU限制在16ms。 – nos