Forum: Mikrocontroller und Digitale Elektronik AVR Anwendung doppelt im Flash halten.text= Offset?


von Ole J. (ojepsen)


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

von Georg G. (df2au)


Lesenswert?

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.

von Frank M. (ukw) (Moderator) Benutzerseite


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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Ole J. (ojepsen)


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!

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.