Forum: Mikrocontroller und Digitale Elektronik Bootloader CRC


von clonephone82 (Gast)


Lesenswert?

Hallo Zusammen,

Eine Frage ist hier jemand der vielleicht auch einen Bootloader 
verwendet auf einem XMC4500 oder STM32 der auch CRC geschützt die 
Applikation anspringt. Also ich rede nur von einem Bootloader und von 
einer Applikation. Es gibt ja auch andere varianten. Ich mach das 
eigentlich schon lange - komme aus der XC167 und XE167 Welt. Bei den 
Controllern habe ich das immer so gemacht das ich mit SRecord an einen 
bestimmten bereich im Flash die CRC geschrieben habe. Beim Booten habe 
ich dann die CRC überprüft und falls diese gleich war wie die abgelegte 
habe ich noch einen Zeitstempel zusätzlich abgelegt.... Funktionierte 
über die Jahre perfekt.

Mein Problem nun ist bei den neuen Controllern gibt es im Flash keine 
kleinen Bereiche mehr man kann nur noch Sektoren löschen und 
wiederbeschreiben. Beim XMC4500 hieße das sogar 16KB für 2 uint16_t zu 
opfern. Damals gab es ja noch einen Page Erase und Page Write. Und da 
das ja im Lebenszyklus nicht so oft vorkommt war das für das Flash auch 
kein Problem.

Jetzt dachte ich mir in nehme eine EEPROM Flash Emulation als speicher. 
Das Problem ist dann kann ich nicht mit SRECORD die crc berechnen und im 
Build ablegen. Aber ich könnte die CRC beim Builden wieder mit SRECORD 
berechnen und ablegen und beim Booten vergleichen ob diese im EEPROM 
steht wenn nicht mache ich ein Update dieser CRC und der Vergleich nimmt 
dann diese im EEPROM. Das Datum kann ich dann einfach nur fix an die 
EEPROM Address legen. Hätte jemand ne bessere Idee?

Echt Schade, dass die solche Controller nicht auch mal mit ei paar Byte 
EEPROM ausstatten. :-(

Wie macht ihr das so?

Danke
sg

von Pandur S. (jetztnicht)


Lesenswert?

Eigentlich benoetigt man ja nur den CRC beim Uebertragen der Firmware 
durch den Bootloader, um auf Korrektheit und vollstaendigkeitzu pruefen. 
Am Ende der Programmierung genuegt ja ein einzelnes bit, das man noch 
schreibt - alles io, oder eben nicht.
Egal, man kann auch einen CRC beim Schreiben des Flash anhaengen. Ein 
Datum, kann man ja auch gleich beim Schreiben einfuegen.

Und ja, meine Controller haben ein internes EEPROM fuer Parametrierdaten 
und solche Information.

von Stumpf (Gast)


Lesenswert?

Ich mache das immer so bei meinen STM32.

Die Controller haben immer unterschiedliche Größen der Pagen.

So kommt am Anfang der Bootloader, in den Pagen danach die CRC oder 
EEprom Emulation. Und danach die Firmware.

Z.B.:
Page 1: Bootloader
Page 2: Eepromemulation
Page 3: Eepromemulation
Page 4 ....: Firmware

Das funktioniert ganz gut und das kannst du über das Linkerscript 
machen.

von Gerd E. (robberknight)


Lesenswert?

clonephone82 schrieb:
> Bei den
> Controllern habe ich das immer so gemacht das ich mit SRecord an einen
> bestimmten bereich im Flash die CRC geschrieben habe. Beim Booten habe
> ich dann die CRC überprüft und falls diese gleich war wie die abgelegte
> habe ich noch einen Zeitstempel zusätzlich abgelegt

Was ist der tiefere Sinn hinter dem Zeitstempel?

Ich habe eine Applikation, bei der das Firmware-Update mit dem 
Bootloader aus der normalen Applikation heraus mit einem Befehl 
gestartet wird. Wenn jetzt natürlich die normale Applikation kaputt ist 
geht das nicht. Daher vergleicht der Bootloader immer die CRC des 
tatsächlichen Inhalts mit der Soll-CRC der Applikation. Diese steht in 
den letzten 4 Bytes des Flashs. Wenn die CRC nicht stimmt, springt er 
immer in den Bootloader-Modus und erwartet ein Firmware-Update. 
Ansonsten startet er die normale Applikation.
Dafür brauche ich aber keinen Zeitstempel.

von Ruediger A. (Firma: keine) (rac)


Lesenswert?

Ich arbeite für solche Zwecke mit kleinen DOS Applikationen, die ich zu 
Batchfiles zusammenschnüre. Die erste utility (objcopy) macht aus was 
immer der linker generiert ein binäres 1:1 Image, die zweite berechnet 
darüber die CRC, hängt sie hinten an und legt Alles in ein neues file 
ab, und die Dritte (vielfalls wieder objcopy oder ein S-Record 
Generator) macht daraus wieder das Format, das ich zum Flashen brauche.

In der Praxis ist aber für einen Remote Download ein aufgeblasenes 
Format wie S-records eher ungebräuchlich, ausser vielleicht für den 
Bootloader selber (also bei der Erstinbetriebnahme, je nachdem welche 
Programmierutility eingesetzt wird). Ich mache es meistens so, dass 
einmalig ein Bootloader eingebrannt wird und ein Hostinterfacesimulator 
das Applikationsimage so hereinspielt, als würde es im Laufenden Betrieb 
einen Update geben. Im Feld werden bei den Systemen, an denen ich 
arbeite, die Images sowieso nur "roh" (also binär) von A nach B 
geschoben, dann passt es.

Für den Bootloader selber ist eine CRC allerdings nur dann nötig, wenn 
der Bootloader selber upgradbar ist.

von Stefan K. (stefan64)


Lesenswert?

Ich verstehe nicht, warum die CRC an einer separaten Stelle gespeichert 
werden soll.
Ich integriere beim Build-Prozess die CRC in das Firmware-Binary. Dieses 
wird vom Bootloader als Ganzes ins Flash geschrieben, ohne Firmware und 
CRC in irgendeiner Weise getrennt zu behandeln.
Übrigens steht bei mir die CRC nicht am Ende des Binary, sondern 
zusammen mit einer Längenangabe am Anfang. Da bei uns bei vielen 
Anwendungen das Flash oft nur zur Hälfte gefüllt ist, verkürzt sich 
dadurch die Update-Zeit dramatisch.

Viele Grüße, Stefan

von clonephone82 (Gast)


Lesenswert?

Hallo,

@alle danke. Ich mache es jetzt mit einer EEPROM emulation.

Das mit dem Datum dient dazu zu entscheiden ob nachgeladen werden soll 
oder nicht. Das hat aber mit dem Systemaufbau von uns zu tun also nicht 
weiter wichtig.

@stefan .. Ja das mache ich ja auch so bezüglich Build Process, das mit 
der Länge nicht. Wäre aber eine gute Optimierung - Danke.

sg
mathias

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.