Forum: Mikrocontroller und Digitale Elektronik CRC16 Prüfsumme über Flash bilden. Wie prüfen ob korrekt?


von Felix N. (felix_n888)



Lesenswert?

Guten Tag,

Ich versuche zurzeit eine CRC16 Prüfsumme über den Flash meines 
ATMega2560 zu bilden. Dazu habe ich mich mit CRC etwas beschäftigt und 
mir eine kleine Funktion geschrieben. Mein Wissen was CRC Prüfsummen 
angeht ist ehr ganz grob ich weiß wie sie in etwa funktionieren aber 
nicht genau bis ins Detail.

An sich braucht man dieses glaubig nur wenn man bestimmte ISO/EN 
Richtlinien erfüllen muss für eichbare Messgeräte, Medizinische Geräte 
etc... Mein Aquarium Controller wird wohl nicht darunter fallen. Möchte 
es aber trotzdem ausprobieren.

Die Funktion sieht wie folgt aus:
1
void performCRC16onFlash(void) {
2
    uint32_t currentAddr;
3
    uint8_t data;
4
    uint16_t crc = 0;
5
6
    //Calculate CRC16
7
    for(currentAddr = 0; currentAddr < 0x1FDFF; currentAddr++) {
8
        data = pgm_read_byte_far(currentAddr);
9
        crc = _crc16_update(crc, data); 
10
    }
11
    flashCRC = crc;
12
}

Funktionieren scheint sie zu tun, denn wenn ich das Programm hochlade 
kommt im Seriellen Terminal die Prüfsumme 0x28B7 angezeigt. Ändere ich 
das Programm und lade es erneut hoch ist die Prüfsumme eine andere. 
Starte ich den Controller per External Reset neu oder Power Up wird 
immer wieder die gleiche Prüfsumme angezeigt. Ich nutze dafür die 
vorhanden Funktionen in der util/crc16.h Datei.

Wo ich mir noch nicht sicher bin ist die Endadresse, also bis wohin die 
for Schleife durchlaufen soll. Im Moment steht als Endadresse der Wert 
0x1FDFF drin.

Im Datenblatt habe ich unter Punkt 8 "AVR Memories" die "Program Flash 
Memory Map" gefunden. Dort steht drin das der Flash von Adresse 0x0 bis 
0x7FFF/0xFFFF/0x1FFFF.

Ich verwende den ATMega2560 mit 256kB an Flash also müsste die Absolute 
Flashendadresse inkl. Bootloader Section 0x1FFFF sein.

Um zuschauen bis wohin nun mein Flash für den eigentlichen 
Programmspeicher geht habe ich weiter unten im Datenblatt mir die 
Tabelle 29-13 "Boot Size Configuration, ATMega2560/2561" angeschaut.

Die High Fuses ist auf 0xDE(1101 1110) gesetzt. Die beiden BOOTSZ1/0 
Bits sind somit auf 1 gesetzt also unprogrammiert.

(Warum hat man das da eigentlich vertauscht? Also 0=programmiert und 
1=unprogrammiert verwirrt doch nur oder nicht?)

Wenn die beiden Bits nun auf 1 steht müsste doch die Bootgröße 512 Bytes 
betragen oder ist das hier wieder genau anderes rum dann wären es 
nämlich 4096 Bytes? Ich bin jetzt davon ausgegangen das die Bootgröße 
512 Bytes beträgt demnach geht mein Flash von 0x00000 bis 0x1FDFF daher 
auch der Wert in der for-Schleife.

Doch wie kann jetzt überprüfen ob die von Mikrocontroller gebildete 
Prüfsumme richtig ist? Mit 7-Zip kann ich die Prüfsumme der .hex Datei 
anzeigen lassen, jedoch nur CRC-32/64. Und die .hex Datei enthält doch 
auch andere Daten als nur den Flash oder nicht? Zum Beispiel die RAM 
Daten die später von dort in den RAM reinkopiert werden. Also würde die 
Datei zu vergleichen mit CRC16 kein Sinn machen oder?

Ich habe auch mal gelesen das man mit Hilfe eines anderen Tools während 
die .hex Datei erstellt wird eine Prüfsumme(CRC) gebildet wird über den 
entsprechenden Programmspeicher und dann an einer definierten Stelle in 
die Hex Datei "injiziert" wird, also die erstellte CRC. Diese Adresse 
wird dann im Programmcode hinterlegt. Der Controller berechnet die 
Prüfsumme bis zu diese Adresse und vergleicht diese dann miteinander die 
sollten dann identisch sein.

Kann mir jemand sagen wie ich die Prüfsumme überprüfen kann? Bzw. ob 
mein "Flash-End Adresse" richtig gewählt ist?

Mfg

von Erich (Gast)


Lesenswert?

GOOGLE: crc16 online tool

1.) https://crccalc.com/
Scheint neu zu sein

2.) https://www.lammertbies.nl/comm/info/crc-calculation
altbekannt

von Thomas Z. (usbman)


Lesenswert?

nun ja eigentlich gibt es bei CRC kein richtig oder falsch. Du 
berechnest den CRC Wert über einen Speicherbereich und wenn das Ergebnis 
abweicht ist etwas anders.
Der Wert spielt dabei überhaupt keine Rolle nur gleich ungleich. Da es 
zig Verfahren zur CRC Berechnung gibt gibt e auch zig Ergebnisse.

Solange du aber immer das gleiche Verfahren zur Berechnung anwendest ist 
auch das Ergebnis immer gleich. Was du also brauchst ist ein Tool was 
die aus deinem binary (oder HexFile) mit dem gleichen Verfahren eine CRC 
berechnet.

von Felix N. (felix_n888)


Lesenswert?

Erich schrieb:
> GOOGLE: crc16 online tool

Die meisten Online Calculator habe ich schon durch.

Für die meisten Calculator ist meine Hex Datei zu groß mit 402kB und 
9152 Zeilen. Entweder passt es nicht rein, oder die Berechnung wird mit 
einem Fehler abgebrochen.

Hatte auch ein gefunden der ganze Dateien annimmt jedoch sagt der nur 
"Invalid Hex File Input".

Mfg

von Erich (Gast)


Lesenswert?


von Thomas Z. (usbman)


Lesenswert?

Die Hex Datei durch den CRC zu jagen ist ziemlich sinnlos wenn du den 
CRC hinterher über die Binärdaten im Flash machst...

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.