Di salah satu setup
atau 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.
programming
arduino-uno
asheeshr
sumber
sumber
NOP
pernyataan perakitan, yang hanya berhenti selama beberapa jam siklusJawaban:
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:
Pembongkaran di atas:
Perhatikan bahwa jika _exit tidak memanggil cli, interupsi akan dapat melakukan hal-hal. Tapi bukan itu masalahnya.
sumber
avr-objdump -S {compiled *.elf file}
menghasilkan file yang menyertakan kode C yang mengarah ke setiap bagian kode perakitan. Jauh lebih mudah diikuti.*.elf
dari 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.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.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.
sumber
exit(0)
instruksi dibongkar adalah (IIRC)__stop_program
,cli
dan spinlock. Saya ingin memverifikasi apakah itu benar dengan penjelasan tentang bagaimana kontrol dilewatkan yaitu panggilan stack pop ?, panggilan ISR?