Apa yang terjadi ketika saya memanggil exit () dari program saya?

17

Di salah satu setupatau loop, jika saya menambahkan exit(0)panggilan, di mana kontrol akan diteruskan? Bagaimana keadaan mikrokontroler selanjutnya? Apakah ini akan menghentikan eksekusi dan mematikan daya?

Saya menggunakan revisi 2 Arduino Uno.

asheeshr
sumber
Saya pikir itu hanya berhenti. Itu tidak akan mematikan jam, atau mematikan.
TheDoctor
Sisa memori harus diisi dengan NOPpernyataan perakitan, yang hanya berhenti selama beberapa jam siklus
TheDoctor

Jawaban:

12

Dugaan awal saya salah. Saya akan berpikir itu hanya akan kembali dari loop dan perpustakaan inti hanya akan memanggil loop () lagi. Namun, saya melihat kode berikut ini dibuat. Memperhatikan bahwa __stop_program adalah hard loop ...

Ekstrak daftar Blink.ino, dengan keluar (0) ditambahkan:

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

Pembongkaran di atas:

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

Perhatikan bahwa jika _exit tidak memanggil cli, interupsi akan dapat melakukan hal-hal. Tapi bukan itu masalahnya.

mpflaga
sumber
avr-objdump -S {compiled *.elf file}menghasilkan file yang menyertakan kode C yang mengarah ke setiap bagian kode perakitan. Jauh lebih mudah diikuti.
Connor Wolf
aaa dan saya baru saja mencobanya, dan itu tidak benar memancarkan kode C inline untuk fungsi loop. Apa apaan?
Connor Wolf
Wah, sangat aneh. Saya mengkompilasi proyek dengan Stino daripada editor arduino, mendekompilasi *.elfdari itu, dan kemudian saya mendapatkan simbol debugging yang tepat. Saya pikir teks-editor / tombol-makro Arduino (saya menolak untuk menyebutnya IDE karena tidak) hal menanggalkan info debug hanya dari file C ++ utama yang dikompilasi, untuk beberapa alasan aneh dan bodoh.
Connor Wolf
Ada adalah penjelasan, dan itu harus dilakukan dengan cara salinan IDE file ke lokasi sementara. Anda bisa "memperbaiki" itu dengan mengatakan avr-objdump mana sumbernya adalah: avr-objdump -S -I/path/to/the/sketch/folder xxx.elf . Itu adalah path folder sketsa , bukan file .ino itu sendiri. Maka Anda harus mendapatkan sumber C di tempat sampah.
Nick Gammon
11

Yah saya baru saja mengujinya dengan Arduino Uno saya dan itu benar-benar menghentikan kode dan meninggalkan semua output seperti ketika kode berhenti berjalan (sehingga meninggalkan LED saya menyala). Tampaknya tidak ada pembersihan IO saat Anda memanggil keluar. Ini yang saya harapkan karena Arduino IDE menyediakan fungsi pengaturan dan loop, jika Anda memprogram ATMEGA * 28 dengan AVR IDE lain, Anda mulai dengan fungsi utama seperti semua program C / C ++. Pengaturan dan fungsi loop tidak standar pada AVR MCU.

Catatan: Tekan tombol reset me-restart kode, jika Anda bertanya-tanya.

Jesse Laning
sumber
Senang mendengarnya. Saya mencari sesuatu yang lebih rinci dan pada tingkat yang lebih rendah. Pada panggilan exit(0)instruksi dibongkar adalah (IIRC) __stop_program, clidan spinlock. Saya ingin memverifikasi apakah itu benar dengan penjelasan tentang bagaimana kontrol dilewatkan yaitu panggilan stack pop ?, panggilan ISR?
asheeshr
Ah, well, saya belum melihat arduino pada tingkat rendah, untuk informasi yang Anda mungkin ingin memeriksa situs web atmel.
Jesse Laning