Hi,
ich arbeite mich gerade in die Bootloader Thematik ein, worauf ich aber
noch keine Antwort finden konnte ist, ob es auch möglich ist, aus der
laufenden Applikation in den Bootloader zu springen ohne Reset, und was
man beachten muss. z.B. Interrupts "verbiegen", wies so schön in einer
Anleitung hieß.
Lg
Philipp
Man kann ohne Reset in den Bootloader springen. Dann müssen aber
Applikation und Bootloader genau aufeinander abgestimmt sein.
Warum kein Reset? Damit macht man sich vieles einfacher.
Im Bootloader kannst Du aus dem MCUSR auslesen wodurch der Reset
ausgelöst wurde. Danach kannst Du dann entscheiden was Du für ne Routine
laufen lassen willst.
Alternativ zum MCUSR kannst Du auch nen externes Signal abfragen, z.B.
nen Flipflop was Du vorher gesetzt hast oder nen Taster.
Bei einem Projekt habe ich sowas kombiniert mit nem CRC des
Hauptprogramms. Also der Bootloader prüft ein externes Flag. Wenn das
an, springt er in den Bootloader-Teil. Außerdem macht er nen CRC des
Hauptprogramms und vergleicht das mit einem Wert am Ende des
Hauptprogramms. Wenn das nicht passt springt er auch in den Bootloader.
Ansonsten geht er ins Hauptprogramm.
So können Fehler beim Flashen des Programms nicht dazu führen daß der
Bootloader nicht mehr gestartet wird. Ich darf nur keinen Code
rausgeben, der die korrekte CRC hat, aber nicht mehr in der Lage ist in
den Bootloader zu springen.
Funktioniert bisher bestens, ca. 500 Stück bei Kunden draußen, mehrere
Firmware-Updates und kein einziges Teil Ausfall. Obwohl natürlich einige
während des Flashens den Stecker gezogen haben.
Gerd E. schrieb:> Bei einem Projekt habe ich sowas kombiniert mit nem CRC des> Hauptprogramms. Also der Bootloader prüft ein externes Flag. Wenn das> an, springt er in den Bootloader-Teil. Außerdem macht er nen CRC des> Hauptprogramms und vergleicht das mit einem Wert am Ende des> Hauptprogramms. Wenn das nicht passt springt er auch in den Bootloader.> Ansonsten geht er ins Hauptprogramm.>> So können Fehler beim Flashen des Programms nicht dazu führen daß der> Bootloader nicht mehr gestartet wird. Ich darf nur keinen Code> rausgeben, der die korrekte CRC hat, aber nicht mehr in der Lage ist in> den Bootloader zu springen.
Das wäre aber eher eine Aufgabe des Bootloaders. Bei meinen Bootloadern
achte ich auf zwei Punkte:
- Fehlererkenung, also sowas wie deine CRC, innerhalb des Bootloaders
- Umprogrammieren des FLASH-Speichers auf eine Art & Weise das erst nach
vollständigem und korrektem programmieren des FLASHs der Bootloader die
programmierte Anwendung auch scharf macht.
Hi,
danke erstmal für die Antworten. Ich schaus mir mal an. Ich habe später
keinen Zugriff mehr auf den Mega, einen Taster oder so. Der einzige
Zugang ist, vom PC über ein Xbee zu einem Mega der dann die Daten über
einen Full Duplex RS485 an den Chip weiterleitet. Und ich möchte im
Bootloader keine Wartezeit drin haben, in der der Chip im Bootloader auf
einen Befehl o.ä. wartet. Deshalb soll er einfach auf einen Befehler
hin, in den Bootloader springen.
>Deshalb soll er einfach auf einen Befehler>hin, in den Bootloader springen.
Und was machst du wenn die Applikation nicht korrekt geflasht wurde?
Dann hast du keine Möglichkeit mehr in den Bootloader zu springen.
holger schrieb:>>Deshalb soll er einfach auf einen Befehler>>hin, in den Bootloader springen.>> Und was machst du wenn die Applikation nicht korrekt geflasht wurde?> Dann hast du keine Möglichkeit mehr in den Bootloader zu springen.
Wenn der Wadchdog aktiviert ist, könnte es einen WDT-Reset geben und man
landet im Bootloader.
holger schrieb:> Und was machst du wenn die Applikation nicht korrekt geflasht wurde?> Dann hast du keine Möglichkeit mehr in den Bootloader zu springen.
Hoffen dass es nicht passiert ;) Ich werde mir einen Weg ausdenken, mit
dem es relativ unwahrscheinlich ist, dass das passiert. Die Platinen
werden später in einem Modellboot sitzten, und kleine Verbesserungen
oder Änderungen sollen direkt geflasht werden können. Mann könnte jede
geflashte Page z.b. mit einer Checksumme vergleichen.
Detlef Kunz schrieb:> Wenn der Wadchdog aktiviert ist, könnte es einen WDT-Reset geben und man> landet im Bootloader.
Das wollte ich eigentlich nicht machen, denn wenn einfach nur ein Fehler
im Programm ist, landet wer auch dort und z.b. die Servo/Motor Steuerung
muss nach einem WDT Reset sofort wieder da sein.
Gerd E. schrieb:> Man kann ohne Reset in den Bootloader springen.
Ja.
> Dann müssen aber> Applikation und Bootloader genau aufeinander abgestimmt sein.
Nein, das ist nicht unbedingt notwendig. Alles was notwendig ist, ist
daß jeder SEINEN EIGENEN Müll ordentlich aufräumt, bevor er in die
Domäne des anderen springt.
Aber natürlich kann es sehr nützlich sein, wenn App und Bootloader
"aufeinander abgestimmt sind". Insbesondere dann, wenn es um verteilte
Systeme geht und über den Kommunikationskanal der App auch
Firmwareupdates verteilt werden sollen. Das ist oft ein sehr
wünschenswertes und überaus sinnvolles Feature.
Aber auch das kann man in den Griff bekommen, ohne sich allzu große
Abhängigkeiten zwischen App und Bootloader einzuhandeln. Ganz ohne geht
es allerdings natürlich dann wirklich nicht.
> Warum kein Reset? Damit macht man sich vieles einfacher.
Das ist korrekt. Der Reset erspart das manuelle Aufräumen der Hardware
und ist (vor allem bei knappen Platz im Codespace) nicht die
schlechteste Option.
> Außerdem macht er nen CRC des> Hauptprogramms und vergleicht das mit einem Wert am Ende des> Hauptprogramms. Wenn das nicht passt springt er auch in den Bootloader.> Ansonsten geht er ins Hauptprogramm.
Das ist natürlich sinnvolles Standardverhalten. Wenn kein gültige App da
ist, darf man natürlich auch keine App anspringen.
Philipp schrieb:> Mann könnte jede> geflashte Page z.b. mit einer Checksumme vergleichen.
Du hast aber nicht genug ram um erst mal alles zu empfangen, zu prüfen
und dann erst zu flashen. Du musst also direkt flashen was du bekommst
und erst hinterher prüfen. wenn du einmal angefangen hast was von dem
neuen code zu flashen, kannst du nicht einfach mittendrin aufhören und
hoffen daß das teil dann noch sinnvoll startet.
daher mein vorschlag oben mit der crc über das gesamte flash und das
starten des bootloaders (also empfang neuen programmcodes über der
serielle schnittstelle, i2c,...) wenn die nicht stimmt. damit kannst du
immer neu beginnen den programmcode zu flashen, auch wenn du vorher
mittendrin abgebrochen hast.
holger schrieb:> Was schief gehen kann geht auch irgendwann schief.> Viel Glück also;)
Natürlich wird früher oder später was schief gehen. Deswegen mache ich
die updates aber auch nur, wenn ich ans Boot rankomme. Wenn es also z.b.
grad am Steg ist. Mir geht es in erster Linie darum, nicht immer den ISP
anschließen zu müssen. (Boot raus, aufmachen usw.) Es soll desweiteren
kein WDT Reset sein, da der auch durch andere Faktoren ausgelöst werden
könnte und ich vermeiden will, dass das Modul erst auf einen Befehl
wartet, obwohl z.b. Servo/Motor sofort wieder benötigt wird. Ein Zeichen
im EEprom speichern fällt auch raus, da der größtenteils schon belegt
ist. Das einfachste wäre hier halt, den Bootloader manuell aufzurufen.