Das ist funktional völlig anderer Code, es müssen 2 Zugriffe
nacheinander auf PINB gemacht werden. Und dazwischen könnte ein
Interrupt kommen, d.h. dann sind viele µs Unterschied, statt
gleichzeitig.
Das PINB ist nur als Beispiel gemeint. Es kann auch ein IO-Register im
RAM-Space sein (>0x0100).
Peter
Peter Dannegger schrieb:> Statt 6 Byte kostet der Vergleich 12 Byte (= 200%).
Kann ich bei mir nachvollziehen.
> Aber nur, wenn der Test auch Bit 0 enthällt.
Stimmt nicht, benutze mal
if( PINB & (1<<PB0 | 1<<PB2))
Hier wird wieder die kurze Variante vom Compiler gewählt.
> Ich benutze WINAVR 2010.
Ich normalerweise auch, konnte aber das Problem sogar mit
WinAVR-20090313 nachstellen.
EDIT:
Das Problem scheint nur in der Kombination PB0 und PB1, also (PINB &
3), aufzutreten. Ich habe keine andere hinbekommen.
Frank M. schrieb:> Das Problem scheint nur in der Kombination PB0 und PB1, also (PINB &> 3), aufzutreten. Ich habe keine andere hinbekommen.
Also bei geht alles von Bit 0 aufsteigend, also Maske 3, 7, 15, 31, 63,
127.
Mit Lücke oder ohne Bit 0 wirds kurz.
Hier mal die Funktion, wo es mir aufgefallen ist:
Jörg Wunsch schrieb:> Peter Dannegger schrieb:>> avr-gcc-4.7.1-rc1-mingw32.zip>> Da 4.7.1 bereits released ist, würde ich keinen RC ("release> candidate") mehr nehmen.
Diesen Link habe ich in AVR Freaks "avr-gcc 4.7.0 for the brave"
gefunden:
http://sourceforge.net/projects/mobilechessboar/files/avr-gcc%20snapshots%20%28Win32%29/
Hast Du nen Link ohne RC?
Irgendwie fehlt ja nach WINAVR 2010 ne offizielle Anlaufstelle für neue
Versionen zum Downloaden.
Peter
Peter Dannegger schrieb:> Hast Du nen Link ohne RC?
Nein, ich bau' mir meine Compiler ohnehin immer selbst. ;-) 's ist
ja keine Raketenwissenschaft, das zu tun.
Adib schrieb:> dass bit operationen im C als int> behandelt werden.
Der C-Standard ist ein "als wäre"-Standard: die Operationen müssen
sich so verhalten, als wären sie als "int" behandelt worden. Wenn
aber das obere Byte zum Ergebnis nichts beiträgt, steht es dem
Compiler sehr wohl frei, nur das niederwertige Byte überhaupt
ausrechnen zu lassen.
Eine eigene Frage?
Dieser Thread ist über 14 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.