2011-09-09 7 views
8

मैं ऐसे डिवाइस के लिए कर्नेल ड्राइवर लिख रहा हूं जो नियमित रूप से पढ़ने के लिए नियमित मात्रा में डेटा उत्पन्न करता है। उपयोगकर्ता अंतरिक्ष कार्यक्रम आदर्श रूप से इसे अवरुद्ध करने वाला ड्राइवर बनाने के लिए उपयुक्त है।मैं लिनक्स ड्राइवर मॉड्यूल में 100+ मिलीसेकंड के लिए कैसे रोक सकता हूं?

क्या तरीकों एक ड्राइवर में 4 से 100ms के लिए कहीं भी रोक (अर्थात "ब्लॉक" कर रही है) के लिए उपलब्ध हैं?

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

मिले यह: 'निर्वासन पर हस्ताक्षर किए लंबे schedule_timeout (हस्ताक्षरित लंबे समय समाप्त);' – Jamie

उत्तर

1

schedule_timeout का उपयोग करते हुए एक निर्दिष्ट समय के लिए लेकिन कम से कम निर्दिष्ट समय के लिए सो नहीं करता है। यदि आप वास्तव में निर्दिष्ट समय के लिए ब्लॉक करना चाहते हैं, तो आपको ताले का उपयोग करना होगा। स्लीपिंग आपको केवल न्यूनतम समय की गारंटी देगी - इससे आपको बहुत अधिक ग्रैन्युलरिटी के आधार पर इससे कोई फर्क नहीं पड़ता। लेकिन एक बेहतर ड्राइवर तब तक सोएगा जब तक कि पाठक ने किसी भी मामले में अधिक डेटा मांगे।

+0

ठीक है ... ताले, इसे देखोगे। लेकिन ग्रैन्युलरिटी होने जा रही है, क्या? + - 10 एमसीईसी? (बीटीडब्ल्यू: आपका उत्तर उत्तर से अधिक टिप्पणी सामग्री है) – Jamie

+0

... और मेरे प्रश्न के बारे में कुछ संकेतक और ताले का उपयोग करने के आपके सुझाव की बहुत सराहना की जाएगी। या, बेहतर (बहुत बेहतर :)), प्रासंगिक एपीआई कोड की तीन या चार पंक्तियों के साथ एक जवाब! – Jamie

संबंधित मुद्दे