Bootloader Funktionen wieder verwenden (STM32F0xx, GCC)

Gast #4864509
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?
#4864543
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.
#4864549
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.
Gast #4864655
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.
Gast #4864671
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.)
Gast #4864702
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..

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren