Saya berbicara tentang hal-hal di tingkat inti.
Sejauh yang saya mengerti, inti controller hanya menjalankan instruksi yang diambil dari memori (Fetch - Decode - Execute). Ketika Interrupt tiba, bagaimana core / ALU memutuskan untuk melompat ke ISR?
Karena kita, atau penyusun, tidak menambahkan instruksi apa pun untuk memilih status interupsi - lalu bagaimana ia tahu bahwa interupsi perlu dilayani?
sumber
CALL
instruksi biasa , karena interupsi diakhiri dengan cara yang berbeda (lih.RET
Vs.RETI
).Umumnya dalam mikrokontroler modern ada unit Interrupt Controller (IC) khusus yang bertugas mengelola interupsi. Selain itu masing-masing komponen perangkat memiliki output interrupt (s) yang pergi dari
0
ke1
(atau sebaliknya) jika beberapa ketentuan berlaku (misalnya perangkat ini menyelesaikan beberapa pekerjaan). Output ini terhubung ke pengontrol interupsi. TheCore
CPU dapat memberitahu IC baik untuk mengabaikan interupsi khusus ini (menutupinya) atau untuk memberitahu MCU setiap kali hal itu terjadi dengan memicu sinyal tertentu, dan kemudian MCU memutuskan apa yang harus dilakukan dengan itu. Cara yang umum adalah memiliki IC untuk memberitahukan ke MCU mana interupsi terjadi dan melompat ke kode penanganan yang sesuai.sumber
Ada perangkat keras di inti komputer yang memasukkan nilai baru ke program counter yang sesuai dengan interupsi tertentu yang telah dipicu. Untuk mengingat kembali ke mana setelah rutinitas interupsi selesai, nilai saat ini di penghitung program didorong ke dalam tumpukan sebelum perangkat keras memasukkan alamat interupsi ke penghitung program. Ketika rutin interupsi selesai, nilai asli dari penghitung program dikembalikan kembali dari tumpukan.
Nilai yang dimasukkan ke penghitung program pada waktu interupsi biasanya ditentukan oleh salah satu dari dua skema. Satu pendekatan macet alamat tetap untuk setiap jenis interupsi ke penghitung program dan inti komputer kemudian mulai mengeksekusi dari lokasi tetap itu. Ruang di lokasi tetap sering dalam ukuran terbatas sehingga biasanya untuk kode instruksi lompatan di alamat tetap yang pergi ke lokasi layanan interupsi yang sebenarnya. Skema lain menggunakan sesuatu yang disebut tabel vektor interrupt. Di sini perangkat keras menghasilkan offset alamat tetap ke tabel vektor berdasarkan jenis interupsi. Perangkat keras kemudian mengeluarkan konten di lokasi tabel itu dan menggunakan nilai itu sebagai alamat untuk masuk ke penghitung program.
sumber
Pengontrol memiliki register untuk penghitung program yang melacak alamat tempat menyimpan instruksi yang akan dieksekusi selanjutnya. (Register ini juga ditulis ketika lompatan dieksekusi.)
Pengontrol memiliki vektor interupsi (atau kadang-kadang lebih dari satu, tergantung pada jenis interupsi), yang merupakan alamat tempat penyimpanan ISR. Alamat ini selalu sama - ini seperti reset vektor, tempat program dimulai.
(Seringkali, ada instruksi lompatan yang disimpan pada vektor ini yang melompat ke kode aktual untuk dieksekusi, karena ruang pada vektor tidak cukup untuk menyimpan seluruh prosedur. Namun, yang penting adalah bahwa ISR selalu terletak pada saat yang sama posisi.)
Ketika interupsi terjadi, ada beberapa perangkat keras khusus di controller yang menulis penghitung program dengan vektor interupsi. Kemudian, ketika controller mencapai siklus instruksi berikutnya, ia mengambil instruksi dari alamat yang ditunjuk oleh penghitung program (jadi, vektor interupsi).
(Dalam satu siklus instruksi controller ada tugas yang berbeda yang dilakukannya: ia mengambil instruksi berikutnya dari alamat yang ditunjuk oleh penghitung program; ia meningkatkan penghitung program; ia menerjemahkan instruksi, dan menjalankannya.)
sumber