2015-05-25 58 views
0

當我編寫紅外遙控驅動程序時,我必須在啓用和禁用PWM期間控制延遲精確時間。如何在linux內核中實現精確的定時器

起初我用udelay的()函數在內核中,但我發現,我在另一個post

AFAIK說這是不準確的,在所有的,由內核提供的其他超時功能無法提供,因爲調度的準確時間,當超時時,內核仍然需要一些時間來切換到我的進程。

我應該爲此使用什麼功能?

+1

你需要什麼決議?你有沒有試過['hrtimer'](https://www.kernel.org/doc/Documentation/timers/hrtimers.txt)界面? – myaut

+0

我不能說我需要什麼決議,因爲我不知道。實際上在一些平臺udelay()的作品,但有時udelay()不起作用.... – demonguy

回答

1

在上面提到的帖子中,問題出現在ndelay中的舍入錯誤,這個錯誤通過調用具有大參數(10000納秒)的函數大大增加,然後進一步調用400次。正如我指出的那樣,udelay的舍入誤差其實很小。

要麼你需要微秒的分辨率,在這種情況下,udelay似乎很好。或者你需要納秒級的分辨率,在這種情況下,不要用它等待400萬納秒,你不會有這種級別的錯誤。 (我很難設想一個設備需要等待數百萬納秒(甚至數萬),但是希望你在幾納秒內作出反應。)

因爲你顯然希望在沒有允許任務切換,另一種選擇是使用ktime_get通過仔細維護的校正獲得單調遞增的納秒分辨率時間。然後,您可以進行自己的差異計算,以確定您何時等待足夠長的時間。

相關問題