2009-02-17 15 views
8

मैं 'लिनक्स डिवाइस ड्राइवर' (which can be found here) उस समय में 7 अध्याय 'jiffies' में मापा जा सकता पढ़ा है। स्टॉक जिफिस वैरिएबल के साथ समस्या यह है कि यह काफी बार घूमती है (विशेष रूप से यदि आपके पास CONFIG_HZ 1000 पर सेट है)।Timekeeping 2.6

मेरी कर्नेल मॉड्यूल में मैं एक jiffies मूल्य है कि भविष्य में कुछ समय के लिए सेट है बचत कर रहा हूँ और वर्तमान 'jiffies' मूल्य के साथ बाद में तुलना। मैं पहले से ही सीखा है कार्यों कि ध्यान में 32 बिट पल चादर ले तो दो मानों मैं इस का उपयोग कर रहा तुलना करने के लिए देखते हैं कि:

if (time_after(jiffies, some_future_jiffies_value)) 
{ 
    // we've already passed the saved value 
} 

यहाँ मेरे सवाल आता है: तो अब मैं 'some_future_jiffies_value' सेट करना चाहते हैं "अब + 10 एमएमएस" के लिए। इसे आसानी से पूरा किया जा सकता है:

some_future_jiffies_value = jiffies + msecs_to_jiffies(10); 

क्या यह सही है? क्या होता है यदि वर्तमान jiffies MAX_JIFFY_OFFSET के पास है और msecs_to_jiffies (10) के परिणामी मान को ऑफसेट करने से पहले कुछ_future_jiffies_value डालता है? क्या यह स्वचालित रूप से चारों ओर लपेटता है या क्या मुझे इसे देखने के लिए कुछ कोड जोड़ना चाहिए? क्या ऐसे कार्य हैं जो मुझे इससे निपटने से बचाते हैं?

अद्यतन:

wraparound साथ सामान से बचने के लिए मैं अपनी नींद पाश फिर से लिख दिया:

// Sleep for the appropriate time 
    while (time_after(some_future_jiffies_value, jiffies)) 
    { 
     set_current_state(TASK_INTERRUPTIBLE); 
     schedule_timeout(1); 
    } 

मुझे लगता है यह अधिक पोर्टेबल सही है?

अद्यतन 2:

आप समय इस सवाल का वापस आने के लिए ले रहे हैं और साथ ही मेरी टिप्पणी पर कुछ प्रतिक्रिया उपलब्ध कराने के लिए बहुत-बहुत 'ctuffli' धन्यवाद। मेरा कर्नेल ड्राइवर अब ठीक काम कर रहा है और इससे पहले कि आप मुझे इन सभी युक्तियों के साथ प्रदान करते हैं, स्थिति की तुलना में यह बहुत कम बदसूरत है। धन्यवाद!

+0

एक और सोचा: का उपयोग कर प्राप्त हो \ _jiffies \ _64() कभी wraparound के बारे में सोचना और बस मुझे सरल गणित करते हैं होने से मुझे बचाओ? – Benjamin

उत्तर

6

क्या तुम यहाँ कार्यान्वित कर रहे हैं अनिवार्य रूप से msleep_interruptible है() (linux/कर्नेल/टाइमर.सी)

/** 
* msleep_interruptible - sleep waiting for signals 
* @msecs: Time in milliseconds to sleep for 
*/ 
unsigned long msleep_interruptible(unsigned int msecs) 

इस समारोह लाभ यह है कि विनिर्देश मिलीसेकेंड में है और आंतरिक रूप से लपेटकर jiffies के विवरण को छुपाता है। वापसी मूल्यों की जांच करना सुनिश्चित करें क्योंकि यह कॉल शेष जिफियों की संख्या लौटाता है। शून्य का मतलब है कि कॉल ने मिलीसेकंड की निर्दिष्ट संख्या को सोया, जबकि गैर-शून्य मान इंगित करता है कि कॉल को कई जिफियों को बाधित कर दिया गया था।

रैपिंग के संबंध में, jiffies और रैपिंग के विवरण के लिए खंड 6.2.1.2 देखते हैं। इसके अलावा, यह post सार में लपेटने का वर्णन करने की कोशिश करता है।

+0

यदि मैं msleep_interruptible के स्रोत को देखता हूं तो यह वास्तव में समान रूप से समान दिखता है! मुझे अभी भी उस फ़ंक्शन से रिटर्न वैल्यू पर विचार करना होगा यदि मैं सही ढंग से समझता हूं क्योंकि अंतःस्थापित नींद अपेक्षा से पहले वापस आ सकती है? – Benjamin

+0

MAX_JIFFY_OFFSET के पीछे एक टाइमआउट डालने के संबंध में, क्या आपको कोई विचार है यदि यह ठीक है? मुझे लगता है कि यह कर्नेल स्रोतों में बहुत कुछ होता है लेकिन यह एक और सैद्धांतिक बात है जिसके बारे में मैं सोच रहा था। अब तक जवाब देने के लिए समय लेने के लिए धन्यवाद! :) – Benjamin

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