मैं 'लिनक्स डिवाइस ड्राइवर' (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' धन्यवाद। मेरा कर्नेल ड्राइवर अब ठीक काम कर रहा है और इससे पहले कि आप मुझे इन सभी युक्तियों के साथ प्रदान करते हैं, स्थिति की तुलना में यह बहुत कम बदसूरत है। धन्यवाद!
एक और सोचा: का उपयोग कर प्राप्त हो \ _jiffies \ _64() कभी wraparound के बारे में सोचना और बस मुझे सरल गणित करते हैं होने से मुझे बचाओ? – Benjamin