mikrocontroller.net

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


Autor: Armin O. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Josef (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sieh dir die generierte Assembler-Datei an.


Sg Josef

Autor: Peter Dannegger (peda)
Datum:

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


Peter

Autor: Jupp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Echt?

Aber

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

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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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


Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

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

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Jupp (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Jupp (Gast)
Datum:

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

Absolut, war jetzt nur minimal am zweifeln...

Autor: Armin O. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Hannes Lux (hannes)
Datum:

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

...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.