Ist es wirklich notwendig, das XMEGA-Timer-Überlauf-Interrupt-Flag manuell zu löschen?

8

Wie einige von Ihnen vielleicht wissen, bietet Atmel ein Software-Framework (hauptsächlich als Teil von Atmel Studio), das Treiber und Beispiele bereitstellt und mehr oder weniger regelmäßig aktualisiert wird.

In einem kürzlich durchgeführten Update wird ausdrücklich darauf hingewiesen, dass es wichtig ist , das Überlauf-Interrupt-Flag in der Interrupt-Rückruffunktion manuell zu löschen.

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

Laut XMEGAA-Datenblatt:

OVFIF wird automatisch gelöscht, wenn der entsprechende Interruptvektor ausgeführt wird. Das Flag kann auch gelöscht werden, indem eine Eins in die Bitposition geschrieben wird.

Gibt es ein Szenario / einen Grund, in dem das manuelle Löschen der Flagge erforderlich sein kann?

Rev1.0
quelle
klingt wie die Antwort ist, wenn Sie nicht unterbrechen, dann müssen Sie es manuell löschen. im Wesentlichen, wenn / wenn eine Abfrage statt Interrupts verwendet wird. Sie können einfach das Register im Interrupt lesen und es irgendwie anzeigen, um zu sehen, ob es wirklich gesetzt wurde. Versuchen Sie ebenfalls, ohne aktivierten Interrupt abzufragen, und prüfen Sie, ob er gesetzt ist und ob Sie ihn löschen können. Überprüfen Sie, ob die Dokumentation korrekt ist oder nicht.
old_timer
1
Dies wäre nicht der erste Fall, den ich bei Atmel-Produkten gesehen habe, bei dem ein "automatisch gelöschter" Interrupt beim Löschen des Handlers nicht tatsächlich gelöscht zu werden scheint.
Connor Wolf
1
@ ConnorWolf: Wirklich? Erinnerst du dich an welchen Controller und Interrupt? Wir arbeiten viel ruhig mit Atmel-Controllern und dies könnte eine potenzielle Gefahr sein.
Rev1.0
3
@ Rev1.0 - Ein Beispiel, mit dem ich gerade arbeite: SAM4SD32C- Die Timer-Interrupts ( TC0_Handlerusw.) werden beim Eingeben des ISR nicht gelöscht, es sei denn, ich lese ausdrücklich TC0->TC_SR. Graben tiefer, in diesem Fall ist es , weil die Unterbrechung von der ausgelöst wird , RCvergleichen Register Übereinstimmungsbitarraywert, und das wird nicht gelöscht , bis Sie explizit lesen TC_SR. IOW, ich bin falsch in Bezug auf die tatsächliche Ursache (es war nicht das ISR-Bit direkt), aber das Endergebnis ist das gleiche: Sie müssen die ISR- Ursache manuell löschen , wenn nicht das ISR- Flag .
Connor Wolf
1
Vielleicht gibt es eine Errata?
Vicatcu

Antworten:

1

Gibt es ein Szenario / einen Grund, in dem das manuelle Löschen der Flagge erforderlich sein kann?

Sie sind sich über die ASF nicht sicher, aber es gibt Fälle, in denen Sie ausstehende Interrupts abbrechen müssen. Wenn Sie beispielsweise einen Timer (neu) konfigurieren, möchten Sie möglicherweise Interrupts deaktivieren, den Timer ändern und alle Timer-Interrupts abbrechen, die in der Zwischenzeit aufgetreten sind, bevor Sie Interrupts wieder aktivieren.

Wenn Sie nicht einmal einen Überlauf-ISR haben, können Sie das OVIF trotzdem abfragen, um einen Überlauf zu erkennen, und das Flag zurücksetzen, um es für den nächsten Überlauf zu aktivieren.

JimmyB
quelle
1

Im Allgemeinen lösche ich Interrupt-Flags immer kurz vor dem Aktivieren eines bestimmten Interrupts, falls etwas das Flag in der Vergangenheit gesetzt hat. Scheint wie eine billige Versicherung.

Mir ist kein Szenario bekannt, in dem Sie das Flag manuell löschen müssen, es sei denn, Sie verwenden keine Interrupts, und Sie betrachten das Flag mit einer Routine, die regelmäßig ausgeführt wird, um zu überprüfen, ob das Flag gesetzt ist.

user103218
quelle