Aktifkan interupsi tetapi tidak ada ISR

10

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.

AlphaGoku
sumber
3
Anda tidak perlu mengaktifkan interupsi untuk dapat polling untuk bendera di fungsi utama Anda. Jika kondisi yang mengatur bendera terjadi, bendera itu akan ditetapkan apakah Anda telah mengaktifkan interupsi terkait.
brhans
Ur mengatakan bahwa tanda gangguan Bus Arbitrase Bus Hilang akan ditetapkan bahkan jika saya tidak mengaktifkan "interupsi pada Bus Arbitrase yang hilang" (meskipun tidak ada register status yang dapat menunjukkan Arbitrase Bus hilang kecuali register status Interrupt)?
AlphaGoku
Iya. Di setiap MCU saya telah bekerja dengan, bendera interupsi diatur setiap kali kondisi yang seharusnya mengatur mereka terjadi. Mengaktifkan interupsi menyebabkan MCU untuk vektor ke pawang ketika bendera terkait diatur dan menonaktifkan interupsi menyebabkannya mengabaikan bendera dan bukan vektor ke pawang meskipun bendera diatur . Menonaktifkan interupsi hanya memengaruhi perilaku lompat-ke-interrupt-handler, bukan perilaku pengaturan-bendera.
brhans
Wow. Itu sesuatu yang aku tidak tahu. Terima kasih banyak. Jadi setiap pengemudi harus secara berkala juga memeriksa register status interupsi dan meresetnya meskipun interupsi belum diaktifkan :)
AlphaGoku
@AkshayImmanuelD hanya jika itu penting. Jika interupsi selalu dinonaktifkan, dan tidak ada yang peduli dengan bendera, maka apakah itu disetel atau dihapus tidak penting.
hobbs

Jawaban:

17

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.

  28:   0c 94 47 00     jmp 0x8e    ; 0x8e <__bad_interrupt>
  2c:   0c 94 5c 00     jmp 0xb8    ; 0xb8 <__vector_11>   // <-- ISR
  30:   0c 94 47 00     jmp 0x8e    ; 0x8e <__bad_interrupt>
  34:   0c 94 47 00     jmp 0x8e    ; 0x8e <__bad_interrupt>

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.

tcrosley
sumber
2
...., atau bisa juga tidak ditentukan.
Wouter van Ooijen
@WoutervanOoijen itulah yang saya maksud dengan vektor interupsi menjadi nol.
tcrosley
1
Register status tidak dapat menunjukkan beberapa kesalahan seperti yang saya sebutkan di atas. Tetapi kesalahan seperti itu memang memiliki interupsi. Karenanya saya berpikir untuk mengaktifkan interupsi hanya untuk mengidentifikasi kesalahan dan tidak menggunakan ISR. Saat mensimulasikan LPC1778 menggunakan Keil, saya tidak mendapatkan pengecualian jadi saya kira UC harus menggunakan RTI seperti yang Anda sebutkan
AlphaGoku
1
Sesuatu yang harus diperhatikan - jika Anda mengaktifkan interupsi, tetapi pawang Anda tidak menghapus bendera (atau tidak ada pawang dan perilaku default adalah pengembalian sederhana) maka kemungkinan besar Anda akan menemukan bahwa MCU Anda akan berakhir selamanya terjebak dalam loop interupsi.
brhans
1
Interupsi PIO pada ATSAM3X8E dapat dipicu oleh edge, tetapi kondisi interupsi yang diset tidak akan dihapus sampai Anda membaca ISR (interrupt status register) dalam interrupt handler - menghasilkan loop @brhans yang disebutkan.
Simon Wright
1

Itu tergantung pada MCU Anda, kompiler dan sisa kode.

Dari pengalaman saya:

  1. 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

  2. NXP Kinetis (ARM) - semua vektor secara default menunjuk ke handler default yang memiliki breakpoint, CPU hanya akan berhenti dan kirim ke debugger Anda.

filo
sumber