Forum: Mikrocontroller und Digitale Elektronik Frage zum Kompiler (allgemein)


von Armin O. (Gast)


Lesenswert?

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?

von Josef (Gast)


Lesenswert?

Sieh dir die generierte Assembler-Datei an.


Sg Josef

von Peter D. (peda)


Lesenswert?

Wenn PORTB volatile ist, muß er es so machen, wie Du es hinschreibst.
Ansonsten darf er es zusammenfassen.


Peter

von Jupp (Gast)


Lesenswert?

Echt?

Aber

PORTB = (1<<2);
PORTB = (1<<5);

sind doch zwei getrennte Zuweisungen, d. h. er verodert die?

von Peter (Gast)


Lesenswert?

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


von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Wenn es kein volatile wäre, dann könnte der Compiler die erste Zuweisung 
weglassen da sie keine Auswirkungen auf das Programm hat.

von johnny.m (Gast)


Lesenswert?

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

von Jupp (Gast)


Lesenswert?

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?

von johnny.m (Gast)


Lesenswert?

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

von Jupp (Gast)


Lesenswert?

> Das ist doch wohl völlig logisch, oder etwa nicht?

Absolut, war jetzt nur minimal am zweifeln...

von Armin O. (Gast)


Lesenswert?

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 ?

von Hannes L. (hannes)


Lesenswert?

Die Lösung steht hier:
Beitrag "Re: Frage zum Kompiler (allgemein)"

...

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
Noch kein Account? Hier anmelden.