Arduino स्केच में अतुल्यकालिक फ़ंक्शन कॉल


14

एक Arduino स्केच में, लूप के भीतर अतुल्यकालिक फ़ंक्शन कॉल करने का एक तरीका है? जैसे http सर्वर के माध्यम से अनुरोधों को सुनना और उन्हें गैर-अवरुद्ध तरीके से संसाधित करना ।


1
यदि आप C ++ शुरुआती नहीं हैं, तो आप कोसा लाइब्रेरी ( github.com/mikaelpatel/nosa ) पर एक नज़र डाल सकते हैं । यह Arduino लाइब्रेरी का एक पूर्ण पुनर्लेखन है जो इसे बेहतर बनाता है: OOP और आम तौर पर बाधित-संचालित। मुझे लगता है कि वे HTTP का समर्थन करते हैं, लेकिन मैंने अभी तक उस हिस्से की जाँच नहीं की है।
jfpoilpret

जवाबों:


11

हां और ना। आप थोड़े अस्पष्ट हैं जो आप करना चाहते हैं। मैंने इसे कुछ अलग-अलग वर्गों में बनाया है (मुख्य रूप से सेंसर डेटा को पढ़ने पर ध्यान केंद्रित किया गया है ... यह सब कुछ पर लागू होता है लेकिन यह वह संदर्भ है जिसका मैं उपयोग कर रहा हूं):

धागे

AFAIK सभी Arduinos का केवल एक ही कोर है (वे एक बार में एक काम कर सकते हैं)। अधिकांश Arduino बोर्डों के लिए, हार्डवेयर मल्टीथ्रेडिंग समर्थित नहीं है। हालांकि, सॉफ्टवेयर को मल्टीथ्रेडिंग लागू करने के तरीके हैं । AsheeshR द्वारा दृष्टिकोण उन कार्यों के लिए अच्छी तरह से काम नहीं करेगा, जिन्हें पूरा करने में लंबा समय लगता है (यानी पुस्तकालय में कुछ ऐसा है जो थोड़ी देर या देरी से लेता है) क्योंकि यह उन निर्देशों से जाम हो जाता है, लेकिन यह कम समय के लिए अच्छा काम करेगा जैसे कार्य pinMode()। वहाँ सूचीबद्ध प्रोटॉथ्रेड्स लाइब्रेरी इस पर बेहतर हो सकती है, लेकिन मुझे वास्तव में नहीं पता है।

HTTP पर इसे ऑर्केस्ट्रेट करना मुश्किल होगा, खासकर जब से आपको बनाना होगा

देरी

स्केच से स्टाल के लिए एक सामान्य तरीका देरी का उपयोग है। इसे मुख्य लूप में, एक if स्टेटमेंट और millis()फंक्शन जो एक बार लौटता है (घड़ी का समय नहीं, बल्कि Arduino शुरू होने के बाद का समय है) का उपयोग करके हल किया जा सकता है । आप लूप के भीतर एक पाश भी कर सकते हैं सेंसर डेटा को प्रदूषित करने के लिए।

millis()दृष्टिकोण चीजें हैं जो स्टाल करने के लिए पूरे कार्यक्रम के कारण के साथ अच्छी तरह से काम नहीं होगा (यानी अधिक देरी या छोरों कि पिछली बार की एक ध्यान देने योग्य राशि)। ध्यान दें कि 100ms IIRC एक यूआई नहीं लग रहा है बनाने के लिए सामान्य अधिकतम समय है।

बीच में आता है

व्यवधान लगभग अतुल्यकालिक चीजों को रखने का एक शानदार तरीका है। वे हर बार पिन स्थिति में परिवर्तन के लिए एक छोटा सा कोड (जो आप निर्दिष्ट करते हैं) चलाते हैं। यह से टूट जाता है loop(), और वापस चला जाता है, जहां यह " ISR " चला गया है। मेरे पास यह बताने के लिए अधिक समय नहीं है कि यह कैसे किया जाए, लेकिन एक त्वरित Google खोज बहुत सारे परिणाम देगी।


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


3

मैंने दूसरे दिन खेल के मैदान पर एक कार्य शेड्यूलर के लिए कुछ कोड पोस्ट किया , आप एक झांकना चाहते हैं, हो सकता है कि आप इसे अपनी आवश्यकताओं के लिए अनुकूलित कर सकें।

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

इसके अलावा टिमरने की जाँच करें (यह शायद बेहतर है;)


TimerOne एक बुरा विचार है क्योंकि यह केवल avr- आधारित arduinos के साथ काम करता है। उदाहरण के लिए मेरा वेमोस डी 1 आर 1 काम नहीं करता है
व्यचास्लाव गेर्चिकोव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.