Servus Eine Frage zur Compilertechnik. Wenn ich im Quellcode sowas schreibe: PORTB = (1<<2); PORTB = (1<<5); macht der Compiler dann daraus ein PORTB = 0b00100100; als 1 Befehl, oder lässt der dem µC zwei Befehle hinternander ausführen?
Wenn PORTB volatile ist, muß er es so machen, wie Du es hinschreibst. Ansonsten darf er es zusammenfassen. Peter
Echt? Aber PORTB = (1<<2); PORTB = (1<<5); sind doch zwei getrennte Zuweisungen, d. h. er verodert die?
Nein da wird nicht's verodert, die Befehle werden nacheinander ausgeführt. PORTB ist als Volatile definiert da es ein IO- oder CPU-Register ist.. PORTB = (1<<2); // => PORTB= 0b0000'0100 PORTB = (1<<5); // => PORTB= 0b0010'0000 MfG Peter
Wenn es kein volatile wäre, dann könnte der Compiler die erste Zuweisung weglassen da sie keine Auswirkungen auf das Programm hat.
Wenn der Compiler da etwas verodern würde, wäre das grob falsch! Nach der zweiten Zuweisung darf (selbst wenn das Ziel der Zuweisung nicht volatile wäre) nichts mehr von der ersten Zuweisung da sein. Allerhöchstens könnte, wie Andreas schon anmerkte, die erste Anweisung komplett wegfallen, da sie auf das Endergebnis keine Auswirkung hat. Anders wäre das, wenn vor den "=" noch jeweils ein "|" stünde...
Eben! Also stimmt die von Armin gemacht Aussage > macht der Compiler dann daraus ein > PORTB = 0b00100100; > ^ ^ nicht. Oder stehe ich jetzt komplett auf der Flüssigkeitsleitung?
Natürlich stimmt die nicht! Wenn Du einer Variable oder einem Register mit dem Zuweisungsoperator "=" einen Wert zuweist und direkt danach einen anderen, dann überschreibt der zweite den ersten. Das ist doch wohl völlig logisch, oder etwa nicht? Wenn Du schreibst "PORTB = 1 << 5" (um beim obigen Beispiel zu bleiben), dann steht nach der Zuweisung "1 << 5" in PORTB, und nichts anderes. Solange da kein "|"-Operator steht, darf da gar nichts verodert werden. Weiß gar nicht, wie Armin da drauf gekommen ist...
> Das ist doch wohl völlig logisch, oder etwa nicht?
Absolut, war jetzt nur minimal am zweifeln...
ja stimmt ... ich habe den Oder-Strich vergessen: PORTB |= (1<<2); PORTB |= (1<<5); so...jetzt könnte man wieder von vorn anfangen... Macht er daraus nur den einen Befehl oder diese 2 ?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.