
Zitat von
Ceos
volatile sagt dem compiler, dass die variable direkt aus/in dem spiecher geladen werden muss nach/vor jedem bearbeiten
So in etwa.

Zitat von
Ceos
aber in dem obigen fall sind es doch atomare zugriffe! eine vergleichsoperation und eine zuweisung, also defakto kein volatile nötig oder ?
Wieso würfelst du das jetzt schon wieder zusammen?
Was sieht der Compiler in Bezug auf die Variable empfang in main?
Code:
unsigned char empfang = 0;
int main(void){
while(1){
PORTC = ~empfang;
if(empfang){
PORTC = ~a;
empfang = 0;
}
}
}
Die Variable ist zu Anfang 0 und ändert sich nie in der Endlosschleife, also muss sie in der Endlosschleife immer 0 sein. Aus "PORTC = ~empfang" macht der Compiler daher gleich ein "PORTC = 0xff" und der ganze if-Block wird komplett rausgeschmissen (kann ja nie true werden).
"volatile" sagt dem Compiler "Achtung, diese Variable kann sich unerwartet außerhalb des linearen Code-Ablaufs ändern!" (deine Erklärung oben ist nur die direkte Konsequenz daraus). Er kann jetzt nicht mehr davon ausgehen, dass sie in der Schleife ja immer nur 0 sein kann. Überall wo empfang steht, muss die Variable auch tatsächlich gelesen/geschrieben werden.
Mit "atomaren Zugriffen" oder dem Typ der Variable hat das nicht das Geringste zu tun.
Lesezeichen