Forum: Mikrocontroller und Digitale Elektronik Atmega - Aus der Applikation in den Bootloader springen


von Philipp (Gast)


Lesenswert?

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

von Gerd E. (robberknight)


Lesenswert?

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.

von Hagen R. (hagen)


Lesenswert?

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.

von Stephan B. (matrixstorm)


Lesenswert?

Hallo.

Seh dir mal http://matrixstorm.com/avr/tinyusbboard/ ,  bzw. dessen 
Bootloader USBaspLoader ( 
https://github.com/baerwolf/USBaspLoader/tree/testing ) an.

Im Code wird sowohl eine API unterstuetzt ( 
https://github.com/baerwolf/USBaspLoader/blob/testing/firmware/spminterface.h 
) mit der man den Flash schreibbar machen kann. (Mehr dazu auch im 
Beitrag "Re: [ATMega] Programm aus externem EEprom laden")

Im der derzeitigen "testing"-branch wird zudem auch ein Springen aus der 
Firmware zum Bootloader (ohne Benutzereinwirken) ermoeglicht.
(Seit commit 
https://github.com/baerwolf/USBaspLoader/commit/fdd80449610db4cccc152e17b04cdb51de578a61 
)

MfG

von Philipp (Gast)


Lesenswert?

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.

von holger (Gast)


Lesenswert?

>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.

von Detlef K. (adenin)


Lesenswert?

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.

von Philipp (Gast)


Lesenswert?

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.

von holger (Gast)


Lesenswert?

>Hoffen dass es nicht passiert ;)

Was schief gehen kann geht auch irgendwann schief.
Viel Glück also;)

von c-hater (Gast)


Lesenswert?

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.

von Gerd E. (robberknight)


Lesenswert?

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.

von Philipp (Gast)


Lesenswert?

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.

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.