-         

Ergebnis 1 bis 3 von 3

Thema: modulares Firmware-Update?

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    26.02.2007
    Beiträge
    8

    modulares Firmware-Update?

    Anzeige

    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.

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    15.11.2004
    Ort
    Aachen
    Alter
    32
    Beiträge
    246
    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

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    26.02.2007
    Beiträge
    8
    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •