Stehe vor folgender Überlegung: Auf eine Feldvariable (vom Typ uint_8 )wird in einer ISR Routine zugegriffen, dabei handelt es sich um Schreibzugriffe, die Feldvariable wird dabei verändert (und zwar nur in der einen ISR Routine wird sie verändert). Im Hauptprogramm (Main) wird die Feldvariable lediglich nur Ausgegeben. for(i=0;i<MAX,i++) Ausgabe(Feldvariable[i]); Ist eine Deklaration der Feldvariable mit volatile notwendig bzw. sinnvoll? Wird bei Feldvariablen überhaupt volatile verwendet wenn es sich um Felder handelt auf die man kein Polling macht? In diesem Fall stört die Optimierung doch nicht, oder? Danke für Eure Antworten
Theoretisch müsstest du das Feld wohl volatile machen. In der Hauptroutine kann der gcc durchaus auf die Idee kommen, etwas bereits gelesenes nicht nochmal aus dem Feld zu holen, also würde ich es nicht wagen, volatile weg zu lassen. Wenn du nur wie gezeigt in der Schleife durchläufst, wird es keinen Unterschied machen - schließlich kann er ja nicht das Feld in Registern halten. Aber das wird vermutlich nicht der ganze Zugriff sein, oder? Und wenn doch, sollte volatile zumindest nicht schaden.
Hallo Wojtek, mit volatile bist du auf jeden Fall auf der sicheren Seite. Wahrscheinlich wird an dieser Stelle der Code dadurch noch nicht einmal schlechter, weil die Variable einfach nur ausgegeben wird. Gruß, DetlevT
Detlev T. schrieb:
> mit volatile bist du auf jeden Fall auf der sicheren Seite.
Wenn im Interrupt auch nur eine Zuweisung erfolgt, muß dadurch auch
nicht der Code größer werden.
Anders ist es, wenn der Interrupt auf die Variable mehrmals zugreift und
der Interrupt vielleicht auch sehr häufig aufgerufen wird.
Dann kann man im Main eine Memory-Barrier definieren, d.h. alle globalen
Variablen müssen danach neu eingelesen werden:
1 | asm volatile("" ::: "memory"); |
Peter
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.