was muss als volatile definiert werden?

Gast #3590438
Lesenswert?
• ▲
▼
wenn ich in einer ISR z.B. sowas hier hab:

buffer[pointer++] = UDR0;

dann ist mir klar dass die Variable "pointer" als volatile definiert 
werden muss, wenn ich diese von ausserhalb anzapfen möchte, was 
normalerweise der Fall ist.

Nicht klar ist mir, ob das array "buffer" auch als volatile definiert 
werden muss oder nicht. Ich vermute mal nicht, da es ja nur einen 
Speicherbereich reserviert, bin mir aber nicht ganz sicher - bleiben 
Schreibzugriffe in die Plätze des Arrays womöglich auch in Registern 
hängen wenn man es nicht als volatile definiert, oder ist das Unsinn?
#3590452
Lesenswert?
• ▲
▼
Micha schrieb:

> Nicht klar ist mir, ob das array "buffer" auch als volatile definiert
> werden muss oder nicht.

Kommt drauf an, wie es auf 'der anderen Seite' benutzt wird. Aber im 
Prinzip muss das genauso volatile gemacht werden.

> Ich vermute mal nicht, da es ja nur einen
> Speicherbereich reserviert

und eine Variable reserviert keinen Speicherbereich?

FAQ: Was hat es mit volatile auf sich
Gast #3590480
Lesenswert?
• ▲
▼
Karl Heinz schrieb:
> FAQ: Was hat es mit volatile auf sich

Schwääre Kost. Wenn ich mal versuch den impliziten Teil deiner Aussage 
zu deuten ist es ne gute Idee im Zweifelsfall alles was irgendwie in 
einer ISR vorkommt als volatile zu definieren?
Wär für mich gut genug da ich eh kein Freund der totalen Optimierung 
bin.
#3590499
Lesenswert?
• ▲
▼
Micha schrieb:
> Karl Heinz schrieb:
>> FAQ: Was hat es mit volatile auf sich
>
> Schwääre Kost.

Nicht wirklich.

Sieh dir dein hauptprogramm an.

Wenn da zb steht
1
   while( buffer[0] == 'a' )
2
     ;

dann gibt es keinen Grund für den Compiler, jedes mal neu den Inhalt von 
buffer[0] aus dem Speicher zu holen. Warum sollte er? Innerhalb der 
Schleife kann sich der Wert nicht ändern. Die Schleife wird, aus Sicht 
des Compilers also überhaupt nicht betreten (wenn buffer[0] nicht vorher 
schon 'a' war) bzw. sie ist eine Endlosschleife (weil buffer[0] sich ja 
aus SIcht des Compilers nicht ändern kann). Ergo wird der Compiler im 
Übereifer dir etwas gutes zu tun, eine falsche Optimierung vornehmen.


> Wenn ich mal versuch den impliziten Teil deiner Aussage
> zu deuten ist es ne gute Idee im Zweifelsfall alles was irgendwie in
> einer ISR vorkommt als volatile zu definieren?

Besser wäre es, wenn man versteht was man da macht und wann einem die 
Technik einen nicht gewollten Streich spielen kann.
#3590529
Lesenswert?
• ▲
▼
Hallo,

buffer muss volatile werden, denn:

wenn von aussen der buffer beschrieben werden kann, ändern sich dessen 
Inhalte, und dann muss neu gelesen werden. Der buffer muss also volatile 
werden.

Da stets per Zeiger gelesen wird, muss der pointer nicht volatisiert 
werden, denn er wird bei jedem Zugriff auf das Array verwendet.

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.