2015-03-15 4 views
5

प्रश्न धुंधला दिख सकता है क्योंकि एक पंक्ति में किसी समस्या का वर्णन करना मुश्किल है, इसलिए यह यहां जाता है। मैं एक पीआईडी ​​नियामक चलाने के लिए रास्पबेरी पीआई पर डेबियन का उपयोग करता हूं जिसका मतलब है कि डीआईडी ​​(लूप निष्पादन के बीच समय अंतर) हर बार पीआईडी ​​आउटपुट की गणना की जाती है। असल में डीटी की गणना इस तरह की जाती है।समय सीमित करने के लिए कैसे लिनक्स एक कार्रवाई के लिए लेता है?

oldtime_ = time_; 
    clock_gettime(CLOCK_MONOTONIC, &time_); 
    Timer.dt = ((static_cast<int64_t>(time_.tv_sec) * 1000000000 + static_cast<int64_t>(time_.tv_nsec)) - (static_cast<int64_t>(oldtime_.tv_sec) * 1000000000 + static_cast<int64_t>(oldtime_.tv_nsec)))/1000000000.0; 

पीआईडी ​​लगभग 400 बार एक दूसरे अद्यतन किया जाता है और यह सिर्फ ठीक हो जाता है, लेकिन कभी कभी लिनक्स बहुत अधिक समय के लिए एक कार्रवाई करने के लिए लेने का फैसला। परिणाम डीटी की एक बड़ी संख्या है, कहें, 1/400 = 0.0025 नहीं बल्कि 0.8 जो आवश्यक से 320 गुना अधिक है। परिणाम पीआईडी ​​की गलत गणना है। ऐसा लगता है। enter image description here

मुझे एक जवाब देना अच्छा लगेगा कि रास्पियन को वास्तविक समय प्रणाली के करीब कैसे स्थानांतरित किया जाए।

संपादित

धन्यवाद, anaken78 और जो भी मदद की है। आरआर_एफआईएफओ शेड्यूल का उपयोग पूरी तरह से काम करता है और प्रोसेसिंग की गति हमेशा 380-400 हर्ट्ज होती है। enter image description here

+0

यदि आपको उच्च परिशुद्धता, सस्ते टाइमर की आवश्यकता है, तो मैं टीएससी को सीधे (यदि उपलब्ध हो) का उपयोग करने का सुझाव देता हूं, और टीएससी स्काई से बचने के लिए अपनी प्रक्रिया को एक कोर (यदि सिस्टम मल्टीकोर) में पिन करता है। – erenon

+0

आपने अभी तक क्या प्रयास किया है? ऐसा नहीं है कि यह आवश्यकता पूरी तरह से अनूठी नई है, और आप खोजशब्दों को खोजने के लिए पहले ही जानते हैं। साथ ही, टाइमर सटीक नहीं है या शेड्यूलर आपके तर्क के साथ गड़बड़ करता है? –

+0

सिस्टम अकेले ही cored है। समस्या शेड्यूलर गड़बड़ कर रही है, इसलिए मुझे यकीन नहीं है कि टीएससी का उपयोग करने से सीधे मदद मिलेगी, लेकिन यदि मैं टीएससी को सीधे शेड्यूलर को उच्च प्राथमिकता देता हूं तो मैं इसे आज़मा दूंगा। जैसा कि मैंने कहा, सवाल मेरे लिए Google पर धुंधला दिखता है। मैंने कोशिश की एकमात्र खोज "रीयल-टाइम" है, लेकिन मैंने अभी तक RTlinux या रीयल-टाइम कर्नेल का उपयोग नहीं किया है। यदि डेबियन के आसपास नृत्य करना कोई परिणाम नहीं देता है तो मैं यह करूँगा। – user3081123

उत्तर

2

मैं तुम्हें मूल रास्पबेरी पाई उपयोग कर रहे हैं और नहीं रास्पबेरी पाई 2. मूल रास्पबेरी पाई के साथ समस्या यह सोचते हैं कि यह एक सिंगल कोर ARM11 CPU जो प्रभावी रूप से है कि आर टी गणना के किसी भी प्रकार (वैसे इसका मतलब का उपयोग करता है आप कर रहे हैं) हार्डवेयर इंटरप्ट्स की वजह से त्रुटियों के लिए बाध्य हैं। उदाहरण के लिए, वाईफ़ाई पर आने वाले पैकेट आपके सिस्टम को बाधित कर सकते हैं, जिससे समस्या उत्पन्न हो जाएगी।

यदि आप कोई नेटवर्क कनेक्टिविटी नहीं रखते हैं, तो एक संभावित चीज आप कोशिश कर सकते हैं, अपनी प्रक्रिया प्राथमिकता बढ़ाने और अपने वाईफाई और एथ इंटरफेस को बंद करना है। ये, मैं कहूंगा, एसिंक्रोनस इंटरप्ट्स के मुख्य स्रोत हैं जो आपकी प्रक्रिया निष्पादन को बाधित कर सकते हैं। फायरिंग रखने वाले अन्य बाधाएं होंगी, आप इंटरप्ट्स फायरिंग के बारे में एक विचार प्राप्त करने के लिए/proc/interrupts और/proc/softirq देख सकते हैं, लेकिन रास्पबेरी पाई जैसे प्लेटफॉर्म में, उन्हें या तो प्रायोगिक (टाइमर) होना चाहिए या वे बहुत कम रहता है (उदाहरण के लिए यूएसबी इंटरप्ट्स) कुछ एमएस के क्रम में, आपकी प्रक्रिया में झटके का कारण नहीं बनना चाहिए।

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