Hallo liebe Leute, ich möchte meine Anwendung über den Bootloader updaten können. Die Verbindung zum Updaten läuft hierbei über I2C. Das funktioniert soweit auch gut. Ablauf: - Anwendung läuft -> Update befehl via I2C - Anwenung wird beendet und Bootloader wird gestartet - Bootloader empfängt das Update und überschreibt/updatet die Anwendung - Neue Anwendung wird wieder gestatet. Nun zu meinem Problem / Frage: Ich möchte sicherstellen, dass bei einer Fehlerhaften Übertragung via I2C, trotzdem eine lauffähige Anwendung vorhanden ist. Deshalb die Idee, die Anweund gleich zweimal im Flash zu halten. Also Instance 1 und Instance 2. Läuft also Instance 1 der Anwendung, so wird beim updaten über den Booloader nur die Instance 2 (Offset 0xF800) überschrieben. Anschließend wird diese gestartet. Sollte nun beim Starten etwas schief gehen, so wird nach 6 sek. der Software Watxhdog ausgelöst. Dieser kann die zweite Instnace im EEPROM als Fehlerhaft markieren und nach dem Reset würde der Bootloader wieder Instance 1 starten. Das Problem ist nur, dass ich nur eine Anwendung kompilieren möchte und nicht eine für .text=0x0000 und eine für .text=0xF800. MEINE FRAGE: Gibt es die möglichkeit einen .text Offset zur Laufzeit einzustellen? Dies könnt der Bootloader dann erledigen!? Ich hoffe ihr könnt meine Frage nachvollziehen und habe evt. ein paar Tipps für mich :) Danke und Gruß Ole
Wie willst du das Problem mit den Interrupt Vektoren lösen? Die liegen fest auf 0x0000 bzw im Bootloader Bereich. Ich halte deine Idee nicht für realisierbar.
Ole J. schrieb: > Sollte nun beim Starten etwas schief gehen, so wird nach 6 sek. der > Software Watxhdog ausgelöst. Dieser kann die zweite Instnace im EEPROM > als Fehlerhaft markieren und nach dem Reset würde der Bootloader wieder > Instance 1 starten. Das klappt schon deshalb nicht, weil die Interrupt-Vektortabelle immer "ganz vorne" liegen muss, jedenfalls bei den AVRs. Es kann noch eine zweite (bei den ATmegas) für den Bootloader geben. Diese nützt Dir in Deinem Fall aber gar nichts. So könnte es gehen: 1. Applikation liegt identisch zweimal im Flash vor 2. Bricht der Flash per Bootloader ab, kopiert dieser die Kopie auf das Original. Dann brauchst Du Dir auch keine Gedanken über irgendwelche Text-Offsets zu machen.
Ole J. schrieb: > MEINE FRAGE: Gibt es die möglichkeit einen .text Offset zur Laufzeit > einzustellen? Ist der Code des AVR vollständig relokatibel? Sämtliche Sprünge und auch sämtliche Flash-Zugriffe auf Konstanten müssten PC-relativ durchgeführt werden können, damit das geht.
Frank M. schrieb: > 1. Applikation liegt identisch zweimal im Flash vor > 2. Bricht der Flash per Bootloader ab, kopiert dieser die Kopie auf > das Original. Das ist eine gute Idee! Und sicherlich auch einfacher Umzusetzen. Rufus Τ. F. schrieb: > Ist der Code des AVR vollständig relokatibel? Sämtliche Sprünge und auch > sämtliche Flash-Zugriffe auf Konstanten müssten PC-relativ durchgeführt > werden können, damit das geht. Kannst du das näher Erklären? Worauf muss ich dabei achten? Georg G. schrieb: > Wie willst du das Problem mit den Interrupt Vektoren lösen? Die liegen > fest auf 0x0000 bzw im Bootloader Bereich. Okay das hatte ich noch garnicht bedacht :( Lassen sich zumindest die Bootloader Interrupts auf die Anwenungsinterrupts umbiegen? Danke euch allen schonmal für diese schnellen 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.