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


von Jürgen S. (jsachs)


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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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?

von Jürgen S. (jsachs)


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

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.