Forum: Mikrocontroller und Digitale Elektronik Bootloader AVR over the Air


von Booty (Gast)


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?

von Marius (Gast)


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

von spess53 (Gast)


Lesenswert?

Hi

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

Wofür gibt es dann IVSEL?

MfG Spess

von Jim M. (turboj)


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.

von Jim M. (turboj)


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.

von c-hater (Gast)


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.

von Booty (Gast)


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!

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.