2009-09-10 13 views
14

मैं एक आरटीओएस मंच पर एक छोटे पैमाने पर डेटा अधिग्रहण प्रणाली को लागू करने की योजना बना रहा हूं। (या तो एक क्यूएनएक्स या आरटी-लिनक्स सिस्टम पर।)रीयल-टाइम ऑपरेशन सिस्टम (आरटीओएस) पर पाइथन

जहां तक ​​मुझे पता है, इन नौकरियों को सिस्टम से अधिक लाभ प्राप्त करने के लिए सी/सी ++ का उपयोग करके किया जाता है। हालांकि, मुझे पता है कि मैं कुछ अनुभवी लोगों की राय सीखना चाहता हूं और कोडिंग एक्शन में अंधाधुंध कूदने से पहले जानना चाहता हूं कि क्या यह पाइथन में सबकुछ लिखने के लिए व्यवहार्य और बुद्धिमान होगा (एक चमकदार ग्राफिकल यूजर इंटरफेस के माध्यम से निम्न स्तर के उपकरण इंटरफेसिंग से)। यदि नहीं, तो "सी" के साथ डिजाइन के समय-महत्वपूर्ण भागों के साथ मिश्रण करना, या सी में सब कुछ लिखना और पायथन कोड की एक पंक्ति भी नहीं डालना।

या कम से कम सिस्टम को आसान पहुंच प्रदान करने के लिए पायथन का उपयोग करके सी कोड को लपेटना।

आप मुझे किस तरह से काम करने की सलाह देंगे? अगर आप कुछ समान डिजाइन मामलों और आगे के रीडिंग्स को इंगित करते हैं तो मुझे खुशी होगी।

धन्यवाद

NOTE1: QNX पर बल के कारण की वजह से है कि हम पहले से ही हमारे वायुमंडलीय माप प्रयोगों के लिए एक QNX 4.25 आधारित डाटा अधिग्रहण प्रणाली (M300) है। यह एक मालिकाना प्रणाली है और हम इसके आंतरिक उपयोग नहीं कर सकते हैं। क्यूएनएक्स पर आगे देखकर हमारे लिए फायदेमंद हो सकता है क्योंकि 6.4 में एक मुफ्त अकादमिक लाइसेंसिंग विकल्प है, जो पाइथन 2.5 और हाल ही में जीसीसी संस्करण के साथ आता है। मैंने कभी भी आरटी-लिनक्स सिस्टम का परीक्षण नहीं किया है, यह नहीं पता कि स्थिरता और दक्षता के मामले में क्यूएनएक्स के साथ तुलनात्मक कैसे किया जा सकता है, लेकिन मुझे पता है कि पाइथन आवास और गैर-पायथन उपकरण (जैसे Google धरती) के सभी सदस्य जो नई प्रणाली अधिकांश समय के बाहर काम पर विकसित किया जा सकता है।

+0

क्या आप समय आवश्यकताओं पर एक संकेत दे सकते हैं? आपको आवृत्तियों/प्रतिक्रिया समय की क्या आवश्यकता है? सेकंड या microseconds? अपने आरटीओएस को देखते हुए मुझे लगता है कि आपके पास या तो एक पीसी या एक शक्तिशाली एम्बेडेड प्लेटफार्म है। क्या यह सही है? – Adriaan

+0

अधिकांश मापों के लिए 1 हर्ट्ज नमूना दर संतोषजनक है। हालांकि ऐसे उपकरण हैं जिन्हें 100 हर्ट्ज के आसपास उच्च दर पर नमूना करने की आवश्यकता है। आम तौर पर सुपर-फास्ट मापने वाले उपकरण (जैसे क्लाउड कण इमेजर) उनके समर्पित डेटा सिस्टम के साथ आता है - जो ये मेरे प्रारंभिक इरादे के दायरे से बाहर हैं। और हाँ वर्तमान प्रणाली अधिग्रहण कार्यों के लिए एक पीसी पर चलती है जहां विभिन्न उपकरणों के साथ इंटरफ़ेस करने के लिए बहुत से बोर्ड हैं। मुझे लगता है कि इसे एक विशिष्ट डेस्कटॉप पीसी की बजाय एम्बेडेड प्लेटफॉर्म के रूप में कॉल करना सही होगा। –

