Arduino में एक बार के निष्पादन के लिए कोड


12

प्रश्न: अगर मैं चाहता हूं कि यह केवल एक बार Arduino स्टार्टअप के अनुसार निष्पादित हो तो मैं कोड कहां रखूं?

पृष्ठभूमि: मैं अपने Arduino का उपयोग उन कार्यों को करने के लिए करता हूं, जिन्हें शक्ति चक्र के अनुसार एक बार निष्पादित किया जाना चाहिए। (उदाहरण के लिए, मेरे रोबोट को केवल हर बार एक बार ड्राइव करना चाहिए जब मैं इसे चालू करता हूं - इससे अधिक, और यह तालिका से गिर सकता है।)

मानक Arduino IDE "टेम्पलेट" में एक loop()और एक setup()फ़ंक्शन होता है। setupकोड शक्ति चक्र के अनुसार एक बार चलाया जाता है, और loopहर बार इसके समाप्त होने को फिर से शुरू कर दिया है।

मुझे "1 समय कार्यों" कोड के लिए दो दृष्टिकोण दिखाई देते हैं:

विधि 1: "एक बार लूप"

void setup() {
  //do setup stuff
}

void loop() {
  //do task

  while(1) ; //Repeat forever, preventing function from re-starting
}

विधि 2: "केवल सेटअप"

void setup() {
  //do setup stuff

  //do task
}

void loop() {
  //do nothing
}

प्रश्न का अधिक विस्तृत रूप: क्या इन विधियों में से एक हार्डवेयर / सॉफ्टवेयर अर्थों से "बेहतर" है? (जैसे कि setupफ़ंक्शन के बारे में कुछ भी "विशेष" है , जैसे कि यह केवल इतने समय तक चल सकता है?)
और, यदि वे हार्डवेयर / सॉफ्टवेयर के नजरिए से समान हैं, तो क्या "सर्वोत्तम अभ्यास" या कोड लिखने का मानक तरीका है Arduino समुदाय में इन स्थितियों के लिए?


में से कुछ का उपयोग करें exitआदेश में चर्चा की है arduino.stackexchange.com/questions/188/...
TheDoctor

जवाबों:


13

मैं आपके सवाल से उलझन में हूँ। आप पूछते हैं कि आप एक बार-प्रति-स्टार्टअप सेटअप फ़ंक्शन कहाँ रखना चाहते हैं, और फिर सेटअप फ़ंक्शन पर चर्चा करें। यही सेटअप फ़ंक्शन के लिए है।

जैसे, एक बार की सेटअप कार्यक्षमता सेटअप फ़ंक्शन में जाती है।

FWIW, यदि आप उस फ़ाइल को देखते हैं जो कॉल करती है setupऔर loopकार्य करती है:

#include <Arduino.h>

int main(void)
{
    init();

#if defined(USBCON)
    USBDevice.attach();
#endif

    setup();
    for (;;) {
        loop();
        if (serialEventRun) serialEventRun();
    }
    return 0;
}

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

नोट:
if (serialEventRun) serialEventRun();आपको एक फ़ंक्शन को संलग्न करने की अनुमति देने की सुविधा प्रतीत होती है जिसे सीरियल डेटा के रिसेप्शन पर कहा जाता है, लेकिन यदि आप void serialEvent(){}अपने कोड में फ़ंक्शन को परिभाषित नहीं करते हैं , तो यह पूरी तरह से संकलित करेगा और उत्पादित मशीन कोड में मौजूद नहीं होगा।


यह ऐसा जवाब स्वीकार करने में अजीब लगता है जो सबसे ज्यादा मत दिया गया (अभी तक) नहीं है। लेकिन, main()फंक्शन की परिभाषा देखना मेरे सवाल के लिए मददगार था। (और, आप setupइसके बजाय समूह के साथ सहमति का संकेत देते हैं loop)। आपके सहयोग के लिए धन्यवाद।
एपनॉर्टन

1
@anorton - जब संदेह होता है, तो कवर के नीचे देखें। मुझे आर्डूइन प्लेटफॉर्म प्रोटोटाइप के लिए सुविधाजनक लगता है, लेकिन यह काफी हद तक सिर्फ बॉयलरप्लेट कोड है। यह समझना कि यह क्या कर रहा है, यह तय करने में काफी मददगार हो सकता है कि किसी चीज़ को कैसे आर्किटेक्ट किया जाए।
कॉनर वुल्फ

6

मैं आमतौर पर मेथड 2 के साथ जाता हूं, लेकिन ऐसा करते हुए अंत में:

void setup() {
  //do setup stuff

  //do task
  init(); //Do start-up initialization steps
}

void init() {
  // do tasks on startup
}

void loop() {
  //do looping code
}

उपरोक्त सेटअप के साथ यह मेरे कोड को और भी व्यवस्थित करने की अनुमति देता है।


अब तक का सबसे अच्छा जवाब +1, धन्यवाद दोस्त आपने मुझे बचा लिया!
काइल

5

मैं दृढ़ता से विधि 2 को पसंद करूंगा। यदि आप कभी भी इनपुट, आउटपुट आदि को संभालने के लिए कोड जोड़ने की योजना बनाते हैं, तो यह विधि 2 के साथ आसान है - बस भरें loop(), लेकिन विधि 1 में पुनर्मूल्यांकन / रीफैक्टरिंग की आवश्यकता होती है।


3

सेटअप फ़ंक्शन पर कोई समय सीमा नहीं है। मैं विधि 2 को पसंद करता हूं क्योंकि लूप को बाद में आपको जो कुछ भी चाहिए, उससे भरा जा सकता है।


1

निश्चित रूप से विधि दो के साथ जाओ। यही सेटअप फ़ंक्शन के लिए है। साथ ही पढ़ना बहुत आसान है। loop()तात्पर्य कुछ भी हो यह एक लूप में चलाया जाएगा।


0

अधिकांश अन्य उत्तर के रूप में, मैं विधि 2 के लिए जाऊंगा।

लेकिन मैं Arduino लाइब्रेरी द्वारा कॉल से बचने की कोशिश करूंगा, खाली करने के लिए जो loop()Atmel को बहुत अधिक मात्रा में "कुछ भी नहीं" का उपभोग करता है।

संपादित करें:

हालांकि कुछ टिप्पणियों में बताया गया है कि उपयोग करने से बिजली की खपत delay()में loop()कोई बदलाव नहीं होगा।

इसलिए, यदि आप एक बार setup()दौड़ने के बाद बिजली की खपत कम करना चाहते हैं, तो आपको एटम स्लीप मोड के साथ खेलना होगा। आप इस लेख पर एक नज़र डाल सकते हैं जो दिखाता है कि आपके Arduino स्केच से स्लीप मोड से कैसे निपटना है; यह सिर्फ सोने के लिए Atmel डाल से अधिक है, लेकिन यह एक अच्छा (और सरल) पढ़ा है अगर आप नींद मोड के साथ खेलना चाहते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.