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.
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.