AVR Anwendung doppelt im Flash halten.text= Offset?

OP #5399616
Lesenswert?
• ▲
▼
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
Moderator Persönliche Seite #5399624
Lesenswert?
• ▲
▼
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.
OP #5399640
Lesenswert?
• ▲
▼
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!

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.