Bagaimana pengontrol tahu kapan harus melompat ke ISR?

12

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?

Swanand
sumber

Jawaban:

13

Apa yang Anda hilang adalah bahwa inti tidak melakukan lebih dari hanya menjalankan opcodes yang diambil dari memori. Ini memiliki logika khusus di dalamnya untuk mengimplementasikan interupsi.

Ketika perangkat keras deteksi interupsi menegaskan sinyal yang mengatakan sudah waktunya untuk mengambil interupsi, biasanya instruksi khusus dimasukkan ke dalam inti yang tidak pernah diambil dari memori. Dalam kebanyakan kasus, ini adalah instruksi PANGGILAN ke alamat vektor interupsi. Ini menggunakan mekanisme eksekusi instruksi yang ada untuk menyimpan PC saat ini ke tumpukan panggilan, dan mengubahnya ke alamat vektor interupsi. Ini juga berkaitan dengan membuang instruksi yang sudah diambil sebelumnya dan sejenisnya.

Logika pengambilan interupsi khusus juga harus menonaktifkan interupsi sedemikian rupa sehingga kondisi interupsi yang sama tidak menyebabkan panggilan lain ke alamat vektor interupsi siklus berikutnya. Prosesor yang berbeda memiliki cara penanganan yang berbeda pula. Yang paling sederhana adalah dengan hanya menonaktifkan interupsi secara gloablly, membutuhkan perangkat lunak untuk mengaktifkannya kembali di akhir rutinitas layanan interupsi. Prosesor lain memiliki tingkat prioritas interupsi. Level ini terbentur sehingga hanya kondisi gangguan dengan prioritas lebih tinggi yang dapat menyebabkan gangguan baru. Prioritas interupsi kemudian adalah sesuatu yang secara otomatis disimpan bersama dengan alamat pengirim CALL, dan dikembalikan ketika kode kembali dari interupsi.

Olin Lathrop
sumber
1
Seringkali, ini bukan CALLinstruksi biasa , karena interupsi diakhiri dengan cara yang berbeda (lih. RETVs. RETI).
glglgl
1
Dapatkah saya dengan aman berasumsi bahwa ketika perangkat keras deteksi interupsi menegaskan sinyal, Alih-alih Memori, CPU mendapat instruksi dari tempat lain untuk melompat ... Seperti Switch mungkin ... Ketika Switch OFF, Ambil instruksi dari Memory dan ketika switch ON , Jalankan instruksi ini?
Swanand
3

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 0ke 1(atau sebaliknya) jika beberapa ketentuan berlaku (misalnya perangkat ini menyelesaikan beberapa pekerjaan). Output ini terhubung ke pengontrol interupsi. The CoreCPU 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.

Eugene Sh.
sumber
2

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.

Michael Karas
sumber
2

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