Co się stanie, gdy wywołam exit () z mojego programu?


17

W którymkolwiek z nich setuplub loop, jeśli miałbym dodać exit(0)połączenie, gdzie przekazano by kontrolę? Jaki byłby następny stan mikrokontrolera? Czy zatrzymałoby to wykonywanie i wyłączanie?

Korzystam z wersji 2 Arduino Uno.


Myślę, że to się po prostu zatrzymuje. Nie wyłączyłby zegara ani prądu.
TheDoctor

Reszta pamięci powinna być wypełniona NOPinstrukcjami asemblera, które zatrzymują się na kilka cykli zegara
TheDoctor

Odpowiedzi:


12

Moje początkowe przypuszczenie jest błędne. Myślałem, że po prostu wróci z pętli, a biblioteka podstawowa po prostu ponownie wywoła loop (). Widzę jednak, że utworzono następujący kod. Zauważ, że __stop_program jest twardą pętlą ...

Wyciąg z wykazu Blink.ino z dodanym wyjściem (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);
}

Demontaż powyższego:

// 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>

Zauważ, że jeśli _exit nie wywołałby cli, przerwania byłyby w stanie robić różne rzeczy. Ale tak nie jest.


avr-objdump -S {compiled *.elf file}tworzy plik zawierający kod C prowadzący do każdej sekcji kodu asemblera. O wiele łatwiej jest śledzić.
Connor Wolf,

aaaa Właśnie próbowałem i nie wyświetla poprawnie wbudowanego kodu C dla funkcji pętli. Co do cholery?
Connor Wolf,

Whoa, bardzo dziwne. Skompilowałem projekt za pomocą Stino zamiast edytora arduino, zdekompilowałem go *.elf, a następnie otrzymuję odpowiednie symbole debugowania. Myślę, że edytor tekstu Arduino / makro-przycisk (odmawiam nazywania go IDE, ponieważ tak nie jest), usuwa informacje debugowania tylko ze skompilowanego głównego pliku C ++, z jakiegoś dziwnego i głupiego powodu.
Connor Wolf,

Tam jest wyjaśnienie, a jest to zrobić przy okazji kopii IDE pliki do tymczasowej lokalizacji. Można „naprawić”, że mówiąc AVR-objdump gdzie źródłem jest: avr-objdump -S -I/path/to/the/sketch/folder xxx.elf . To jest ścieżka do folderu szkicu , a nie sam plik .ino. Następnie powinieneś pobrać źródło C na zrzut.
Nick Gammon

11

Cóż, właśnie przetestowałem go z moim Arduino Uno i po prostu całkowicie zatrzymałem kod i zostawiłem wszystkie wyjścia takie, jakie były, gdy kod przestał działać (więc zostawił zapaloną diodę LED). Wydaje się, że nie ma czyszczenia IO, gdy wywołujesz exit. Tego się spodziewałem, ponieważ Arduino IDE zapewnia funkcje konfiguracji i pętli. Jeśli programujesz ATMEGA * 28 za pomocą dowolnego innego AVR IDE, zaczniesz od funkcji głównej, jak wszystkie programy C / C ++. Funkcje konfiguracji i pętli nie są standardowe w mikrokontrolerach AVR.

Uwaga: Naciśnięcie przycisku resetowania powoduje ponowne uruchomienie kodu, jeśli się zastanawiasz.


Dobrze wiedzieć. Szukałem czegoś bardziej szczegółowego i na niższym poziomie. Na wywołanie exit(0)zdemontowanego instrukcji są (IIRC) __stop_program, clioraz Spinlock. Chciałem sprawdzić, czy jest to poprawne, wyjaśniając, w jaki sposób przekazywana jest kontrola, tj. Pop stos wywołań pop?
asheeshr

Ach, cóż, nie szukałem arduino na tak niskim poziomie, aby uzyskać te informacje, możesz sprawdzić stronę internetową atmel.
Jesse Laning
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.