Forum: Mikrocontroller und Digitale Elektronik AVR Bootloader Checksummen-Berechnung


von Markus (Gast)


Lesenswert?

Hallo,

Ich habe einen CAN-Bootloader geschrieben, der brennt auch alle Bytes 
richtig in das Flash (mit Auslesen und Hex-Datei vergleichen bestätigt).

Nun zum Problem:
ca. 300ms nach dem alle Bytes gebrannt sind wird die Checksumme über den 
gesammten Flash (ohne Bootloader) errechnet und der zeigt die falsche 
Zahl. Wenn ich zum zweiten mal diese Funktion starte, dann wird die 
richtige Zahl gezeigt.

Der Code:
1
// Liest den Flash aus und generiert eine Checksumme
2
unsigned int GetFlashChksSum()
3
{
4
  unsigned int iChk = 0x0001; // 1 hinzuzählen, damit in jedem Fall nicht 0xFFFF / 0x0000 raus kommt
5
  unsigned long iAdr;
6
  boot_rww_enable();
7
  for (iAdr = 0; iAdr < 0x1E000; iAdr += 2)
8
     iChk ^= pgm_read_word_far(iAdr);
9
  return iChk;
10
}

AT90CAN128 / GNU GCC 4.3.1 / AVRStudio

Und, was hat es mit dem "boot_rww_enable();" auf sich, ich hab es nicht 
ganz verstanden, nur so viel, dass es den braucht wenn der Bootloader 
die Applikation starten soll.

Vielen Dank für eure Unterstützung.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Hast Du Deine Variable für die Prüfsumme erstmalig initialisiert? Das 
RWW-Enable-Funktion ist notwendig, um die Applikations-Sektion im Flash 
nach einem PageWrite / PageErase-SPM-Befehl wieder zu entriegeln. Siehe 
Datenblatt des AVR.

von Markus (Gast)


Lesenswert?

Ja, natürlich, das ist doch diese Zeile:

unsigned int iChk = 0x0001;

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

C ist nicht meins. War ja auch nur ´ne Frage. Vielleicht bügelst Du Dir 
ja noch woanders ´was über.

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.