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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren