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.
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
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.
>Hoffen dass es nicht passiert ;)
Was schief gehen kann geht auch irgendwann schief.
Viel Glück also;)
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.
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.