A. K. schrieb:
> Ich bin auf die Schnelle nicht bis ins Detail rein, aber wenn muxp
> sowohl in ISR als auch im Hauptprogramm verwendet wird, dann kann es gut
> sein, dass diese Variable nicht nur auf "volatile" zeigen muss, sondern
> auch selbst "volatile" sein muss, also
> volatile unsigned char *volatile muxp = mux + MUX_SIZE;
in diesem konkreten Fall nicht.
Da mux seine Adresslage nicht ändert und auch MUX_SIZE eine Konstante
ist, könnte man höchstens argumentieren, dass
1 | volatile unsigned char *const muxp = mux + MUX_SIZE;
|
korrekt wäre.
Die Sache mit dem Array.
Auch wenn es unwahrscheinlich ist, so sollte man natürlich das Array als
ganzes volatile machen. Die Tatsache, dass es sich hier um ein Array
handelt, darf doch keine Rolle spielen! volatile bedeutet ja
schliesslich: keinerlei Annahmen über den Inhalt einer Speicherzelle
machen und lokale Optimierungen auf dieser Speicherzelle aussen vor
lassen. Natürlich ist es unwahrscheinlich, dass der Compiler es schafft
ein komplettes Array in CPU-Registern zu halten und damit eine
Optimierung aufzubauen. Aber unwahrscheinlich bedeutet nicht, dass es
unmöglich ist. Wird in einer Schleife ein einzelnes Element aus dem
Array benutzt, dann kann der Optimizer sehr wohl zuschlagen und dieses
Element in einem Register halten.
Das fiese ist ja: ohne volatile kann etwas funktionieren, aber es muss
nicht. Ob und wie hängt immer von den Details des Optimizers ab. Und dem
möchte man sich ganz sicher nicht auslieferern.