Warum hängt der AVR-GCC so an 16Bit bei 8Bit Berechnungen?
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
Statt 6 Byte kostet der Vergleich 12 Byte (= 200%). Aber nur, wenn der Test auch Bit 0 enthällt.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
Ich benutze WINAVR 2010. Peter
|
Anzeige
|
AVR-GCC 16Bit-Lastigkeit nervtWarum hängt der AVR-GCC so an 16Bit bei 8Bit Berechnungen?
Statt 6 Byte kostet der Vergleich 12 Byte (= 200%). Aber nur, wenn der Test auch Bit 0 enthällt.
Ich benutze WINAVR 2010. Peter
Gast
#2830018
was passiert bei:
? 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. Bei avr-gcc 4.7.0 und 4.7.1 besteht dieses Problem nicht mehr. Vielleicht solltest Du doch mal auf einen neueren Compiler wechseln ;-) 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:
Frank M. schrieb: > Vielleicht solltest Du doch mal auf einen neueren Compiler wechseln ;-) Ist die zu empfehlen: avr-gcc-4.7.1-rc1-mingw32.zip Peter 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. Peter Dannegger schrieb: > Ist die zu empfehlen: > > avr-gcc-4.7.1-rc1-mingw32.zip Hier ein Posting von Johann zur Wahl des avr-gcc: Beitrag "Re: 16Bit aus 2x 8Bit, falsches Ergebnis bei Funktionsrückgabe" 4.7.1 ist also okay (aber nicht unbedingt rc1), 4.7.0 weniger. 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. 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. Wobei diese RC1 Bugfixes anthält, die in der offiziellen 4.7.1 nicht enthalten sind ;-) Siehe die Patches in ./source GCC: http://gcc.gnu.org/PR53595 Binutils: http://sourceware.org/PR13899 http://sourceware.org/PR14058 Jörg Wunsch schrieb: > Nein, ich bau' mir meine Compiler ohnehin immer selbst. ;-) > 's ist ja keine Raketenwissenschaft, das zu tun. >> "Come on, Rory. It's not rocket science. It's just quantum physics."
Gast
#2832607
irgendwo hatte ich mal gelesen, dass bit operationen im C als int behandelt werden. Das würde das Type-Casting erklären. Adib. 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. Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|