जब मैं अपने कार्यक्रम से बाहर निकलता हूं तो क्या होता है?


17

दोनों में से किसी में setupया loop, अगर मैं एक जोड़ने के लिए थे exit(0)कॉल, जहां के लिए पारित किया जा नियंत्रण चाहते हैं? माइक्रोकंट्रोलर की अगली स्थिति क्या होगी? क्या यह निष्पादन और शक्ति को रोक देगा?

मैं एक संशोधन 2 Arduino Uno का उपयोग कर रहा हूं।


मुझे लगता है कि यह बस बंद हो जाता है। यह घड़ी को बंद नहीं करेगा, या बिजली को नीचे नहीं करेगा।
TheDoctor

स्मृति के बाकी हिस्सों को NOPविधानसभा के बयानों से भरा होना चाहिए , जो सिर्फ एक जोड़ी घड़ी चक्र के लिए रुकते हैं
TheDoctor

जवाबों:


12

मेरा शुरुआती अनुमान गलत है। मैंने सोचा होगा कि यह बस लूप से वापस आ जाएगी और कोर लाइब्रेरी सिर्फ लूप () को फिर से कॉल करेगी। हालाँकि, मुझे लगता है कि निम्नलिखित कोड बनाया गया था। यह देखते हुए कि __stop_program एक कठिन लूप है ...

बाहर निकलने के साथ Blink.ino की लिस्टिंग का एक उद्धरण (0) जोड़ा गया:

// the loop routine runs over and over again forever:
void loop() {
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);               // wait for a second
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);               // wait for a second
  exit(0);
}

उपरोक्त की गड़बड़ी:

// the loop routine runs over and over again forever:
void loop() {
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
 100:   80 91 00 01     lds r24, 0x0100
 104:   61 e0           ldi r22, 0x01   ; 1
 106:   0e 94 ca 01     call    0x394   ; 0x394 <digitalWrite>
  delay(1000);               // wait for a second
 10a:   68 ee           ldi r22, 0xE8   ; 232
 10c:   73 e0           ldi r23, 0x03   ; 3
 10e:   80 e0           ldi r24, 0x00   ; 0
 110:   90 e0           ldi r25, 0x00   ; 0
 112:   0e 94 f7 00     call    0x1ee   ; 0x1ee <delay>
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
 116:   80 91 00 01     lds r24, 0x0100
 11a:   60 e0           ldi r22, 0x00   ; 0
 11c:   0e 94 ca 01     call    0x394   ; 0x394 <digitalWrite>
  delay(1000);               // wait for a second
 120:   68 ee           ldi r22, 0xE8   ; 232
 122:   73 e0           ldi r23, 0x03   ; 3
 124:   80 e0           ldi r24, 0x00   ; 0
 126:   90 e0           ldi r25, 0x00   ; 0
 128:   0e 94 f7 00     call    0x1ee   ; 0x1ee <delay>
  exit(0);
 12c:   80 e0           ldi r24, 0x00   ; 0
 12e:   90 e0           ldi r25, 0x00   ; 0
 130:   0e 94 1e 02     call    0x43c   ; 0x43c <_exit>

...

0000043c <_exit>:
 43c:   f8 94           cli

0000043e <__stop_program>:
 43e:   ff cf           rjmp    .-2         ; 0x43e <__stop_program>

ध्यान दें कि अगर _exit ने cli को नहीं बुलाया है, तो इंटरप्ट सामान करने में सक्षम होगा। लेकिन मामला वह नहीं है।


avr-objdump -S {compiled *.elf file}एक फ़ाइल का निर्माण करता है जिसमें C कोड शामिल होता है जो असेंबली कोड के प्रत्येक अनुभाग तक ले जाता है। इसका पालन करना बहुत आसान है।
कॉनर वुल्फ

मैं सिर्फ यह कोशिश की, और यह सही ढंग से इनलाइन लूप फंक्शन के लिए इनलाइन सी नहीं है। क्या बकवास है?
कॉनर वुल्फ

वाह, बेहद अजीब। मैंने Arduino एडिटर के बजाय स्टेनो के साथ प्रोजेक्ट को संकलित किया , उस *.elfसे विघटित हो गया , और फिर मुझे उचित डीबगिंग प्रतीक मिले। मुझे लगता है कि Arduino पाठ संपादक / बटन-मैक्रो (मैं इसे एक IDE कॉल करने के लिए यह नहीं है के बाद से मना कर दिया) बात से डिबग जानकारी अलग करना है बस कुछ विचित्र और बेवकूफ कारण के लिए, संकलित मुख्य सी ++ फ़ाइल।
कॉनर वुल्फ

वहाँ है एक व्याख्या है, और यह एक अस्थायी स्थान के लिए आईडीई प्रतियां अपनी फ़ाइलें रास्ते से कोई लेना देना है। आप avr-objdump जहाँ स्रोत है बताकर "ठीक" कर सकते हैं avr-objdump -S -I/path/to/the/sketch/folder xxx.elf । यह स्केच फ़ोल्डर पथ है , न कि .ino फ़ाइल ही। फिर आपको डंप में सी स्रोत मिलना चाहिए।
निक गैमन

11

खैर मैंने अभी अपने Arduino Uno के साथ इसका परीक्षण किया और इसने कोड को पूरी तरह से रोक दिया और सभी आउटपुट छोड़ दिए क्योंकि वे कोड चलने बंद हो गए थे (इसलिए इसने एक LED को चालू रखा था)। जब आप बाहर निकलते हैं तो IO सफाई नहीं होती है। अगर मैं Arduino IDE सेटअप और लूप फ़ंक्शंस प्रदान करता हूं, तो मैंने यही अपेक्षा की थी, यदि आप ATMEGA * 28 को किसी अन्य AVR IDE के साथ प्रोग्राम करते हैं जो आप सभी C / C ++ प्रोग्राम्स जैसे मुख्य फ़ंक्शन के साथ शुरू करते हैं। AVR MCU पर सेटअप और लूप फ़ंक्शन मानक नहीं हैं।

नोट: रीसेट बटन का प्रेस कोड को पुनरारंभ करता है, यदि आप सोच रहे थे।


जानकार अच्छा लगा। मैं कुछ अधिक विस्तृत और निचले स्तर पर देख रहा था । कॉल exit(0)करने पर डिसएम्बल्ड निर्देश (IIRC) __stop_program, cliऔर एक स्पिनलॉक हैं। मैं यह सत्यापित करना चाहता था कि नियंत्रण कैसे पास होता है या कॉल स्टैक पॉप ?, ISR कॉल के स्पष्टीकरण के साथ सही है?
एशेशर

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