Apa gunanya memiliki interupsi berbasis level?


8

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 whileatau do whileloop.

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.


... Hal lain yang saya baca adalah bahwa itu digunakan untuk membuat loop yaitu selama ada interupsi, melayani ISR ​​tetapi itu bisa dicapai dengan sementara atau melakukan sementara loop .... Fakta beberapa hal dapat tercapai satu cara, tidak berarti kita harus menghilangkan semua cara lain untuk melakukan hal yang sama.
Eugene Sh.

@EugeneSh. Tidak diragukan lagi, tetapi harus ada keuntungan kuat untuk melakukan hal yang sama dengan cara lain. Bukan? Saya lebih tertarik mengetahui "keunggulan" itu. Saya hanya ingin tahu apa perbedaan yang dibuatnya dalam perulangan menggunakan pernyataan perulangan dan interupsi berbasis level? Jika perulangan adalah satu-satunya tujuan yang dicapai menggunakannya.
MaNyYaCk

2
bagaimana jika Anda memiliki beberapa interupsi yang tertunda pada satu baris? mis. setiap pemicu ISR menangani satu paket data tetapi perangkat memiliki banyak antrian? Dengan edge triggered interrupt, pengontrol interupsi perlu tahu kapan interupsi sebelumnya ditangani dan kapan saatnya untuk mengirimkan interupsi berikutnya. Juga untuk kasus penggunaan di mana beberapa interupsi dinyatakan ketika host masih menangani yang sebelumnya, tanpa level memicu sulit untuk mengantri dan memprioritaskan mereka.
user3528438

Jawaban:


10

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.


Saya ingin meminta maaf untuk mengambil banyak waktu. Tetapi pertanyaan yang saya ajukan adalah sangat spesifik untuk Interupsi Eksternal dari controller, dan butuh waktu tertentu untuk memahami semua jawaban yang dituangkan datang mempertimbangkan prosesor dengan kontroler interrupt. Terima kasih telah memberikan jawaban yang berharga ini.
MaNyYaCk

6

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.


2

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.


1
Saya tidak akan mengatakan Z80 dan 6502 menggunakan interupsi terpicu untuk menghindari masalah pin "macet". Alih-alih, saya akan mengatakan bahwa mereka harus dapat menutupi segala gangguan setelah servis telah dimulai, dan untuk NMI yang dilakukan melalui kait "mask NMI" khusus yang akan ditetapkan ketika NMI diservis, dan dihapus ketika Pin NMI dilepaskan.
supercat

@ supercat, Anda telah menjelaskan bagaimana Anda melihatnya tetapi tidak bagaimana Z80 / 6502 bekerja. NMI bisa level, sama dengan INT / IRQ dengan sumber interupsi dihapus oleh hw atau sw interrupt. Bekerja dengan sangat baik. Bagaimana menurut Anda membuat mereka mendesain NMI sebagai edge-triggered dan INT / IRQ sebagai level, apa yang Anda lihat sebagai manfaatnya?
TonyM

Istilah "edge triggered" digunakan untuk mendeskripsikan input yang menempatkan sirkuit deteksi tepi sebelum sinkronisasi, sehingga sinyal yang datang dan pergi semua dalam satu siklus akan diproses, tetapi saya juga telah melihatnya digunakan untuk menggambarkan input yang mengunci sinyal pada setiap sinyal clock dan mencari sinyal yang tidak ada pada satu atau lebih siklus dan kemudian hadir untuk satu atau lebih siklus. Jika NMI harus diakui oleh perangkat lunak, kegagalan untuk mengakui interupsi pertama secara efektif akan menutupi semua yang berikutnya.
supercat

@ supercat, itu bukan cara kerja Z80 / 6502 dan mereka sendiri adalah subjek dari contoh saya yang Anda pertanyakan. Jika Anda setelah diskusi tentang NMI yang dipicu oleh tepi, silakan pergi ke obrolan untuk menghindari pertukaran komentar yang diperpanjang. Tidak yakin apa yang bisa saya tambahkan. Terima kasih.
TonyM

Saya belum melihat rincian tentang cara kerja Z80, tetapi menurut lembar data 6502 NMI dicicipi sekali pada setiap jam phi2. Lembar data diam tentang waktu sampel / penahanan, tetapi dari apa yang saya baca di tempat lain pulsa NMI yang tidak ada selama setidaknya tiga sampel berturut-turut tidak akan selalu diproses.
supercat

1

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.


1

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.


1
bermasalah. bagaimana jika tuan rumah menerima tepi lain pada saluran lain ketika sudah menangani interupsi? beberapa pilihan: 1) abaikan interupsi yang masuk; 2) antri di perangkat keras; 3) interupsi interrupt handler saat ini dan tangani yang baru, baik tangani sepenuhnya atau antrian untuk nanti. Dengan pemicu level, Anda tinggal membiarkannya di sana dan masih akan ada di sana untuk Anda tangani setelah Anda selesai dengan ISR saat ini.
user3528438

@ user3528438 Saya menjawab pertanyaan tentang "mengapa level." Jadi saya hanya akan menghapus bagian itu dan menghindari perdebatan.
jonk

1
Bahkan ketika menggunakan interupsi khusus, saya sarankan interupsi yang dipicu tepi hanya lebih baik jika seseorang tertarik untuk merespons suatu peristiwa yang mungkin datang dan pergi pada saat seseorang dapat melayaninya, dan bahkan di sana menggunakan pengait peristiwa. perangkat untuk menggerakkan interupsi level-sensitif mungkin sama bermanfaatnya dengan menggunakan interupsi sensitif-tepi. Interupsi yang dipicu oleh edge mungkin menghemat instruksi yang seharusnya diperlukan untuk membersihkan kait, tapi itu biasanya bukan biaya atau penghematan yang berarti.
supercat

@supercat Saya telah memfokuskan kembali jawaban saya untuk langsung menjawab pertanyaan berjudul, untuk menghindari terlibat dalam beberapa bab dan ayat yang jorok. Jauh lebih sederhana. (Ya, saya telah menggunakan segala macam metode interupsi sejak ... 1974 ... jadi saya sudah melihat semua alasannya, saya pikir. Saya hanya tidak ingin membahasnya hari ini.)
Jonon
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.