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:
- Selesaikan instruksi saat ini.
- Nonaktifkan bendera interupsi global.
- Dorong alamat instruksi berikutnya pada tumpukan.
- Salin alamat dalam vektor interupsi yang benar (sesuai dengan interupsi yang terjadi) ke penghitung program.
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.
- Jalankan kode kerja ISR.
Sekarang kita sudah selesai dan ingin kembali dari interupsi. Pertama-tama kita harus melakukan pembersihan perangkat lunak.
- Pop register CPU yang kami dorong di langkah 6.
- Pop nilai status yang disimpan kembali ke register status. Setelah ini, kita harus berhati-hati untuk tidak menjalankan instruksi yang dapat mengubah register status.
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.