Taktzyklen >> << AVR

#635868
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
Gast #636035
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.
Gast #636063
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren