Est-il vraiment nécessaire d'effacer manuellement l'indicateur d'interruption de dépassement de temporisation XMEGA?

8

Comme certains d'entre vous le savent peut-être, Atmel fournit un cadre logiciel (principalement dans le cadre d'Atmel Studio) qui fournit des pilotes et des exemples et est mis à jour plus ou moins régulièrement.

Dans une mise à jour récente, ils soulignent explicitement qu'il est important d'effacer manuellement l'indicateur d'interruption de débordement dans la fonction de rappel d'interruption.

 // * \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

Selon la fiche technique XMEGAA:

OVFIF est automatiquement effacé lorsque le vecteur d'interruption correspondant est exécuté. Le drapeau peut également être effacé en écrivant un un à son emplacement de bit.

Y a-t-il un scénario / une raison pour lequel la suppression manuelle du drapeau peut être nécessaire?

Rev1.0
la source
semble que la réponse est que si vous n'interrompez pas, vous devez l'effacer manuellement. essentiellement si / lors de l'interrogation au lieu d'utiliser des interruptions. vous pouvez simplement lire le registre dans l'interruption et l'afficher d'une manière ou d'une autre pour voir s'il était vraiment réglé. essayez également d'interroger sans l'interruption activée et voyez si elle est définie et si vous pouvez la supprimer. valider que la documentation est ou n'est pas correcte.
old_timer
1
Ce ne serait pas le premier cas que j'ai vu dans les produits Atmel où une interruption «automatiquement effacée» ne semble pas réellement effacée lorsque le gestionnaire se déclenche.
Connor Wolf
1
@ConnorWolf: Vraiment? Vous souvenez-vous du contrôleur et de l'interruption? Nous travaillons beaucoup avec des contrôleurs Atmel et cela pourrait être un piège potentiel.
Rev1.0
3
@ Rev1.0 - Un exemple avec lequel je travaille en ce moment: SAM4SD32C- Les interruptions du temporisateur ( TC0_Handler, etc ...) ne sont pas effacées lors de l'entrée dans l'ISR à moins que je ne les lise explicitement TC0->TC_SR. En creusant plus profondément, dans ce cas, c'est parce que l'interruption est déclenchée à partir du RCbit de correspondance du registre de comparaison, et cela n'est pas effacé jusqu'à ce que vous lisez explicitement TC_SR. IOW, je me trompe sur la cause réelle (ce n'était pas le bit ISR directement), mais le résultat final est le même: vous devez effacer manuellement la cause ISR , sinon l' indicateur ISR .
Connor Wolf
1
Peut-être qu'il y a un errata?
vicatcu

Réponses:

1

Y a-t-il un scénario / une raison pour lequel la suppression manuelle du drapeau peut être nécessaire?

Pas sûr de l'ASF, mais il y a des cas où vous devez annuler toute interruption en attente. Par exemple, lorsque vous (re) configurez un temporisateur, vous pouvez désactiver les interruptions, modifier le temporisateur et annuler toutes les interruptions du temporisateur qui se sont produites entre-temps, avant de réactiver les interruptions.

Si vous ne disposez même pas d'un ISR de débordement, vous pouvez toujours interroger l'OVIF pour détecter le débordement et réinitialiser l'indicateur pour l'armer pour le prochain débordement.

JimmyB
la source
1

En général, j'efface toujours les drapeaux d'interruption juste avant d'activer une interruption donnée, au cas où quelque chose aurait mis le drapeau dans le passé. On dirait une assurance bon marché.

Je ne connais aucun scénario dans lequel vous devez effacer manuellement l'indicateur, sauf si vous n'utilisez pas d'interruptions, et vous examinez l'indicateur avec une routine qui s'exécute périodiquement pour vérifier que l'indicateur est défini.

user103218
la source