Di mana pun saya mencari tentang implementasi praktis interupsi berbasis level, saya hanya menemukan satu saran yang diberikan orang yaitu menonaktifkan interupsi begitu memasuki ISR sehingga tidak terus memicu kembali.
Hal lain yang saya baca adalah bahwa ia digunakan untuk membuat loop yaitu selama ada interupsi, melayani ISR, tetapi itu bisa dicapai dengan a while
atau do while
loop.
Dan keuntungan yang bisa diberikan oleh gangguan level level mungkin adalah kemewahan untuk menjalankan satu instruksi program utama di antara melayani ISR dan latensi. Saya tebak.
Jadi, apakah ada sesuatu yang saya lewatkan ketika datang untuk memahami level edge interrupt?
Sebuah jawaban yang bagus akan menunjukkan kepada saya semacam penggunaan praktis interupsi berbasis level.
sumber
Jawaban:
Interupsi berbasis level dapat dengan aman dibagikan dan mengalir dengan mudah dan andal; sebaliknya, berbagi interupsi yang dipicu dengan andal seringkali sulit dan terkadang tidak mungkin.
Saat menggunakan interupsi berbasis level, seorang interrupt handler dapat dengan mudah meminta setiap sumber interupsi yang memungkinkan pada gilirannya "Apakah Anda perlu perhatian", dan layani jika demikian. Setelah selesai, pawang dapat kembali. Jika sumber interupsi yang disurvei di awal urutan memutuskan perlu perhatian sementara sumber kemudian sedang dilayani, prosesor akan melihat bahwa pin IRQ masih aktif dan memicu kembali pengendali interupsi, sehingga memungkinkan interrupt yang datang terlambat untuk dilayani.
Saat menggunakan interupsi yang dipicu oleh tepi yang tidak bertingkat, hal-hal menjadi lebih rumit. Setelah interrupt handler melewati dan melayani semua orang, maka harus melalui dan menyurvei ulang semua orang untuk mengetahui apakah perangkat yang sebelumnya disurvei telah memutuskan bahwa ia membutuhkan layanan. Hanya setelah setiap perangkat secara berturut-turut melaporkan bahwa ia tidak memerlukan layanan maka aman bagi interupsi untuk kembali. Perhatikan bahwa jika perangkat yang menginginkan layanan menjaga indikasi "membutuhkan layanan" mereka aktif, kembali dari penangan interupsi pada saat suatu perangkat membutuhkan layanan dapat menjadikan interupsi itu tidak berguna secara permanen.
Mungkin berguna untuk pin I / O untuk memiliki beberapa logika edge-capture yang, ketika sebuah edge tiba, menetapkan kait dan menampilkan indikasi "perlu-layanan" sampai perangkat lunak membersihkannya. Hal seperti itu mungkin muncul di ujung paling depan sebagai gangguan tepi-sensitif. Namun, pada titik hilir mana pun, lebih baik memiliki permintaan logika interupsi agar interupsi dilayani setiap saat ketika titik hulu tidak terpenuhi.
sumber
Satu situasi yang jelas di mana interupsi berbasis level berguna untuk situasi di mana sinyal sudah dalam keadaan itu ketika kode mulai memantau sinyal.
Mari kita perhatikan contoh khas ...
Sinyal: "Case_Over_Temperature" Menipis saat ambient di dalam kotak terlalu tinggi untuk operasi normal ..
Jelas, sinyal ini bisa menjadi rendah kapan saja, baik karena kita membuat terlalu banyak panas, atau karena kotak dipasang di lokasi yang panas.
Jelas, pada power up line itu bisa dalam kondisi baik. Mari kita asumsikan sejenak bahwa kode pengaktifan tidak hanya terlihat tetapi bergantung pada interupsi sebagai gantinya. Jika interrupt dipicu edge dan sinyal sudah rendah, ketika interrupt diaktifkan kode yang sesuai tidak akan dieksekusi. Interupsi tingkat sensitif akan lebih bijaksana di sini.
Demikian pula, jika prosesor dibiarkan tidur dan tidak diatur untuk membangunkan interupsi itu, garis itu bisa rendah setiap saat. Ketika apa pun yang terjadi itu terjadi, Anda ingin interupsi menyala pada saat itu.
Memang, bisa dibilang, dengan prevalensi prosesor mode tidur, interupsi berbasis level menjadi lebih berguna.
Namun, seperti semua hal terkait kode, selalu ada lebih dari satu cara untuk "menguliti kucing". Jika Anda tidak menggunakan level based, kode wakeup perlu melakukan polling pin interupsi jika mereka tidak secara otomatis diantrekan oleh prosesor.
Tentunya, level triggered juga dilengkapi dengan serangkaian masalah sendiri di mana kode harus ditangani dengan mengetahui bahwa ia telah menangani kondisi dll.
sumber
Ini agak sebaliknya: mengapa ada edge-triggered triggered ketika Anda dapat memiliki level-trigger yang lebih mudah?
Gangguan terpicu tepi lebih rentan terhadap lonjakan kebisingan dan lebih sulit untuk disaring. Mereka berisiko mengambil kabel off-board atau kabel. Interupsi tidak dapat ditarik oleh sumber.
Interupsi yang dipicu level tetap aktif sampai CPU mengakui sumbernya. Jadi ada dasar yang kuat dari handshaking penuh. CPU dapat menyaring suara keluar dari sinyal interupsi dalam hampir semua cara yang diinginkan, itu hanya meningkatkan waktu respons interupsi. Jika aplikasi memerlukan dan memungkinkan sinyal yang difilter dengan baik, pemicu level dapat disesuaikan.
Saya pertama kali melihat interupsi terpicu-tepi yang digunakan untuk NMI pada CPU seperti Z80 dan 6502, sedangkan interupsi maskable yang digunakan terpicu. NMI menggunakan edge-triggered hanya untuk menghentikan pin macet atau sirkuit penggerak macet dari menjaga agar CPU tidak memasuki NMI ISR selamanya. NMI harus menunjukkan aktivitas untuk mendapatkan aktivitas lain.
Jawabannya, tentu saja, keduanya memiliki aplikasi. Tapi level-triggered adalah titik awal dan edge-triggered karena ada kasus khusus.
sumber
Level ISR mendukung Ack / Nak yang berguna ketika Anda memiliki banyak sumber.
Jika Anda memiliki banyak peringkat ISR dan banyak prioritas di SW & eksternal HW dengan prioritas peringkat.
Jika semua sumber tepi ATAU Anda masih harus polling masing-masing untuk menemukan sumber yang ditetapkan dan kemudian menghapus interupsi.
Jadi baik edge maupun level memiliki kelebihan dalam arsitektur yang berbeda.
Untuk menghindari hilangnya IRQ Edge, itu harus diaktifkan kemudian diuji segera setelah pada akhir ISR.
Beberapa level IRQ dapat bertahan lebih lama dari ISR dan terdeteksi jika diharapkan.
sumber
Itu adalah ketika "garis partai" sedang digunakan, bersama dengan saluran terbuka atau kolektor terbuka, ketika mode level operasi lebih masuk akal.
Dalam hal ini, setiap "pihak" di telepon mengaktifkan output mereka ketika mereka membutuhkan "layanan." Sebagai perangkat lunak penanganan interupsi keluar dan polling (dan kemudian menangani) setiap perangkat pada baris pihak pada gilirannya, perangkat ini melepaskan cengkeramannya dan menjadi tidak aktif. Akhirnya, tidak ada lagi interupsi (level) yang tersisa, jalur interupsi itu sendiri menjadi tidak aktif, dan peranti lunak yang menangani interupsi menjadi "diam" lagi.
sumber