mikrocontroller.net

Forum: Compiler & IDEs Unsigned Char vergleich beim AVR GCC


Autor: Clemens Helfmeier (sum)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich habe jetzt schon diverse stellen gefunden, die der GCC einfach mal
miserabel löst. Hier die für mich bedeutenste:
  44:dcf77.c       ****     if ((unsigned char)((unsigned
char)dcf77_State & (unsigned char)DCF77_StateMask) != (unsigned
char)DCF77_StateSense) return;
 147                 .LM5:
 148 0016 8091 0000     lds r24,dcf77_State
 149 001a 9927          clr r25
 150 001c 8C70          andi r24,lo8(12)
 151 001e 9070          andi r25,hi8(12)
 152 0020 0C97          sbiw r24,12
 153 0022 41F4          brne .L2

Es ist alles nach (unsigned char) gecastet und dennoch macht der gcc
daraus eine Integer operation (16 Bit). Erst wenn ich eine Register
variable definiere, die den berechneten Wert erhält, wird der Vergleich
ein simpler 8-Bit-Vergleich:
  43:dcf77.c       ****   register unsigned char temp = (dcf77_State &
DCF77_StateMask);
 146                 .LM5:
 147 0014 8091 0000     lds r24,dcf77_State
 148 0018 8C70          andi r24,lo8(12)
  45:dcf77.c       ****   if (temp != DCF77_StateSense) return;
 150                 .LM6:
 151 001a 8C30          cpi r24,lo8(12)
 152 001c 41F4          brne .L2

Wieso bekommt er das nicht auch schon beim casten hin oder merkt es gar
selber, dass nur 8-bit-Werte beteiligt sind?

Irgendwie hat Assembler schon so seine Vorteile.

Schöne Grüße, Clemens

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn die avr-libc nicht benötigt wird, wirkt -mint8 bisweilen Wunder.

Autor: Clemens Helfmeier (sum)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ja, das geht wohl. Allerdings werden dann meine unsigned short
variablen auch alle nur  bit lang :(.

Also kein Ausweg bisher.

danke schonmal und schöne Grüße, Clemens

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

kurz:
Der C-Standard verlangt das so.

lang:
Forensuche.

Matthias

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn man im eigenen Programm konsequent die Typen aus stdint.h
verwendet, ist -mint8 nur dann Problem, wenn man 32bit braucht und
nicht ersatzweise mit 64bit leben kann. Oder wenn man printf() und
ähnliche aus der libc benötigt.

Der C Standard verlangt zwar, dass int >= 16bit und dass alle Rechnung
so ausgeführt wird, als ob alles kleinere zu 16bit konvertiert wird.
Aber er verlangt natürlich nur, dass das Ergebnis diesem Verfahren
entspricht. Wenn sich das exakt gleiche Ergebnis wie hier mit reiner
8bit-Rechnung ermitteln lässt - warum nicht?

Es gibt schon so ein paar Ecken im Compiler, die einen erstaunen
können. So neigt er bei manchen 2-er-Potenz Bitmasken dazu, den
Operanden erst umständlichst nach rechts zu schieben um dann Bit 0
testen zu können, statt gleich auf's gewünschte Bit loszugehen. Nobody
is perfect, auch gcc/avr nicht.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wenn sich das exakt gleiche Ergebnis wie hier mit reiner
> 8bit-Rechnung ermitteln lässt - warum nicht?

Klar, es müsste ihm ,,nur'' jemand beibiegen.  Da alle
Architekturen,
für die am GCC ,hauptberuflich' gebaut wird, dieses Problem aber
nicht
haben (deren Register sind eh' alle 32 bits breit), muss sich da wohl
jemand aus der Microcontroller-Ecke drum kümmern, dass derartige
Optimierungen eingebaut werden.

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist ja das ulkige daran, die Optimierungen sind schon drin. Meist
macht er es auch richtig, nur manchmal nicht, dann aber ist jeder Cast
wirkungslos. Eine Logik dahinter konnte ich noch nicht erkennen.

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.