www.mikrocontroller.net

Forum: Compiler & IDEs Implementierungsfragen/Tips gesucht (Bootloader,F-Tabelle)


Autor: Jürgen Sachs (jsachs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich schildere mal kurz was ich vorhabe, dann die Fragen.
Ich binde mich in ein bestehendes Bussystem ein.  Da klappt prima. Nun
will ich das ganze über einen Bootloader updatebar machen (sowie den
Bootloader selbst ?).
ich verwende den avr-gcc und zur Zeit einen Mega8515.

Ich wollte das folgendermassen machen:
Im Bootloader steht der Code zur  Auswertung des Protokolls "void
Parse(void)". Im Anwendungsprogramm sind nur Funktionen die aus der
"parse()" aufgerufen werden. Erkennt die parse() den Update Modus,
deaktiviert diese alle Interrupts und geht in eine Funktion die  dem
UART pollt ohne Ints (einfacher), die im Bootloader steht. Nun kann ich
das Anwendungsprog löschen und neu schreiben.
Bei bestimmten Befehlen ruft die parse() Funktionen auf um z.B. Relais
zu schalten. z.B. "Relais(Nr, status)", also mit Parametern.
Die Funktion "parse()" wird aus der Mainschleife aufgerufen sobald
neue Daten im UART Eingangspuffer stehen (Dauert zu lange für Aufruf
aus einem Interrupt). Kommt jetzt z.B. ein Relais Befehl, muß ja die
Funktion "parse()" im Bootloader wissen WO im Anwendungsprogramm die
Funktion Relais steht. Das geht vermutlich mit Zeiger auf Funktionen
(Funktionstabelle) ? Kann mir da einer einen Tip geben wie man sowas
macht. Bei jedem Kompile verschieben sich ja die Funktionen im
Anwendugsprogramm. Daher müsste vermutlich auch das Anwendugsprogramm
die Funktionstabelle stellen ?

Wie kann ich aber den Bootloader selbst updaten, wenn ich z.B. die
Funktion parse() ändere ?
Mir fällt da nur folgendes ein.
1) Anwendungsprog löschen
2) Neuen Bootloader in Anwendungsspeicher schreiben (Zwischenspeicher)
3) Wenn fertig mit einer kleinen Routine das Prog in den Bootloader
kopieren
4) Neustart
5) Anwendungsprog wieder laden

Die Funktion von 3) müsste am Ende des Bootloaders stehen, wo diese
nicht überschrieben wird. Das Anwendungsprog kann ja nicht den
Bootloader überschreiben ?!

Ach ja, ich würde den Bootloader  mehr als "BIOS" einsetzen. So kommt
das ganze auch ohne gültiges Prog ans laufen.
1) Bootloader start
2) ist Anwendungsprog gültig -> Main starten, sonst poll Modus im
Bootloader für Systemupdate

Oder denke ich da im Moment zu kompliziert ?

Für Tips bin ich jederzeit dankbar.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, den Bootloader würde ich nicht updatebar machen wollen,
das wäre mir zu heiß.

Die Sprungtabelle ist sicher eine sinnvolle Idee.  Am besten
packt man diese in eine separate section, die man per
Linker-Anweisung dann auf eine feste Adresse bindet.

Warum musst du das komplette Parsen denn im Bootloader machen?
Lass ihn doch einfach sein Zeugs parsen und im Negativfall
einen Parser in der Applikation aufrufen.  Damit brauchst du
dort nur die statischen Bootloader-Sachen ermitteln, die sich
hoffentlich nie wieder ändern, der Rest ist variabel in der
Applikation.  Unter Umständen erübrigt sich dann auch die
Sprungtabelle, und du brauchst nur noch einen Einsprung in die
Applikation selbst?

Autor: Jürgen Sachs (jsachs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich will die bestehenden Funktionen zum Firmwareupdate nutzen der auch
für die "Orginal" Hardware gilt.
Dort bekomme ich immer 128 Byte, die ich dann verarbeiten muß.
Zyklisch frägt der Master Rechner ob es weiter gehen kann und überträgt
dann die nächsten 128 Byte.
Das würde ja so auch passen.
Das Problem ist nur, das ich bis zum Abschluß der Übertragung auch das
komplette Protokoll Unterstützen muß. Die restliche Hardware am Bus
läuft ja weiter und ich muß MEINE Daten ja herrausfinden aus dem
Protokoll.
Ist schon gut gemacht, nur hab ich eben keine 5 kb Speicher um mir die
Firmware zwischen zu puffern und dann direkt zu Flashen.
Und es soll ja Billig bleiben.

Da die Parser Routine im Bootloader sitzt, würde ich die schon gerne
updatebar haben. Zur Not eben über den Umweg die Daten für den
Bootloader im Anwendungsspeicher zwischenzuspeichern, und danach
hiervon den Bootloader überschreiben. Das wäre aber "nice to have".

Nur wie macht man so eine Sprungtabelle ? Kann mir da einer ein
Beispiel geben für 2 Funktionen mit Unterschiedlichen Parametern ?

Danke

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.