Forum: Mikrocontroller und Digitale Elektronik CRC8 bei mehreren Bytes? Denkfehler?


von Alexander I. (daedalus)


Lesenswert?

Hallo,

grundsätzlich ist mir klar wie CRC funktioniert und ich krieg es auch 
für ein Byte auf dem Papier hin. Und bevor die schlauen "Frag doch 
<Wissensdatenbank bzw. Suchmaschine deiner Wahl>"-Posts kommen möchte 
ich meine Frage doch konkretisieren:

Ich habe einen CRC8 (0x99) und 8 Bytes Nutzdaten. Ich fange also an das 
erste Byte zu nehmen und an diesem den CRC-Algorithmus anzuwenden. Hänge 
ich dann an jedes Byte für die Berechnung separat erstmal die 7 Nullen 
an (Anzahl Bits in Generatorpolynom - 1) oder nehme ich statt der Nullen 
die 7 Bits des nachfolgenden Bytes und hangle mich bis zum 8. Byte durch 
und füge diese 7 Nullen erst am Ende des 8. Nutzdaten-Bytes an?

Oder wird die CRC für jedes Byte seperat durchgeführt und die jeweiligen 
Divisionsreste irgendwie aufaddiert?

Zwar steht in der Wikipedia eine C-Referenz-Implementierung, doch auch 
diese beantwortet mir nicht meine Frage, da wiedermal nur 8 Bits 
genommen werden grr.

Ich hoffe ihr könnt mir kurz auf die Sprünge helfen ...
Vielen Dank!

von Falk B. (falk)


Lesenswert?

@  Alex Wurst (daedalus)

>ich dann an jedes Byte für die Berechnung separat erstmal die 7 Nullen
>an

NEIN!

> (Anzahl Bits in Generatorpolynom - 1) oder nehme ich statt der Nullen
>die 7 Bits des nachfolgenden Bytes und hangle mich bis zum 8. Byte

JA!

> durch
>und füge diese 7 Nullen erst am Ende des 8. Nutzdaten-Bytes an?

ja, dort steht im allgemeinen die CRC, welche bei der Berechnung mit 
Null gefüllt ist.

>Oder wird die CRC für jedes Byte seperat durchgeführt

NEIN.

Siehe CRC und

http://www.employees.org/~surendra/asic/crc.html

MfG
Falk

von Alexander I. (daedalus)


Lesenswert?

Super, das war sehr hilfreich!

Nun noch eine Frage:
Wäre es sinnvoll die 8 Bytes in EINEN Datentyp zu packen? z.B. 
uint64_t oder gibt es eine hübsche Methode wie ich mich z.B. durch einen 
char-Array hangeln kann? Ich kann ja nicht ohne "<<" und 
">>"-Kunststücken bit-genau adressieren?

Also quasi nach dem Motto "das Bit was du jetzt hinten anhängst, ist das 
5. Bit vom 2. Byte im Datenstrom der aus 8 Bytes besteht".

Wie gehe ich dann vor wenn ich z.B. über 256 Bytes eine CRC8-Prüfsumme 
durchführen will die möglichst effizient arbeitet? (z.B. auf einem 8-Bit 
µC mit wenig RAM und Rechenleistung).

von Falk B. (falk)


Angehängte Dateien:

Lesenswert?

@  Alex Wurst (daedalus)

>Wäre es sinnvoll die 8 Bytes in EINEN Datentyp zu packen? z.B.
>uint64_t

Nein.

> oder gibt es eine hübsche Methode wie ich mich z.B. durch einen
>char-Array hangeln kann?

Ne For Schleife?

>Ich kann ja nicht ohne "<<" und
">>"-Kunststücken bit-genau adressieren?

Abse sicher, Schiebeoperatioen sind die Grundlage der CRC.

>Wie gehe ich dann vor wenn ich z.B. über 256 Bytes eine CRC8-Prüfsumme
>durchführen will die möglichst effizient arbeitet?

Möglichst Clever.

> (z.B. auf einem 8-Bit
>µC mit wenig RAM und Rechenleistung).

Hab ich mal in ASM in verschiedensten Variabten durchgespielt, siehe 
Anhang.
Such dir deine Lieblingsroutine aus und konvertier sie in C.

MFG
Falk

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.