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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von ben (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Wie wäre es mit eine Software Interrupt?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.