Professor: ATtiny2313
avr-gcc: (AVR_8_bit_GNU_Toolchain_3.4.2_939) 4.7.2
Ich habe eine Frage an die C-Gurus, und zwar habe ich folgendes
"Problem".
Wie man im Assembler-Listing sehen kann, übersetzt avr-gcc diesen
Vergleich 16-bittig.
Warum ist das so und kann man es abstellen?
>> Probier's mal mit gescheitem Code. Nein, möglichst viel in eine Zeile zu> quetschen ist nicht gescheit.
Außer für Leute, die 'Professor: ATtiny2313' schreiben.
Was die Symbole statusbyte, RC5_INP und RC5_PIN bedeuten, ist wohl dein
Geheimnis, also kann man nur raten. Ich habe versucht, die fehlende
Information aus dem generierten Assemblercode zu rekonstruieren.
Wenn ich damit richtig liege, tut folgender C-Code dasselbe:
1
uint8_trc5inp=RC5_INP;
2
if(statusbyte.rc5_bit)
3
rc5inp=~rc5inp;
4
if(rc5inp&RC5_PIN){
5
...
6
}
GCC 6.2.0 macht daraus
1
in r24,0x13
2
sbic 0x10,4
3
com r24
4
sbrs r24,2
5
rjmp ...
was IMHO nicht weiter optimiert werden kann.
Übrigens:
Statt
Yalu X. schrieb:> Übrigens:>> Statt>> (ausdruck) ? 1 : 0>> kann man auch schreiben>> (bool)(ausdruck)
In C? Da gibts bool nur seit C99 und selbst dann ist es nur ein Integer
imho.
Sebastian V. schrieb:> In C? Da gibts bool nur seit C99 und selbst dann ist es nur ein Integer> imho.
"bool" ist per stdint.h definiert als _Bool und ist eine Integer, die
nur die Wert 0 und 1 annehmen kann: "When any scalar value is converted
to _Bool, the result is 0 if the value compares equal to 0; otherwise,
the result is 1."
Sebastian V. schrieb:>> (bool)(ausdruck)>> In C? Da gibts bool nur seit C99 und selbst dann ist es nur ein Integer> imho.
Wir haben jetzt das Jahr 2016 ;-)
Peter D. schrieb:> oder !!(ausdruck)
So hat man's vor 1999 gemacht.
Olaf Bellheim schrieb:> warum ist das so und kann man es abstellen?
nennt sich integral promotion und kann meist mit Compilerschaltern
abgeschaltet werden. Dann sind allerdings überläufe bei u16=u8a+u8b ohne
casts oder Umstellung möglich.
Olaf Bellheim schrieb:> Wie man im Assembler-Listing sehen kann, übersetzt avr-gcc diesen> Vergleich 16-bittig.
Weil auf AVR der Integer nur 16 Bit breit ist. Du kannst einen der
Operanden auf 32 Bit casten, dann sollte ein 32 Bit breiter Vergleich
dabei rauskommen.
Yalu X. schrieb:> Nur interessehalber: Hat mein Vorschlag von oben
Ich denke nicht, ich möchte den Flankenwechsel in der Bitmitte erkennen.
Das ganze basiert auf Peter Dannegers RC5-Code
Beitrag "Fernbedien RC5 Empfänger"
Olaf Bellheim schrieb:> Danke, der Cast hats gebracht. Jetzt siehts schon viel besser
Wie sieht denn der Code jetzt aus? Was genau sind d nn die Macros?
Ps: im C sind alle Bit-operationen mit int-operanden definiert.
Grüße, Adib.
--
Adib schrieb:> Ps: im C sind alle Bit-operationen mit int-operanden definiert.
Nein.
In C sind alle Operationen auf "schmaleren" Datentypen als int als
Operationen auf int definiert (integer promotion).
Ein optimierender Compiler darf das abkürzen, solange das Ergebnis
dasselbe bleibt, wie wenn er integer promotion durchgeführt hätte.
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