www.mikrocontroller.net

Forum: Compiler & IDEs WinAVR auch ohne Union optimierter Code möglich?


Autor: Ingo Stahl (ingo-s)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

Beispiel:

uint16_t my_int;
uint8_t  my_byte;

   my_int |= my_byte;

Kann man auch ohne Union verhindern, das der Compiler unnötiger Weise 
das high-byte von my_int mit 0 verodert?

Gruß Ingo

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ingo Stahl schrieb:
> Hi,
>
> Beispiel:
>
> uint16_t my_int;
> uint8_t  my_byte;
>
>    my_int |= my_byte;
>
> Kann man auch ohne Union verhindern, das der Compiler unnötiger Weise
> das high-byte von my_int mit 0 verodert?

ungetestet

  *(uint8_t*)&my_int |= my_byte;

Autor: Ingo Stahl (ingo-s)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

Karl heinz Buchegger schrieb:
>
> ungetestet
>
>   *(uint8_t*)&my_int |= my_byte;

es funktioniert schon in diese Richtung, nur noch eine Veroderung.

Da in meinem Falle noch etwas drum herum ist, wird der Gewinn an anderer 
Stelle wieder zunichte gemacht.
Vielen Dank für den Tipp, kann man sicherlich ab und zu mal gebrauchen.

Gruß Ingo

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:

>   *(uint8_t*)&my_int |= my_byte;

Von solchen Hacks würde ich dringend abraten. Type Punning kann 
einerseits zu unerwünschten Optimierungen führen und ist andererseits 
alles andere als hübsch.

@Ingo

Wenn du mit den 3-4 überflüssigen Ticks absolut nicht leben kannst: 
Verwende (Inline)-Assembler, nur der gibt dir garantiert bestimmte 
asm-Sequenzen.
Zudem ein Bugreport für die neueste GCC-Version (4.5.2 bzw. 4.6.0) 
machen, damit diese Optimierung vielleicht irgendwann Teil von avr-gcc 
wird.

Innerhalb von avr-gcc ist das Problem, daß es keinen Königsweg betreffs 
Subreg-Lowering gibt. Dieses geschieht in Pass .149r.subreg1 und 
.182r.subreg2 (in den Dumps mit -da)

Je nach Kontext ist es manchmal günstiger, dieses Lowering zu machen 
(also breite Variablen in 8-Bit-Stücke aufzuspalten), oder aber eine 
Variable in einem Stück zu belassen, so daß nachvollziehbar bleibt, was 
mit ihr geschieht: Ein Haufen von 8-Bit-Fragmenten ist eben nicht immer 
hilfreich...

Die Subreg-Lowering-Passes können mit -f[no-]split-wide-types 
aktiviert/deaktiviert werden, allerdings wird der Schalter nicht im 
avr-Backend berücksichtigt, und je nach Verschalterung sieht ein Backend 
andere Pattern und ist nicht auf deren Verarbeitung/Optimierung 
vorbereitet -- zumindest ist's im avr-Backend so.

Autor: Rolf Magnus (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
    my_int = (uint8_t)my_int | my_byte;

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nö, so gehts nicht.
Das obere Byte bleibt nicht erhalten und wird immer 0.

Autor: Rolf Magnus (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ups, das stimmt natürlich.

Autor: Ingo Stahl (ingo-s)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Johann
Mir ging es eher um den Flash-Speicher, bin mal wieder kurz vor der 4K 
Grenze. Aber was solls, mit Union's geht das ja sauber. Ich muss nur 
halt den Code auf die Unions umbauen.

@Rolf
> my_int = (uint8_t)my_int | my_byte;
Den Versuch habe ich hinter mir  - und wech ist der Balkon ääh, das 
highByte. Der Compiler macht genau das was man ihm sagt ;-)

Gruß Ingo

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.