2011-09-09 31 views
8

我正在寫一個設備的內核驅動程序,它會定期生成定期讀取數據的設備。用戶空間程序非常適合將其作爲阻塞驅動程序。如何在linux驅動模塊中暫停100+毫秒?

什麼方法都可以在驅動程序從4毫秒至100毫秒的任何地方暫停(即做「」)?在用戶空間我該怎麼做才能某種類似:

tv.tv_sec = microsecond_delay/1000000ul; 
tv.tv_usec = microsecond_delay % 1000000ul; 
(void)select(0, NULL, NULL, NULL, & tv); 

gettimeofday(tv,NULL); 

和比較結構。

[編輯 - 我自己的答案]

我將使用下面的代碼在我的司機:

#include <linux/jiffies.h> 
... 
schedule_timeout(file->private_data->my_driver_struct.read_pause_jiffies); 

瞧!我現在要測試...

+0

答案是受歡迎的,但我只是發現了[這](http://makelinux.com/ldd3/chp-7-sect-4) – Jamie

+0

其實,不是我在尋找:我想睡眠指定的時間,而不是創建一個異步計時器事件。 – Jamie

+0

發現它:'extern簽署長schedule_timeout(簽名長超時);' – Jamie

回答

18
#include <linux/delay.h> 

... 
msleep(100); 
... 
1

使用schedule_timeout不會在指定的時間內休眠,但會在指定的最短時間內休眠。如果你真的想一段指定的時間,你將不得不使用鎖。沉睡只會保證你至少有一段時間 - 這對你來說可能無關緊要,這取決於你需要的很多粒度。 但是,一個更好的司機會睡覺,直到讀者在任何情況下要求更多的數據。

+0

好吧...鎖,將查找它。但粒度將會是什麼? + - 10毫秒? (順便說一句:你的回答是更多的評論材料比答案) – Jamie

+0

...和一個關於我的問題和你使用鎖的建議的指針將不勝感激。或者,更好(更好:)),一個有三到四行相關API代碼的答案! – Jamie