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?
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
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
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.