Forum: Mikrocontroller und Digitale Elektronik Taktzyklen >> << AVR


von Lukas (Gast)


Lesenswert?

Hallo!
Ich hätte mal eine Frage:
Wie schnell schafft ein AVR (mit gcc programmiert) die Bitshiftoperation 
<< bzw. >>?

von Εrnst B. (ernst)


Lesenswert?

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

von Labberer (Gast)


Lesenswert?

Die Frage war offensichtlich falsch. Die korrekte Frage war : Wie 
schnell geht ein bitshift in ASM. => Antwort 1 Zyklus fuer eine 
position.

von Benedikt K. (benedikt)


Lesenswert?

Die Antwort ist auch nicht ganz korrekt:
Korrekt wäre: 1 Takt pro 8bit

von holger (Gast)


Lesenswert?

>Wie schnell schafft ein AVR (mit gcc programmiert) die Bitshiftoperation
> << bzw. >>?

Und wie ist es mit unsigned long ?
sector = sector << 9;

von Seph (Gast)


Lesenswert?

Unsigned 32 bit shift 9  bedeutet 1 byte nullen, 3 byte umkopieren und 
jeweils je um eins schieben.

von holger (Gast)


Lesenswert?

>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.

von Lukas (Gast)


Lesenswert?

ok... nehmen wir mal an:
value, n sind uint8

value = value << 4;

sowie

value = value << n;

mit n nicht zum Kompilierzeitpunkt bekannt

von Jörg X. (Gast)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.