Cosa succede quando chiamo exit () dal mio programma?


17

In entrambi setupo loop, se dovessi aggiungere una exit(0)chiamata, dove passerebbe il controllo? Quale sarebbe il prossimo stato del microcontrollore? Smetterebbe di eseguire e spegnere?

Sto usando una revisione 2 Arduino Uno.


Penso che si fermi. Non spegnerebbe l'orologio, né si spegnerebbe.
TheDoctor

Il resto della memoria dovrebbe essere riempito con NOPle istruzioni di assemblaggio, che si fermano solo per un paio di cicli di clock
TheDoctor

Risposte:


12

La mia ipotesi iniziale è sbagliata. Avrei pensato che sarebbe semplicemente tornato dal loop e la libreria principale avrebbe semplicemente richiamato loop (). Tuttavia, vedo che è stato creato il seguente codice. Notando che __stop_program è un hard loop ...

Un estratto dell'elenco di Blink.ino, con exit (0) aggiunto:

// 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);
}

Lo smontaggio di quanto sopra:

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

Nota che se _exit non avesse chiamato cli, gli interrupt sarebbero in grado di fare cose. Ma non è così.


avr-objdump -S {compiled *.elf file}produce un file che include il codice C che porta a ciascuna sezione del codice assembly. È molto più facile da seguire.
Connor Wolf,

aaae l'ho appena provato e non emette correttamente il codice C in linea per la funzione loop. Che diavolo?
Connor Wolf,

Whoa, estremamente strano. Ho compilato il progetto con Stino invece dell'editor arduino, ho decompilato *.elfda quello e poi ho ottenuto i simboli di debug corretti. Penso che l'editor di testo / button-macro di Arduino (mi rifiuto di chiamarlo IDE poiché non lo è) cosa sta togliendo le informazioni di debug dal solo file C ++ principale compilato, per qualche ragione bizzarra e stupida.
Connor Wolf,

V'è una spiegazione, ed è a che fare con il modo in cui le copie IDE i file in una posizione temporanea. È possibile "fix" che raccontando AVR-objdump in cui la fonte è: avr-objdump -S -I/path/to/the/sketch/folder xxx.elf . Questo è il percorso della cartella di schizzo , non il file .ino stesso. Quindi dovresti ottenere la sorgente C nel dump.
Nick Gammon

11

Beh, l'ho appena testato con il mio Arduino Uno e ha fermato completamente il codice e lasciato tutte le uscite com'erano quando il codice ha smesso di funzionare (quindi ha lasciato acceso un LED che avevo acceso). Sembra che non ci sia una pulizia dell'IO quando si chiama exit. Questo era quello che mi aspettavo perché l'IDE Arduino fornisce le funzioni di configurazione e loop, se si programma ATMEGA * 28 con qualsiasi altro IDE AVR si inizia con la funzione principale come tutti i programmi C / C ++. Le funzioni di configurazione e loop non sono standard nelle MCU AVR.

Nota: la pressione del pulsante di ripristino riavvia il codice, se lo stavi chiedendo.


Buono a sapersi. Stavo cercando qualcosa di più dettagliato e di livello inferiore . A chiamare exit(0)le istruzioni smontati sono (IIRC) __stop_program, clie uno spinlock. Volevo verificare se ciò è corretto con una spiegazione di come viene passato il controllo, ad esempio pop stack di chiamate ?, Chiamata ISR?
asheeshr,

Ah, beh, non ho esaminato Arduino a un livello così basso, per quelle informazioni che potresti voler controllare sul sito web Atmel.
Jesse Laning,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.