mikrocontroller.net

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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Ole J. (ojepsen)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Georg G. (df2au)
Datum:

Bewertung
1 lesenswert
nicht 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.

Autor: Frank M. (ukw) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus Τ. F. (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ole J. (ojepsen)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.