उत्तर

14

मैं हर डाटा अधिग्रहण सेटअप वहाँ के लिए नहीं बोल सकता, लेकिन उनमें से सबसे खर्च उनके "वास्तविक समय आपरेशन" का सबसे डेटा के लिए में आने के लिए इंतजार कर रहे - कम से कम लोगों को मैं पर काम किया है

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

यदि आपके पास काफी ढीली आवश्यकताएं हैं - केवल मिलिसेकंद परिशुद्धता की आवश्यकता है, शायद - जो पाइथन में सबकुछ करने के लिए कुछ और वजन जोड़ती है।जहां तक ​​विकास का समय जाता है, यदि आप पहले से ही पाइथन के साथ सहज हैं, तो संभवतः यदि आप पाइथन में सबकुछ करना चाहते हैं और बाधाओं के रूप में रिफैक्टर के रूप में आप केवल एक तैयार उत्पाद तैयार करेंगे। पायथन में आपके काम का बड़ा हिस्सा करने से आपके कोड का पूरी तरह से परीक्षण करना आसान हो जाएगा, और अंगूठे के सामान्य नियम के रूप में, कोड की कम लाइनें होंगी और इस प्रकार बग के लिए कम जगह होगी।

आप विशेष रूप से बहु को कार्य की जरूरत है (नहीं धागा बहु), Stackless Python रूप में अच्छी तरह फायदेमंद हो सकता है। यह मल्टी-थ्रेडिंग की तरह है, लेकिन धागे (या स्टैकेलेस लिंगो में टास्कलेट) ओएस-स्तरीय धागे नहीं हैं, लेकिन पायथन/एप्लिकेशन-लेवल हैं, इसलिए टास्कलेट्स के बीच स्विचिंग का ओवरहेड महत्वपूर्ण कम हो गया है। आप स्टेकलेस को cooperatively या preemptively multitask करने के लिए कॉन्फ़िगर कर सकते हैं। सबसे बड़ा नकारात्मक पक्ष यह है कि आईओ अवरुद्ध करने से आम तौर पर आपके पूरे कार्यलेट को सेट कर दिया जाएगा। वैसे भी, क्यूएनएक्स पहले से ही एक वास्तविक समय प्रणाली है, यह अनुमान लगाने में मुश्किल है कि क्या स्टैकलेस का उपयोग करने लायक होगा या नहीं।

मेरा वोट उतना ही पाइथन-जितना संभव मार्ग लेना होगा - मैं इसे कम लागत और उच्च लाभ के रूप में देखता हूं। यदि और जब आपको सी में फिर से लिखना होगा, तो आपके पास पहले से ही काम करने के लिए कोड कोड होगा।

+0

मैंने पहले स्टैकलेस का उपयोग नहीं किया है, न ही मुझे कई कोर वैज्ञानिक उपकरणों के साथ इसके एकीकरण के बारे में कोई जानकारी है। एक आरटी-लिनक्स के साथ रहना चाहते हैं, इसका एक कारण यह है कि इसमें सभी पायथन टूल और 2 डी/3 डी विज़ुअलाइजेशन लाइब्रेरी बहुत अच्छी तरह से काम कर रही हैं। हालांकि क्यूएनएक्स पक्ष पर, कई पुस्तकालय गायब हैं और मुझे यकीन है कि उन्हें क्यूएनएक्स पर काम करने से काफी प्रयास आएंगे। इस पर किसी भी टिप्पणी की सराहना की जाएगी। –

+0

स्टैकलेस केवल एक मौजूदा पायथन इंस्टॉलेशन को संशोधित करता है - यह दो कोर फाइलों को प्रतिस्थापित करता है जो * किसी भी पायथन पुस्तकालयों को प्रभावित नहीं करना चाहिए। यह सी स्टैक का उपयोग करने से दूर चला जाता है, लेकिन इसे सी में लिखे गए पुस्तकालयों को भी प्रभावित नहीं करना चाहिए जो कि पाइथन के साथ इंटरफ़ेस है। स्टैकलेस के साथ थोड़ा सा खेलें (विंडोज़ पर स्थापित करना वास्तव में आसान है), देखें कि यह आपकी आवश्यकताओं के अनुरूप है या नहीं। मैंने स्रोत से स्टैकलेस नहीं बनाया है, इसलिए मैं क्यूएनएक्स के साथ किसी भी पूर्वोत्तर कठिनाइयों पर टिप्पणी नहीं कर सकता। –

