Forum: Compiler & IDEs volatile oder nicht volatile bei Feldvariablen, AVR GCC


von Wojtek.R (Gast)


Lesenswert?

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

von Klaus W. (mfgkw)


Lesenswert?

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.

von Detlev T. (detlevt)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von Wojtek.R (Gast)


Lesenswert?

Danke für Eure Antworten,

Gruss,
Wojtek

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
Noch kein Account? Hier anmelden.