AVR Anwendung doppelt im Flash halten.text= Offset?

OP #5399616
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
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
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

Eine eigene Frage? Dieser Thread ist über 8 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.