3

हमारी टीम ने क्यूएनएक्स पर कई भाषाओं को जोड़कर कुछ काम किया है और दृष्टिकोण के साथ काफी सफलता मिली है। पाइथन का उपयोग उत्पादकता पर एक बड़ा प्रभाव हो सकता है, और SWIG जैसे टूल और सीटीपीएस कोड को अनुकूलित करने और विभिन्न भाषाओं से सुविधाओं को गठबंधन करने में वाकई आसान बनाते हैं।

हालांकि, यदि आप कुछ भी समय महत्वपूर्ण लिख रहे हैं, तो इसे लगभग निश्चित रूप से सी में लिखा जाना चाहिए। ऐसा करने का मतलब है कि आप कई छोटे स्मृति आवंटन पर जीआईएल (Global Interpreter Lock), और contention जैसे व्याख्या किए गए लैंगेज की निहित लागत से बचें। इन दोनों चीजों का आपके प्रभाव पर असर पड़ सकता है कि आपका एप्लिकेशन कैसा प्रदर्शन करता है।

क्यूएनएक्स पर भी अजगर अन्य वितरणों के साथ 100% संगत नहीं है (यानी कभी-कभी मॉड्यूल गायब होते हैं)।

+1

और क्यूएनएक्स के लिए पायथन एक अद्यतित संस्करण में खोजना मुश्किल है ... और क्यूएनएक्स – Fuzz

+0

@ फ़ज़ के लिए निर्माण करना हमेशा आसान नहीं है, 2.5 क्यूएनएक्स 6.4.x पर है, और यदि मेरी याददाश्त मुझे सही सेवा देती है तो पीईक्यूटी 4 बाइनरी कहीं तीसरे पक्ष के भंडार पर।मैंने अभी तक एक न्यूप्पी बंदरगाह नहीं देखा है, मैंने स्वयं भी कोई पुस्तकालय बनाने की कोशिश नहीं की है। मुझे यकीन है कि उनमें से कुछ आधे काम करने के लिए हैकिंग की आवश्यकता होगी। यही कारण है कि मैं एक क्यूएनएक्स पर एक आरटी-लिनक्स समाधान का उपयोग करने पर विचार करता हूं, लेकिन मुझे इस पर अधिक इनपुट और स्रोत चाहिए। –

+0

@ एंड्रयू, क्या आप कृपया मुझे कुछ पॉइंटर्स दे सकते हैं कि आरटीओएस सिस्टम पर पायथन-सी दृष्टिकोण का उपयोग करने वाली ऐसी परियोजनाएं कहां मिलें? जाहिर है, यह वेब पर कुछ हद तक छिपी हुई है, गहरी खुदाई करने की आवश्यकता है या सिर्फ परीक्षण और त्रुटि दृष्टिकोण पर ले जाना चाहिए। –

6

आम तौर पर रीयल-टाइम संदर्भ में उच्च-स्तरीय भाषा का उपयोग करने के कारण उन्नत कारण अनिश्चितता - जब आप नियमित रूप से एक बार दौड़ते हैं तो यह 100us ले सकता है; अगली बार जब आप एक ही दिनचर्या चलाते हैं तो मैशोक को कॉल करने के लिए हैश टेबल का विस्तार करने का निर्णय ले सकता है, तो मॉलोक कर्नेल से अधिक मेमोरी के लिए पूछता है, जो बाद में सेकेंड लौटने के लिए बाद में लौटने के लिए कुछ भी कर सकता है, कोई भी त्रुटि नहीं जिसमें से कोड से तुरंत स्पष्ट (या नियंत्रित) है। जबकि सैद्धांतिक रूप से यदि आप सी (या यहां तक ​​कि कम) में लिखते हैं तो आप साबित कर सकते हैं कि एक्स महत्वपूर्ण समय में आपके महत्वपूर्ण पथ "हमेशा" (उल्का हड़ताल को छोड़कर) चलेंगे।

