So in etwa.Zitat:
Zitat von Ceos
Wieso würfelst du das jetzt schon wieder zusammen?Zitat:
Zitat von Ceos
Was sieht der Compiler in Bezug auf die Variable empfang in main?
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).Code:unsigned char empfang = 0;
int main(void){
while(1){
PORTC = ~empfang;
if(empfang){
PORTC = ~a;
empfang = 0;
}
}
}
"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.