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