Interrupt-Status durch Zeiger cast (volatile uint32_t *) registrieren Lese sagt Compiler, der diesen Ausdruck (Variable an bestimmten Adresse) Lesen Nebenwirkungen hervorruft, so braucht es immer diesen Ausdruck auszuwerten.
Da Ihre tmp-Variable nicht flüchtig ist, kann der Compiler den Wert Ihres Registers als Variable speichern.
Ich denke Kapitel 5.1.2.3 von C Standard (see here) ist relevant genug.
Zusätzlich Kapitel 6.7.3 erklärt:
Ein Objekt, die flüchtige qualifizierten Typen hat, kann in einer Weise, unbekannt, die Implementierung modifiziert werden, oder haben andere unbekannte Nebenwirkungen. Daher muss jeder Ausdruck, der sich auf ein solches Objekt bezieht, streng nach den Regeln der abstrakten Maschine , wie in 5.1.2.3 beschrieben, bewertet werden. Darüber hinaus muss an jedem Sequenzpunkt der Wert, der zuletzt im Objekt gespeichert wurde, mit dem von der abstrakten Maschine vorgeschriebenen Wert übereinstimmen, mit Ausnahme der durch die zuvor genannten unbekannten Faktoren modifizierten . 116) Was einen Zugriff auf ein Objekt darstellt, das über den Typ "Volatile-qualified" verfügt, ist implementierungsdefiniert.
Sie können tatsächlich tmp weglassen und nur schreiben:
*(volatile uint32_t *)INTERRUPT_STATUS_REG_ADDRESS;
Dies wird einfach lesen uint32_t bei INTERRUPT_STATUS_REG_ADDRESS befindet Register;
Ich kenne AVR32 nicht, aber sind Sie sicher, dass Sie das Interrupt-Statusregister lesen müssen? Aus meiner Erfahrung sollten Sie nur ein einzelnes Interrupt-Flag innerhalb des entsprechenden Registers löschen müssen (oft durch Schreiben einer 1 in das entsprechende Bit). Was ist Ihr Anwendungsfall dafür? –
Ja, es ist nur ein Lesen des PWM-Vergleichs-Statusregisters, um den IRQ zu löschen. 'uint32_t temp = AVR32_PWM.isr2;' – Robotbugs