(Khusus untuk Uno Arduino ...)
Apa yang terjadi pada stack ketika interupsi terjadi pada mikrokontroler AVR dan saya memanggil suatu fungsi? Apakah kompiler memasukkan kode? Apakah itu menumpuk tumpukan di suatu tempat dan kemudian mengatur ulang penunjuk tumpukan? Apakah ada tumpukan sekunder hanya untuk interupsi?
Seperti yang saya mengerti, vektor untuk interupsi adalah perintah GOTO langsung dalam perakitan. Juga, saya tidak berpikir bahwa mikrokontroler akan secara otomatis mengacaukan tumpukan, jadi mungkin dibiarkan sendiri. Namun, itu masih belum menjelaskan bagaimana fungsi bekerja selama ISR.
arduino
interrupts
compiler
Penguin Anonim
sumber
sumber
Jawaban:
AVR adalah arsitektur RISC, sehingga memiliki penanganan hardware yang cukup mendasar dari interupsi. Sebagian besar prosesor mengacaukan tumpukan selama interupsi, meskipun ada beberapa, terutama ARM dan PowerPC, yang menggunakan metode berbeda.
Bagaimanapun, inilah yang AVR lakukan untuk interupsi:
Ketika interupsi terjadi, perangkat keras prosesor melakukan langkah-langkah ini, yang bukan hanya GOTO sederhana:
Sekarang pada titik ini, perangkat keras telah melakukan semua yang harus dilakukan. Perangkat lunak harus ditulis dengan benar untuk tidak merusak barang-barang. Biasanya, langkah selanjutnya adalah di sepanjang garis ini.
Dorong register status ke tumpukan. (Ini harus dilakukan terlebih dahulu sebelum diubah).
Dorong register CPU apa pun yang akan (atau mungkin) diubah ke tumpukan. Register mana yang perlu disimpan dengan cara ini ditentukan oleh model pemrograman. Model pemrograman didefinisikan oleh kompiler.
Sekarang kode interupsi yang berfungsi dapat dijalankan. Untuk menjawab kasus dalam pertanyaan memanggil fungsi, ia hanya melakukan apa yang selalu dilakukannya, mendorong nilai kembali pada tumpukan, lalu mengembalikannya setelah selesai. Ini tidak memengaruhi semua nilai sebelumnya yang kami simpan di tumpukan hingga sekarang.
Sekarang kita sudah selesai dan ingin kembali dari interupsi. Pertama-tama kita harus melakukan pembersihan perangkat lunak.
Jalankan instruksi RTI. Perangkat keras melakukan langkah-langkah ini untuk instruksi ini:
Sebuah. Aktifkan bendera interupsi global. (Perhatikan bahwa setidaknya satu instruksi harus dijalankan sebelum interupsi berikutnya dihormati. Ini mencegah interupsi berat dari sepenuhnya memblokir pekerjaan latar belakang.)
b. Pop alamat kembali yang disimpan ke dalam PC.
Sekarang kita kembali ke kode normal.
Perhatikan bahwa ada beberapa poin di mana kita harus sangat berhati-hati, terutama di sekitar register status dan register simpanan yang bisa diubah. Untungnya jika Anda menggunakan kompiler C, semua ini ditangani di bawah selimut.
Anda juga harus memperhatikan kedalaman tumpukan Anda. Kapan saja interupsi diaktifkan, ISR dapat menggunakan lebih banyak stack daripada yang terlihat jelas dengan melihat kode lokal. Tentu saja, ini benar-benar tidak muncul banyak kecuali Anda mendorong ingatan Anda hingga batasnya.
Berikut ini tautan yang menjelaskan proses ini jika Anda menginginkan referensi.
sumber
ISR_NAKED
). Ini bisa membuat Anda melewatkan langkah 5,6,8,9, dalam konteks di mana Anda benar - benar membutuhkan siklus itu. Kelemahannya adalah Anda harus benar - benar yakin Anda akan mempertahankan register yang relevan, atau dapat menimpa mereka tanpa membahayakan.