+0

मैं लगभग सभी के साथ सहमत हूं, लेकिन किसी भी भाषा में महत्वपूर्ण पथ (और विशेष रूप से सबसे खराब मामला निष्पादन समय) विश्लेषण वास्तव में एक भयानक समस्या है, और दोनों हार्डवेयर प्लेटफार्म (कैश, पाइपलाइन, शाखा भविष्यवाणियों, पृष्ठ दोष) और सॉफ्टवेयर दोनों पर महत्वपूर्ण निर्भर करता है (ओएस सेवाएं, इंटरप्ट्स, अवरुद्ध समय)। यदि समय महत्वपूर्ण है तो एडा शायद आवश्यक है –

+2

हाँ, नमक के जितने अनाज लें उतना लें। मुझे लगता है कि शायद मेरा तर्क होना चाहिए "यदि यह सब सामान आपको वैक बकवास जैसा लगता है, तो आप इस बात की चिंता करने के लिए पर्याप्त समय नहीं हैं कि आप किस भाषा में लिख रहे हैं"। – hobbs

+0

इस बिंदु पर सी से कम नहीं है और कोरपी जैसे टूल का उपयोग करके पाइथन से असेंबली ऑपकोड को कॉल करने का कोई इरादा नहीं है। समय की आलोचना महत्वपूर्ण है, लेकिन मुझे एडा का उपयोग करने के लिए स्विच करना महत्वपूर्ण नहीं है। –

0

एक महत्वपूर्ण नोट: क्यूएनएक्स के लिए पायथन आमतौर पर केवल x86 के लिए उपलब्ध है।

मुझे यकीन है कि आप इसे पीपीसी और अन्य आर्कों के लिए संकलित कर सकते हैं, लेकिन यह बॉक्स से बाहर काम नहीं करेगा।

20

मैंने कई चक्र-पावर सॉफ्ट रीयल-टाइम (आरटी) सिस्टम बनाए हैं, प्राथमिक चक्र के समय 1 एमएस से 1 सेकंड तक।

  1. उपयोग सूत्रण/बहु केवल प्राथमिक धागा, और सहकारी जहां धागे के बीच कतारों स्वीकार्य हैं से गैर आर टी काम ऑफलोड करने के लिए: कुछ बुनियादी रणनीतियों और रणनीति मैं रास्ते सीखा है कर रहे हैं थ्रेडिंग संभव है (कोई preemptive धागे!)।

  2. जीआईएल से बचें। जिसका मूल रूप से न केवल थ्रेडिंग से परहेज करना है, बल्कि सिस्टम कॉल से बचने के लिए सबसे बड़ी सीमा तक, विशेष रूप से समय-महत्वपूर्ण संचालन के दौरान, जब तक कि वे गैर-अवरुद्ध न हों।

  3. व्यावहारिक होने पर सी मॉड्यूल का उपयोग करें। चीजें (आमतौर पर) सी के साथ तेजी से जाओ! लेकिन मुख्य रूप से यदि आपको अपना खुद का लिखना नहीं है: पायथन में रहें जब तक कि वास्तव में कोई विकल्प न हो। ऑप्टिमाइज़िंग सी मॉड्यूल प्रदर्शन एक पिटा है, खासकर जब पाइथन-सी इंटरफ़ेस में अनुवाद करना कोड का सबसे महंगा हिस्सा बन जाता है।

  4. अपने कोड को तेज़ करने के लिए पायथन त्वरक का उपयोग करें। मेरी पहली आरटी पायथन परियोजना साइको से बहुत लाभान्वित हुई (हाँ, मैं इसे थोड़ी देर कर रहा हूं)। एक कारण मैं पाइथन 2 के साथ रह रहा हूँ।एक्स आज पाईपी है: चीजें हमेशा एलएलवीएम के साथ तेजी से जाओ!

  5. व्यस्त समय की आवश्यकता होने पर व्यस्त प्रतीक्षा करने से डरो मत। वांछित समय पर 'sneak up' करने के लिए time.sleep() का उपयोग करें, फिर अंतिम 1-10 एमएस के दौरान व्यस्त-प्रतीक्षा करें। मैं 10 माइक्रोसॉन्ड के क्रम पर स्वयं-समय के साथ दोहराने योग्य प्रदर्शन प्राप्त करने में सक्षम हूं। सुनिश्चित करें कि आपका पायथन कार्य अधिकतम ओएस प्राथमिकता पर चलाया जाता है।

  6. बेवकूफ रॉक्स! यदि आप 'लाइव' एनालिटिक्स या आंकड़ों के टन कर रहे हैं, तो NO तरीका अधिक काम करने के लिए और कम काम (कम कोड, कम बग) के साथ Numpy का उपयोग करके किया जाता है। सी/सी ++ सहित किसी अन्य भाषा में मुझे पता नहीं है। यदि आपके अधिकांश कोड में नम्पी कॉल शामिल हैं, तो आप बहुत तेज़ होंगे। मैं पापी को पूरा करने के लिए Numpy बंदरगाह के लिए इंतजार नहीं कर सकता!

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

  8. सबसे बड़ी सीमा तक बैचों में प्रसंस्करण करने का प्रयास करें। इनपुट दर पर डेटा प्रोसेस करने के बजाय, आउटपुट दर पर डेटा को संसाधित करने का प्रयास करें, जो अक्सर धीमा होता है। बैचों में प्रसंस्करण उच्च स्तर के आंकड़ों को इकट्ठा करने के लिए और अधिक सुविधाजनक बनाता है।

  9. क्या मैंने पीपीपी का उपयोग करके उल्लेख किया था? खैर, यह दो बार उल्लेख करने लायक है।

