www.mikrocontroller.net

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


Autor: Wojtek.R (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Detlev T. (detlevt)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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:

asm volatile("" ::: "memory");


Peter

Autor: Wojtek.R (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für Eure Antworten,

Gruss,
Wojtek

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.