PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : modulares Firmware-Update?



cateye030
26.02.2008, 14:03
Hallo,
es gibt ja die Möglichkeit ein Firmware-Update mittels Bootloader
durchzuführen. Dabei wird aber die Firmware komplett neu (bis auf den
Bootloader) in den internen Flash geschrieben.

Ist es möglich Firmware auch modular im internen Flash auszutauschen?
Ich stelle mir das Ganze so vor:
-Hauptmodul (enthält Firmware-Updater)
-Tabelle mit Funktionszeigern
-Funktionsmodul 1
-Funktionsmodul 2
-Datenmodul 1
-Datenmodul 2
-Bootloader

Die Funktions- und Datenmodule liegen mit ausreichend Platz
zwischeneinander (für Änderungen der Module) im Flash an festen
Adressen. Die Adressen werden im Linkerskript festgelegt.
Alle Funktionen in den Funktionsmodulen können mittels Funktionszeigern
vom Hauptmodul aufgerufen werden. Funktionsaufrufe innerhalb der
Funktionsmodule sollten ohne Funktionszeiger funktionieren.

Wenn ein Funktions- oder Datenmodul ausgetauscht werden soll, dann
befindet sich das Hauptmodul in der Firmware-Update-Funktion.
Diese überschreibt den internen Flash mit dem neuen Modul aus dem
externen Flash. Danach wird ein Software-Reset ausgeführt um
Inkonsistenzen zu verhindern.

Ich habe bisher nirgends ein Konzept für so etwas gefunden. Kann ich
also davon ausgehen, dass ein modulares Firmware-Update aufgrund
bestimmter Dinge unpraktikabel bzw. unmöglich ist?

Antworten die über ein "geht"/ "geht nicht" hinausgehen würde ich toll
finden. Ich denke dass eine evtl. angestossene Diskussion auch Anderen
ein besseres Verständnis über die Funktionsweise von Mikrocontrollern
geben würde.

zerush
26.02.2008, 15:17
Sicher ist das möglich!
Also wenn du genau festgelegte Adressen für deine Funktionen hast, kannst du ohne Probleme nur diese Teile austauschen.

Jedoch sollte der Bootloader das Firmware Update durchführen, und nicht dein Hauptmodul.
Dein Bootloader startet ja am Anfang. Dieser prüft dann, ob ein Firmware-Update durchgeführt werden soll oder nicht, wenn nicht, springt er zum Hauptmodul.
Wenn doch, dann lädt er sich die Daten (page-weise) und schreibt diese dann an die entsprechende Stelle im Flash (auch page-weise).

Du solltest also darauf achten, dass sich deine Funktionszeiger an der Pagegröße ausrichten!

Wenn alle Daten geschrieben wurden, springt der Bootloader zu deinem Hauptmodul.

mfg
zerush

cateye030
27.02.2008, 14:18
Hallo,
Ich sehe noch Probleme darin die Adressen der Funktionen im Flash herauszubekommen (da ein altes Modul die Adressen der Funktionen eines neuen Moduls nicht kennen kann).
Dazu habe ich mir folgendes gedacht:
Je Funktionsmodul muß es so eine "Vermittler"- Funktion geben.
Wenn ich aus dem Hauptmodul eine Funktion in einem Funktionsmodul aufrufen möchte, dann rufe ich die azugehörige "Vermittler"-Funktion mit dem Argument "Index des Funktions-Adress-Array's" auf, welches beispielsweise die Funktion Read_XYZ im Funktionsmodul adressiert.
D.h. die Vermittler-Funktion hat ein Array in dem die Adressen der Funktionen stehen die von außerhalb aufgerufen werden sollen.

Variablen in den Funktionsmodulen können nur noch mit malloc() angelegt werden, da bei jedem neuen "Make" die Variablen vermutlich neue
Adressen im RAM erhalten. Die alten Module konnen also Speicherkollisionen mit den neuen Modulen haben.

Was ich nicht weiß:
1)
Kann ich dem Linker beibringen, dass die Dispatcher-Funktion von Modul 1 an Adresse X im Flash liegen soll und die restlichen Funktionen von Modul 1 darauf folgen sollen?
Ich weiß nur dass man dem Linker sagen kann wo Code und wo Daten im Flash liegen sollen.
2)
Können lokale Funktionen innerhalb eines Funktionsmoduls einander ohne Pointer aufrufen? Da sollte es doch keine Probleme geben oder?

Gruß
Christian