www.mikrocontroller.net

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


Autor: Lukas (Gast)
Datum:

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

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Labberer (Gast)
Datum:

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

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

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

Autor: holger (Gast)
Datum:

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

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

Autor: Seph (Gast)
Datum:

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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lukas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok... nehmen wir mal an:
value, n sind uint8

value = value << 4;

sowie

value = value << n;

mit n nicht zum Kompilierzeitpunkt bekannt

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.