Apakah benar-benar perlu untuk menghapus secara manual flag interupsi pelimpah waktu XMEGA?

8

Seperti yang mungkin Anda ketahui, Atmel menyediakan kerangka kerja perangkat lunak (terutama sebagai bagian dari Atmel Studio) yang menyediakan driver dan contoh dan diperbarui secara berkala.

Dalam pembaruan baru-baru ini mereka menunjukkan secara eksplisit , bahwa penting untuk secara manual menghapus flag interupsi melimpah dalam fungsi interupsi panggilan balik.

 // * \subsection xmega_tc_qs_ovf_setup_code Example code
 // *
 // * Add a callback function that will be executed when the overflow interrupt
 // * trigger.
 // * \code
 static void my_callback(void)
 {
    // User code to execute when the overflow occurs here

    // THIS WAS ADDED IN LAST UPDATE
    // Important to clear Interrupt Flag
    tc_clear_overflow(&TCC0);
    // THIS WAS ADDED IN LAST UPDATE

 }
 //\endcode

Menurut lembar data XMEGAA:

OVFIF secara otomatis dihapus ketika vektor interupsi yang sesuai dijalankan. Bendera juga dapat dihapus dengan menulis satu ke lokasi bitnya.

Apakah ada skenario / alasan di mana membersihkan bendera secara manual mungkin diperlukan?

Rev1.0
sumber
Kedengarannya jawabannya adalah jika Anda tidak mengganggu maka Anda perlu menghapusnya secara manual. intinya jika / saat polling daripada menggunakan interupsi. Anda cukup membaca register di interupsi dan entah bagaimana menampilkannya untuk melihat apakah itu benar-benar diatur. juga coba polling tanpa interupsi diaktifkan dan lihat apakah sudah diatur dan jika Anda dapat menghapusnya. memvalidasi dokumentasi itu atau tidak benar.
old_timer
1
Itu tidak akan menjadi kasus pertama yang saya lihat dalam produk Atmel di mana interupsi "secara otomatis dihapus" tampaknya tidak benar-benar dihapus ketika handler menyala.
Connor Wolf
1
@ConnorWolf: Benarkah? Apakah Anda ingat controller dan interupsi yang mana? Kami sering bekerja dengan tenang dengan pengontrol Atmel dan ini bisa menjadi perangkap potensial.
Rev1.0
3
@ Rev1.0 - Contoh yang sedang saya kerjakan sekarang: SAM4SD32C- Pengatur waktu menyela ( TC0_Handler, dll ...) tidak dihapus saat memasuki ISR ​​kecuali saya secara eksplisit membaca TC0->TC_SR. Menggali lebih dalam, dalam hal ini, itu karena interupsi dipicu dari RCbit pertandingan register perbandingan, dan itu tidak dihapus sampai Anda secara eksplisit membaca TC_SR. TKI, saya salah tentang penyebab sebenarnya (itu bukan bit ISR langsung), tetapi hasil akhirnya sama: Anda harus menghapus secara manual penyebab ISR , jika bukan bendera ISR .
Connor Wolf
1
Mungkin ada errata?
vicatcu

Jawaban:

1

Apakah ada skenario / alasan di mana membersihkan bendera secara manual mungkin diperlukan?

Tidak yakin tentang ASF, tetapi ada kasus di mana Anda perlu membatalkan interupsi yang tertunda. Misalnya, ketika (kembali) mengonfigurasi timer Anda mungkin ingin menonaktifkan interupsi, memodifikasi timer, dan membatalkan semua interupsi timer yang mungkin telah terjadi dalam waktu yang berarti, sebelum mengaktifkan kembali interupsi.

Jika Anda bahkan tidak memiliki ISR ​​overflow, Anda masih bisa polling OVIF untuk mendeteksi overflow, dan mengatur ulang bendera untuk mempersenjatai itu untuk overflow berikutnya.

JimmyB
sumber
1

Secara umum, saya selalu menghapus flag interupsi sesaat sebelum mengaktifkan interupsi yang diberikan, seandainya ada sesuatu yang mengatur flag di masa lalu. Sepertinya asuransi murah.

Saya tidak mengetahui adanya skenario di mana Anda perlu menghapus flag secara manual kecuali jika Anda tidak menggunakan interupsi, dan Anda melihat flag dengan rutin yang dijalankan secara berkala untuk memeriksa flag yang ditetapkan.

pengguna103218
sumber