आरटी विकास के लिए पायथन का उपयोग करने के कई अन्य लाभ हैं। उदाहरण के लिए, भले ही आप निश्चित रूप से निश्चित हैं कि आपकी लक्षित भाषा पाइथन नहीं हो सकती है, यह पाइथन में प्रोटोटाइप को विकसित और डिबग करने के लिए बड़े लाभ का भुगतान कर सकती है, फिर इसे अंतिम प्रणाली के लिए टेम्पलेट और परीक्षण टूल दोनों के रूप में उपयोग करें। मैं कई वर्षों से सिस्टम के "हार्ड पार्ट्स" के त्वरित प्रोटोटाइप बनाने के लिए पाइथन का उपयोग कर रहा था, और त्वरित 'गंदे परीक्षण जीयूआई बनाने के लिए। इस तरह मेरा पहला आरटी पायथन सिस्टम अस्तित्व में आया: प्रोटोटाइप (+ साइको) परीक्षण जीयूआई के साथ भी तेज था!

-BobC

संपादित करें: पार मंच लाभ का उल्लेख भूल: मेरी कोड काफी हर जगह एक साथ चलता है) नहीं रखता (या संकलक निर्भरता, या पार compilers के लिए की जरूरत है), और ख) लगभग कोई प्लेटफ़ॉर्म-निर्भर कोड (मुख्य रूप से फ़ाइल हैंडलिंग और सीरियल I/O जैसी विविध सामग्री के लिए)। मैं Win7-x86 पर विकसित कर सकता हूं और लिनक्स-एआरएम (या किसी अन्य पॉज़िक्स ओएस पर तैनात कर सकता हूं, जिनमें से सभी को पाइथन इन दिनों है)। पीईपीई मुख्य रूप से अब x86 है, लेकिन एआरएम पोर्ट अविश्वसनीय गति से विकसित हो रहा है।

+2

प्रश्न के लिए देर है लेकिन इस विस्तृत उत्तर के लिए धन्यवाद। मेरे लिए यह सबसे दिलचस्प हिस्सा था: _Careful कोडिंग लगभग सभी गतिशील स्मृति आवंटन को खत्म कर सकती है, इस मामले में आप पूरी तरह से जीसी_ अक्षम कर सकते हैं। क्या आप कृपया उस सावधानीपूर्वक कोडिंग भाग के बारे में कुछ उदाहरण दे सकते हैं? – pembeci

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