Zitat 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 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.