volatile oder nicht volatile bei Feldvariablen, AVR GCC

Gast #1336430
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
#1336443
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.
#1336485
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.