Bootloader AVR over the Air

Gast #5250950
Lesenswert?

Hallo Forum,

ich möchte bei einen Atmega328 über ein 3G-Modem die Firmware updaten 
können.

Ich möchte die Firmware nicht live updaten, also nicht während der 
aktiven Modem-Verbindung sondern erst nachdem die gesamte Firmware 
übertragen wurde.

Als technische Lösung habe ich einen externen EEPROM vorgesehen, in den 
erst mal die ganze Firmware geschrieben wird. Wurde alle richtig 
übertragen, werden mit einem Bootloader die Daten aus dem EEPROM ins 
Flash geschrieben.
Das sollte erst mal Funktionieren.

Meine zweite Idee ist, da ich weniger als die Hälfte des Flash-Speichers 
benötige die neue Firmware mit Bootloader in den ungenutzten 
Flash-Bereich schiebe und bei erfolgreicher Übertragung ebenfalls mit 
dem Bootloader in den richtigen Bereich schiebe.
Eventuell könnte man sogar zwei verschiedene Firmware gleichzeitig im 
Flash haben und nur den Einsprung umlenken. Würde das funktionieren?
Gast #5250967
Lesenswert?

Das Kopieren aus einem externen EEPROM sollte mit Bootloader möglich 
sein.

Booty schrieb:
> Eventuell könnte man sogar zwei verschiedene Firmware gleichzeitig im
> Flash haben und nur den Einsprung umlenken. Würde das funktionieren?

Eher nicht, da beim AVR die Interruptadressen fix sind und sich immer am 
Anfang des Flash befinden.

Gruß
Marius
#5250988
Lesenswert?

Booty schrieb:
> Meine zweite Idee ist, da ich weniger als die Hälfte des Flash-Speichers
> benötige die neue Firmware mit Bootloader in den ungenutzten
> Flash-Bereich schiebe und bei erfolgreicher Übertragung ebenfalls mit
> dem Bootloader in den richtigen Bereich schiebe.

Davon würde ich abraten - da bekäme man u.U. Probleme beim Bootloader, 
weil der jetzt viel mehr kommunizieren muss. Bei AVR kann man AFAIK den 
Flash nicht vom Hauptprogramm aus beschreiben.

Ein dicker I²C EEPROM oder SPI Flashbaustein wäre IMO die einfachste 
Lösung. Hier erfolgt die Kommunikation mit der Außenwelt ausschliesslich 
über das Hauptprogramm - kann dort also auch leichter auf Kundenwünsche 
eingehen: "Äh, wir brauchen 19200 statt 9600 Baud..."

Ich würde den Updateprozess so gestalten, dass die magischen Bits die 
den Bootloader zum Flashen veranlassen nur nach vorheriger Verifikation 
des externen Speichers geschrieben werden. Beispielsweise indem man die 
Daten nach dem Schreiben nochmals ausliesst.
#5250993
Lesenswert?

spess53 schrieb:
>>Eher nicht, da beim AVR die Interruptadressen fix sind und sich immer am
>>Anfang des Flash befinden.
>
> Wofür gibt es dann IVSEL?

Damit man im Bootloader auch Interrupts verwenden kann. Das löst aber 
das Problem mit dem 2. Programm im Flash genau nicht.

Übrigens würde man für das 2. Programm auch ein anderes Kompliat 
benötigen - der Linker geht von festen Addressen für Funktionen aus.
Gast #5251220
Lesenswert?

Booty schrieb:

> Als technische Lösung habe ich einen externen EEPROM vorgesehen, in den
> erst mal die ganze Firmware geschrieben wird. Wurde alle richtig
> übertragen, werden mit einem Bootloader die Daten aus dem EEPROM ins
> Flash geschrieben.
> Das sollte erst mal Funktionieren.

Natürlich.

> Meine zweite Idee ist, da ich weniger als die Hälfte des Flash-Speichers
> benötige die neue Firmware mit Bootloader in den ungenutzten
> Flash-Bereich schiebe und bei erfolgreicher Übertragung ebenfalls mit
> dem Bootloader in den richtigen Bereich schiebe.

Auch das geht. Allerdings ist das Limit dafür natürlich nicht die Hälfte 
des Flash, sondern die Hälfte von dem, was nach Abzug des 
Bootloadercodes noch verfügbar ist.

> Eventuell könnte man sogar zwei verschiedene Firmware gleichzeitig im
> Flash haben und nur den Einsprung umlenken. Würde das funktionieren?

Nur mit Firmware-Code, der dafür die entsprechenden Vorkehrungen trifft. 
Also typisch nicht mit den Produkten stupider Compiler. Aber auch in 
Assembler ist es zumindest ein erheblicher Aufwand und viele der nötigen 
Maßnahmen machen den Code langsamer und größer. Nicht empfehlenswert.

Wennschon, dann eher etwas in Form eines "Firmware-Swapping", das ist 
sehr viel einfacher, weil es keine besonders präparierte Firmware 
erfordert. Sprich: du tauschst zum Swapping seitenweise (mit SRAM in der 
Größe einer Flash-Seite als Zwischenspeicher) die beiden 
Firmwareversionen gegeneinander aus. Das ist nur ein geringer 
Mehraufwand gegenüber dem ohnehin zu implementierenden einfachen 
Kopieren aus dem Zwischenspeicher an die endgültige Position.
Gast #5251256
Lesenswert?

Ich denke, es spricht alles für ein externes EEPROM, man könnte mehrere 
Firmwareversionen ablegen und bei fehlerhafter neuer Firmware wird 
einfach die alte wieder geladen.

Danke soweit für die Antworten!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren