Manuel schrieb:
> jedes zweite mal einen vierfach Shift
Nibbletausch ist vielleicht sogar als ein einzelner Befehl verfügbar.
Ich kenn mich mit deinem Proz jetzt nicht aus, das kann man aber mit
einem Blick auf den Befehlssatz einfach eruieren.
Der Switch mit 4 Pfaden ließe sich auch noch runterbrechen:
Mal als Überlegung: bei jeder geraden Zahl, also 0 und 2, muss der
Nibbletausch gemacht werden, sonst nicht.
Bei Zahlen größer gleich 2 muss auf das hibyte addiert werden, sonst auf
das lowbyte. Dazu kann man dem Compiler auf die Sprünge helfen, indem
man sich die 16bit Variable als Union aus einer 16bit Zahl und zwei
8bit-Zahlen macht.
Also im Code dann vllt. sowas:
einlesepuffer = Port_input_Symbol;
if(!(counter & 0x01))
{
tausche_nibbles(&einlesepuffer);
}
if(counter & 0x02)
{ //Zweig, wenn in counter das 0x02 bit gesetzt ist, counter >= 2
meine16bitzahl.hibyte += einlesepuffer;
}
else
{ //Zweig, wenn in counter das 0x02 bit gesetzt ist, counter < 2
meine16bitzahl.lobyte += einlesepuffer;
}
counter++;
if(counter & ~0x03)
{ //Wenn counter größer als 3 ist
x = meine16bitzahl.ganzezahl;
meine16bitzahl.ganzezahl = 0;
counter = 0;
}
Deine Variante ist natürlich weitaus übersichtlicher und
verständlicher...
Wenn der compiler gut ist, werden ifs und/oder switches in eine
Sprungadressberechnung übersetzt. Das ist weitaus schneller, als alle
Switch-zweige einzeln abzuklappern:
Wenn du sowas wie
if(irgeneinezahl > 123)
tuediesundjenes();
schreibst, wird diese Bedingung z.B. in eine Subtraktion und ein jump
lower zero übersetzt.
Wenn jetzt in einem Switch alle cases einzeln untersucht werden müssen,
braucht das nat. Rechenzeit und Flash.
Aber man sollte es auch nicht übertreiben :D
mfg mf