Forum: Mikrocontroller und Digitale Elektronik Big to Little Endian (AVR32)


von Hans (Gast)


Lesenswert?

Bin grade dabei eine funktion zu schreiben die mir von Big in Little 
Endian umwandelt d.h:
1
char Data =0x02;

wird beim Avr ja Big Endian
MSB 6 5 4 3 2 1 LSB

bräuchte aber:
LSB 1 2 3 4 5 6 MSB

nur ich kann nicht direkt auf die Bits zugreifen. Wäre dann am 
einfachsten mit einer Schleife drüber und vertauschen. Gibt es sonst 
noch irgendwelche "einfachen" und schnellen Möglichkeiten?

von Johann (Gast)


Lesenswert?

Sowas? Falls es schneller sein soll geht evtl. ne 256 Byte große 
Lookup-Table, hängt dann aber von der Geschwindigkeit Deines Speichers 
ab ob das signifikant schneller ist.
1
uint8_t be2le (uint8_t in)
2
{
3
   uint8_t out = 0;
4
5
   out |= in & 1; out <<= 1; in >>= 1;
6
   out |= in & 1; out <<= 1; in >>= 1;
7
   out |= in & 1; out <<= 1; in >>= 1;
8
   out |= in & 1; out <<= 1; in >>= 1;
9
   out |= in & 1; out <<= 1; in >>= 1;
10
   out |= in & 1; out <<= 1; in >>= 1;
11
   out |= in & 1; out <<= 1; in >>= 1;
12
   out |= in & 1; 
13
14
   return out;
15
}

Oder Inline Assembler...

von Matthias L. (Gast)


Lesenswert?

Habs nie probiert, ist irgendwo aus der Codesammlung (von peda)
1
unsigned char mirror( unsigned char n )
2
{
3
  n = ((n >> 1) & 0x55) | ((n << 1) & 0xaa);
4
  n = ((n >> 2) & 0x33) | ((n << 2) & 0xcc);
5
  n = ((n >> 4) & 0x0f) | ((n << 4) & 0xf0);
6
  return n;
7
}

von Matthias (Gast)


Lesenswert?

Steh ich grad aufm Schlauch?

Ich dachte das Zeugs mit dem Little-Big-Endian bezieht sich nur auf die
Bytefolge, und nicht auf die Bitfolge!?

von SoLaLa (Gast)


Lesenswert?

ich als Neuling mal wieder... in Assembler müßte
LSL Rn
ROR Rm
LSL Rn
ROR Rm
LSL Rn
ROR Rm
LSL Rn
ROR Rm
LSL Rn
ROR Rm
LSL Rn
ROR Rm
LSL Rn
ROR Rm
LSL Rn
ROR Rm

in 16 Takten das Ergebnis der Wandlung von Rn in Rm zurückgeben da das 
CarryFlag dazwischen nicht beeinflußt wird

von Freizeitbastler (Gast)


Lesenswert?

Ich verstehe die Frage nicht. Big/Little Endian legen die physikalische 
Reihenfolge der Bytes von Zahlen oder Zeigern fest, die mehr als ein 
Byte belegen. In der Frage taucht nur ein "char", also ein Byte auf. Die 
Bitreihenfolge in einem Byte bzw. char ist in C immer dieselbe. Als 
einziger unterschied kann "char" "signed char" oder "unsigned char" 
bedeuten, aber das war ja wohl nicht gemeint.

http://de.wikipedia.org/wiki/Byte-Reihenfolge

von Hans (Gast)


Lesenswert?

Ja! Danke!

von yalu (Gast)


Lesenswert?

> Ja! Danke!

Bedeutet das "Ja", dass du die Umkehr der Bitreihenfolge gar nicht
benötigst? Wenn doch, hier sind auch noch ein paar Varianten und eine
intensive Diskussion dazu:

http://www.avrfreaks.net/index.php?name=PNphpBB2&file=printview&t=65618&start=0

von Hans (Gast)


Lesenswert?

Nein! Ich brauche genau das!  das MSB zu LSB wird und so weiter!

von Dieter W. (dds5)


Lesenswert?

Das ist aber dann bit-reversing und hat nichts mit endianess zu tun.

von SoLaLa (Gast)


Lesenswert?

hmmm... wir wissen ja jetzt nicht, wozu das gut sein soll,
aber:
beim PPC ist es jedenfalls oft so, daß schaltungstechnisch D31 bis D0 an 
Flashbausteine D0 bis D31 verdrahtet werden. Und damit eben reversed 
order.
Die Tools, die man dann aufm PC benutzt um das ganze anzuzeigen "biegen" 
das ganze dann ja wieder in eine lesbare Form

von Andreas K. (a-k)


Lesenswert?

Wie wär's damit:
1
unsigned __inline bitreverse(unsigned x)
2
{
3
    asm("brev %0" : "+r"(x));
4
    return x;
5
}

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.