Forum: Mikrocontroller und Digitale Elektronik Zwei Firmware Images auf dem STM32


von Artur (Gast)


Lesenswert?

Ich muss im aktuellen Projekt zwei Firmware Images vorhalten und je nach 
Bedürfnis die erste oder die zweite Firmware anspringen. Das Laden der 
jeweiligen Firmware übernimmt ein Bootloader. Im Prinzip handelt es sich 
um die identische Firmware die zwei Mal im Flash abgelegt werden soll. 
Das ist auf jeden Fall NOGO, die Firmware für zwei unterschiedliche 
Adressbereiche zu kompilieren. Ist es möglich aus der Firmware heraus zu 
bestimmen, wo die Startadresse der gerade gestarteten Firmware liegt und 
je nach dem beim Initialisieren?
1
void
2
NVIC_Configuration(uint8_t ImageNum) {
3
4
if (1 == ImageNum)
5
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x2000);
6
}
7
else {
8
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x8000);
9
}

von Jim M. (turboj)


Lesenswert?

Artur schrieb:
> Das ist auf jeden Fall NOGO, die Firmware für zwei unterschiedliche
> Adressbereiche zu kompilieren.

Dumm ist nur, dass in normal kompilierter Firmware immer auch absolute 
Addressen drin stehen.

von peterguy (Gast)


Lesenswert?

Jim Meba schrieb:
> Artur schrieb:
>> Das ist auf jeden Fall NOGO, die Firmware für zwei unterschiedliche
>> Adressbereiche zu kompilieren.
>
> Dumm ist nur, dass in normal kompilierter Firmware immer auch absolute
> Addressen drin stehen.

Das denke ich auch.
Schau dir mal das Map File an.
Dort findest du beispielsweise die absoluten Addressen, die deine 
Maschine zum Anspringen der Funktionen verwendet.

von Artur (Gast)


Lesenswert?

Also, ich habe die gleiche Datei zwei Mal kompiliert und eine davon auf 
den STM32 geladen. Danach habe ich einen Vergleich zwischen einer 
zweiten BIN-Datei und dem uC Speicher über ST-Link Utility gemacht und 
es sind leider verdammt viel zu viele Daten die nicht übereinstimmen. 
Abgekürzt gesagt, es geht nicht ohne weiteres. Dann muss ich damit 
leben, die Firmware-Dateien in einem externen EEPROM zwischenspeichern 
zu müßen.

Vielen Dank

von tom (Gast)


Lesenswert?

ist nix neues...
...gemeinsam genutzte Module (.obj) der zwei firmwaren z.B. zum 
Bootloader dazupacken und in die zwei applikationen eine entsprechende 
jumptable dazucompilieren/linken.
idealerweise den bootloader auch updatebar machen, falls doch (murphy) 
mal änderungen notwendig sind.

mfg, tom.

von Reinhard Kern (Gast)


Lesenswert?

Artur schrieb:
> und
> es sind leider verdammt viel zu viele Daten die nicht übereinstimmen.

Klar. Eine Lösung wäre nur so etwas wie das EXE-Format, mit dem 
Programme in den RAM-Speicher geladen werden und anschliessend alle 
absoluten Adressen angepasst (viel zu aufwendig), oder ein 
Memory-Manager, der die beiden Programme auf die gleiche logische 
Adresse abbildet. Der Zilog eZ80 z.B. kann Speicher durch die 
CS-Programmierung an verschiedenen Adressen einblenden - allerdings nur 
externen Speicher. In dem Fall wärs trivial, aber die beiden Programme 
müssten sich in 2 getrennten Speicher-ICs befinden, ist für Embedded 
wohl auch zu aufwendig. Aber ein Prozessor mit MMU wäre eine Lösung.

Ein Programm mit ausschliesslich relativen Adressen zu schreiben ist 
praktisch unmöglich.

Gruss Reinhard

von Christian (Gast)


Lesenswert?

Also was ich schon gemacht habe auf dem STM32 ist den Flash Speicher in 
3 Bereiche zu teilen. Bootloader, Firmware 1 und Firmware 2.

Der zweite Firmware Bereich dient aber eigentlich nur zum updaten der 
Firmware. Die neue Firmware wird wärend des Betriebs in den hinteren 
Bereich geschrieben. Ist die Übertragung vollständig wird sich das im 
ext. Eeprom gemerkt.
Beim Neustart läuft immer zuerst der Bootloader. Dieser schaut nach ob 
es ein Firmware Update gibt und kopiert das von Firware Bereich 2 nach 
Firmware Bereich 1. Anschlissend wird dann wider die Firmware im Bereich 
1 gestartet.

Wenn du zwei unterschiedliche Firmware Dateien laufen haben willst musst 
du diese zwangsweise für ihren Bereich kompilieren in dem sie auch bei 
der Ausführung liegen.

Was natürlich denkbar ist das du drei Firmwarebereiche hast. Einen 
Bereich in dem die Firmware ausgeführt wird und zwei Bereiche in denen 
deine 2 Versionen ligen. Dann müsste der Bootloader aber erst die 
benötigte Version in den Arbeitsbereich kopieren und dann starten. Das 
wird funktionieren. Aber kostet natürlich beim starten Zeit und man muss 
natürlich bedenken das der Falsh Speicher nur eine begrente Anzahl 
schreinzüglen hat.

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.