Forum: Compiler & IDEs crc16.h aus Winavr


von Dennis H. (t1w2i3s4t5e6r)


Lesenswert?

Hallo!

Ich möchte gern eine CRC16 prüfung umsetzen. Dazu gibts ja eine 
wunderschöne Funktion im GCC in der CRC16.h. Doch ich kapier diese 
nicht. Ich habe mir hier im Wiki den Artikel zu CRC durchgelesen und 
soweit das Prinzip davon verstanden.

Doch jetzt frage ich mich, welche beiden Übergabewerte will die Funktion 
haben?

static _inline_ uint16_t
_crc16_update(uint16_t __crc, uint8_t __data)

Also welchen Wert meint hier __crc und welchen Wert __data?
Und was bekomme ich nun schlussletzendlich wieder zurück?

Das Polynominal wird ja als Zahlenwert in der Funktion geschrieben, 
nicht als Variable, also kann ich das ja schonmal nicht an die Funktion 
übergeben..

Ich kapiers einfach nicht, ich hoffe, es bringt jemand etwas Licht in 
mein Dunkel.

Danke dafür schonmal imm Voraus.


Dennis

von Timmo H. (masterfx)


Lesenswert?


von Dennis H. (t1w2i3s4t5e6r)


Lesenswert?

Timmo H. schrieb:
> http://www.nongnu.org/avr-libc/user-manual/group__util__crc.html

das hab ich soweit gelesen, dort ersehe ich raus, das dort mit crc und 
data eine xor Operation gemacht wird. Ich frage mich einfach, warum wird 
diese Operation vorher gemacht. Diese ist im Artikel über CRC so für 
mich nicht ersichtlich, deswegen verstehe ich sie nicht. Ich denke, wenn 
ich das kapiert habe, kann ich mir selber beantworten, welche Daten die 
Funktion haben möchte.

Ich denke, es ist einfach eine Art Code-Optimierung, die ich nicht 
kapiere.

Dennis

von Coder (Gast)


Lesenswert?

Willst Du die Funktion benutzen oder verstehen was passiert, ansonsten 
scheint das Beispiel doch verständlich zu sein.

von Stefan E. (sternst)


Lesenswert?

Dennis H. schrieb:
> Ich denke, wenn
> ich das kapiert habe, kann ich mir selber beantworten, welche Daten die
> Funktion haben möchte.

Nö, das ist ein Detail der Implementierung, dessen Verständnis dich wohl 
eher nicht deiner ursprünglichen Fragestellung näher bringt. Das erste 
Code-Beispiel unter dem Link ist das, was dir zeigt wie die 
CRC-Funktionen zu verwenden sind. Das ist es, was du studieren solltest. 
Das ist eigentlich ziemlich selbsterklärend.

von Dennis H. (t1w2i3s4t5e6r)


Lesenswert?

Ich will sie nur verwenden. Für mich heißt das, ich gebe dieser Funktion 
meine Variable, die ich gern mit einer prüfsumme versehen möchte. Und 
ich bekomme genau meine Variable plus Prüfsumme wieder. Eine Variable 
übergeben, eine zurück bekommen. Diese Funktion will aber zwei Variablen 
übergeben bekommen..


Dennis

von Stefan E. (sternst)


Lesenswert?

Dennis H. schrieb:
> Eine Variable
> übergeben, eine zurück bekommen. Diese Funktion will aber zwei Variablen
> übergeben bekommen..

Weil eine CRC nun mal eher selten für nur eine Variable benutzt wird, 
sondern für einen ganzen Block von Daten. Der eine Parameter ist die 
aktuelle (fortlaufende) CRC, der Zweite das nächste Datenbyte, und der 
Rückgabewert ist die neue CRC.

von Dennis H. (t1w2i3s4t5e6r)


Lesenswert?

Oh Man, Asche auf mein Haupt, das hätte ich wirklich selber sehen 
sollen, ich danke dir, das du es mir trotzdem erklärt hast.


Dennis

von Heinz (Gast)


Lesenswert?

Naja, intuitiv finde ich es aber auch nicht grade.

Wieso nimmt die Funktion nicht einfach einen Zeiger und eine 
Längenangabe entgegen?
Spricht da vom Prinzip her was dagegen?

von Sauger (Gast)


Lesenswert?

Moin,

wenn du seriell reinkommende Daten (Stream) immer erst komplett puffern 
kannst, nichts.

MfG

von Stefan E. (sternst)


Lesenswert?

Heinz schrieb:
> Wieso nimmt die Funktion nicht einfach einen Zeiger und eine
> Längenangabe entgegen?
> Spricht da vom Prinzip her was dagegen?

Es wäre weniger flexibel. Weiteres Beispiel neben dem, was "Sauger" 
geschrieben hat, wenn die Datensätze unterschiedliche Längen haben 
können und mit einer Terminierung versehen sind (z.B. Strings), dann 
müsste der Datensatz zweimal durchlaufen werden. Einmal in der 
CRC-Funktion und einmal vorab, um überhaupt erst mal die Länge 
festzustellen.

So kann man einfach einen Wrapper darum legen, der dann das gewünschte 
Interface hat. Z.B. dein Zeiger/Länge-Interface, oder eines wo nur ein 
Zeiger übergeben wird (bei fester Länge, oder bei Terminierung), oder 
die Wrapper-Funktion liefert die CRC gar nicht zurück, sondern fügt sie 
gleich dem Datensatz hinzu, oder ...

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.