Forum: Mikrocontroller und Digitale Elektronik Bootloader Funktionen wieder verwenden (STM32F0xx, GCC)


von ben (Gast)


Lesenswert?

Hallo,

ich schreibe gerade eine Anwendung auf einem STM32F070 mit GCC.
Nach dem Start soll ein Bootloader überprüfen, ob sich die Datei 
'image.bin' auf einer SD Karte befindet. Falls ja wird die Firmware 
aktualisiert.
Soweit kein Problem, SD Karte und FATFS laufen.

Da ich den SD Karten Zugriff und FATFs auch im Hauptprogramm benötige 
läge es ja nahe die entsprechenden Funktionen aus dem Hauptprogram 
aufrufen zu können.

Ich habe so etwas in vereinfachter Form schon einmal gemacht, indem ich 
die Adressen der Funktionen im Bootbereich über Funktionspointer aus dem 
Hauptprogramm aufgerufen habe. Man muss natürlich dafür sorgen, dass die 
Funktionen nicht inlined sind.

FATFs verwendet allerdings auch einige globale Variablen. Da der 
Compiler ja nicht weiß dass die entsprechenden Stellen im Ram schon 
belegt sind, wären diese dadurch doppelt verwendet.

Wie wäre hier am besten vorzugehen? Ich nehme an, dass man das Problem 
über ein entsprechendes Linker Script lösen könnte? Oder gibt es andere 
Ansätze für diese Problemstellung?

von Stefan E. (sternst)


Lesenswert?

ben schrieb:
> Wie wäre hier am besten vorzugehen? Ich nehme an, dass man das Problem
> über ein entsprechendes Linker Script lösen könnte? Oder gibt es andere
> Ansätze für diese Problemstellung?

Eine Möglichkeit, die ganz ohne Linker-Tricksereien auskommt, wäre:
Alle globalen Daten, die zu Kartenzugriff und FATFS gehören, in einer 
globalen Struktur zusammenzufassen, und dann den Funktionen einen 
Pointer darauf mitzugeben.

von Jim M. (turboj)


Lesenswert?

ben schrieb:
> Da ich den SD Karten Zugriff und FATFs auch im Hauptprogramm benötige
> läge es ja nahe die entsprechenden Funktionen aus dem Hauptprogram
> aufrufen zu können.

Eine eher blöde Idee. Die überschreibst Du beim Flashen, und versuchst 
sie danach zu benutzen um den nächsten Sektor zu Lesen -> PENG.

Schau dir mal Petitfatfs (http://elm-chan.org/fsw/ff/00index_p.html) an.
Ich habe das in 4kB unter bekommen.

von Stefan E. (sternst)


Lesenswert?

Jim M. schrieb:
> Eine eher blöde Idee. Die überschreibst Du beim Flashen, und versuchst
> sie danach zu benutzen um den nächsten Sektor zu Lesen -> PENG.

Du hast das missverstanden. Er will die Funktionen des Bootloaders auch 
im Hauptprogramm verwenden. Der Bootloader soll also quasi eine Art BIOS 
bereitstellen.

von ben (Gast)


Lesenswert?

Stefan E. schrieb:
> Eine Möglichkeit, die ganz ohne Linker-Tricksereien auskommt, wäre:
> Alle globalen Daten, die zu Kartenzugriff und FATFS gehören, in einer
> globalen Struktur zusammenzufassen, und dann den Funktionen einen
> Pointer darauf mitzugeben.

Diese Idee hatte ich auch schon, würde dann aber leider eine 
Modifikation der FATFs library bedeuten.

von meckerziege (Gast)


Lesenswert?

Geht durchaus mit einigen Verrenkungen.

Die einfachste Methode ist, baue dir unterschiedliche Linkerskripts mit 
unterschiedlichen Adressen für die Sections (insbesondere eben .data und 
.bss).
Dann sind schon mal die globalen Variablen sicher (Achtung: Heap+Stack 
ggf. ebenfalls betrachten!).

Interessant wird es nur, wie du den Zugriff auf die Variablen aus 
BEIDEN(!) Codeteilen heraus machst. Also so, dass der Linker auch weiß, 
wohin er denn den Zugriff linken soll. Eine Möglichkeit ist, wie schon 
genannt, ein struct auf das du einen Pointer hast. Wenn das aber nicht 
geht, dann wirds aufwendiger.
Es gibt die Möglichkeit, den Bootloader beim Linken der APPLIKATION(!) 
dabeizuhaben (damit kennt dein Linker dann auch die Adressen), ihn dann 
aber wieder aus dem File per objcopy herauszuwerfen. Ist aber sehr 
komplex, hatte ich aber erfolgreich am laufen. (=auch zuverlässig. Hat 
auch Verifikation/Tests etc. problemlos überstanden)

Die Frage ist nur: Was ist dir das Wert? Bzw. welche Kosten verursacht 
es, wenn du das FatFS nochmal mit in die Applikation packen musst?
(In meinem Fall war die Übertragung der Applikation EXTREM(!) 
teuer/aufwändig/langwierig, d.h. dort wollte man die Codegröße 
minimieren, auch wenn das die Komplexität stark hochtreibt.)

von ben (Gast)


Lesenswert?

@meckerziege

vielen Dank für die Ausführliche Antwort. Werde mal schauen wie 
Aufwendig es wäre FatFs zu modifizieren, die anderen Varianten klingen 
recht aufwendig.

Gibt es eigentlich eine einfach Möglichkeit die Funktionsadressen vom 
Linker zu bekommen?
Bisher schaue ich in das Map file und übertrage diese händisch..

von Mugl (Gast)


Lesenswert?

Wie wäre es mit eine Software Interrupt?

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.