Saya ingin tahu apa yang terjadi jika Interrupt diaktifkan (mis: Arbitration Lost Interrupt dalam modul CAN pada LPC1778 NXP), tetapi tidak ada ISR yang telah ditentukan untuk interupsi tersebut.
Ketika interupsi seperti itu terjadi, saya tahu bahwa bendera interupsi masing-masing akan ditetapkan, tetapi karena saya belum mendefinisikan ISR, tidak akan ada alamat penyeimbang vektor interupsi yang disimpan untuk transfer kontrol untuk interupsi semacam itu sehingga kontrol akan kembali ke rutin utama, dan saya dapat mengatur ulang flag interrupt dengan polling di rutin utama (ini adalah apa yang saya pikirkan). Apakah akan ada latensi ketika CPU mencari tahu bahwa tidak ada ISR untuk melompat?
Solusi apa pun yang mungkin terjadi bisa sangat membantu saya.
Terima kasih.
Memperbarui:
Saya mengaktifkan CAN Interrupt di UC saya, tetapi tidak mendefinisikan ISR. Ketika saya melakukan tes loopback internal, kode dimasukkan ke dalam loop tak terbatas. Berikut adalah kode pembongkaran infinite loop yang dieksekusi pada LPC1778:
B .
ENDP
Jadi ya, jika Anda menggunakan interupsi, gunakan ISR.
sumber
Jawaban:
Jika tidak ada ISR yang ditentukan, lokasi untuk instruksi lompatan dalam vektor interupsi akan menjadi nol, itu mungkin lompatan ke rutinitas pengecualian, mungkin lompat ke awal program, atau mungkin mengandung "kembali dari interupsi "(mis. RTI) instruksi.
Berikut ini adalah pembongkaran dari tabel interupsi untuk prosesor ATMega 16 yang menunjukkan tiga interupsi yang tidak terpakai yang di-vektor-kan ke suatu rutin yang menangani kasus-kasus seperti itu (mungkin saja masuk ke loop tak terhingga), dan satu vektor yang sah.
Manakah dari metode yang dijelaskan sebelumnya tentang penanganan ISR yang hilang akan bergantung pada arsitektur mikrokontroler dan kompiler. Dalam hal RTI atau instruksi yang setara, itu akan segera kembali ke aplikasi. Namun jika interupsi dipicu level daripada dipicu ujung, maka ini mungkin akan menyebabkan interupsi dipicu lagi, sehingga Anda berakhir dalam loop tak terbatas.
Saya pikir itu mungkin tergantung pada arsitektur chip apakah interupsi internal (misalnya karakter yang diterima oleh UART) dianggap level-triggered atau edge-triggered. Interupsi eksternal biasanya dapat dikonfigurasi sebagai satu atau yang lain.
Ada juga satu kasus lain, kadang-kadang beberapa interupsi dikelompokkan bersama dan menggunakan vektor yang sama. Ini terutama berlaku untuk prosesor yang lebih lama yang mungkin hanya memiliki beberapa gangguan. Dalam hal ini, penyebab interupsi ditentukan oleh polling status register interupsi, yang seperti apa yang Anda usulkan.
Tetapi itu adalah praktik yang buruk dalam hal apapun untuk memiliki interupsi dalam suatu sistem dan tidak ada ISR yang didefinisikan. Jangan lakukan itu.
sumber
Itu tergantung pada MCU Anda, kompiler dan sisa kode.
Dari pengalaman saya:
AVR - secara default jika Anda tidak menentukan ISR, maka vektor interupsi dalam flash akan menjadi 0x0000, yang berarti bahwa aplikasi Anda akan melompat ke reset setiap kali gangguan ini terjadi.
Jika Anda benar-benar membutuhkan interupsi, tetapi tidak memerlukan handler (mis. Gunakan ADC mode power-down low-noise dan gunakan interrupt hanya untuk membangunkan MCU), Anda harus menggunakan makro EMPTY_INTERRUPT
NXP Kinetis (ARM) - semua vektor secara default menunjuk ke handler default yang memiliki breakpoint, CPU hanya akan berhenti dan kirim ke debugger Anda.
sumber