Gast
#635861
Hallo! Ich hätte mal eine Frage: Wie schnell schafft ein AVR (mit gcc programmiert) die Bitshiftoperation << bzw. >>?
|
Anzeige
|
Taktzyklen >> << AVR
Gast
#635861
Hallo! Ich hätte mal eine Frage: Wie schnell schafft ein AVR (mit gcc programmiert) die Bitshiftoperation << bzw. >>? irgendwas zwischen 0 und unendlich. 0 Taktzyklen wenn der Compiler das statisch ausrechnen kann und einfach nur eine Konstante einsetzt, unendlich bei einem fehlerhaft überladenen operator... Dazwischen gibts viele Sonderfälle, z.B. beim shiften eines 32Bit wertes um 8 bits kann der Compiler einfach die Register "umbenennen"... Wenns auf Taktzyklen genauen code ankommt, in Assembler programmieren, sonst klappts bei der nächsten GCC version mit geändertem Optimierer eh nichtmehr. /Ernst
Gast
#635968
Die Frage war offensichtlich falsch. Die korrekte Frage war : Wie schnell geht ein bitshift in ASM. => Antwort 1 Zyklus fuer eine position. Die Antwort ist auch nicht ganz korrekt: Korrekt wäre: 1 Takt pro 8bit
Gast
#636016
>Wie schnell schafft ein AVR (mit gcc programmiert) die Bitshiftoperation > << bzw. >>? Und wie ist es mit unsigned long ? sector = sector << 9;
Gast
#636021
Unsigned 32 bit shift 9 bedeutet 1 byte nullen, 3 byte umkopieren und jeweils je um eins schieben.
Gast
#636035
>Unsigned 32 bit shift 9 bedeutet 1 byte nullen, 3 byte umkopieren und >jeweils je um eins schieben. Völlig korrekt Seph. Problematisch wirds wenn statt einer konstanten 9 eine Variable mit Wert 9 verwendet wird. Dann kann der Compiler nix mehr optimieren. Dann wird wirklich 9 mal über 4 Bytes geschoben. Wie lange ein Shifting dauert hängt extrem vom Quellcode ab.
Gast
#636059
ok... nehmen wir mal an: value, n sind uint8 value = value << 4; sowie value = value << n; mit n nicht zum Kompilierzeitpunkt bekannt
Gast
#636063
Das erste sollte (deshalb kann man sich die .lss-Files anschauen) zu
swap value
andi value, 0xF0
werden, d.h. zwei takte
das andere wird zu einer schleife, à la (vorsicht, pseudocode)
shift:
lsl value
dec n
brne shift
Also mindestens 3 Takte, ABER n muss vorher noch auf 0 überprüft werden,
also nochmal + 2 (oder 3 ?) Takte.
Maximal (sinnvoll) wäre 4*7, (möglich) wäre 4*255 - das wäre aber schon
ein Programmfehler - oder man muss auf n <= 7 überprüfen (wieder 2 bis 3
Befehle/Takte).
Also schnapp dir deinen Compiler, dein passendes AVR-Datasheet und das
"AVR Instruction Set" (noch ein PDF von Atmel) und find's selber raus ;)
hth. Jörg
Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|