Forum: Mikrocontroller und Digitale Elektronik STM32F4 IAP - wie Linker einstellen


von Kai (Gast)


Lesenswert?

Hallo zusammen!

Ich soll für den STM32F4 einen eigenen Bootloader entwerfen, der über 
IAP an eine höhere Speicheradresse (also z.B. 0x08004000) ein eigenes 
Programm ins Flash schreibt.

Laut den Application Notes soll man ja dafür mit dem Linker die 
Startadresse im Flash verschieben.
Da ich die Eclipse Toolchain mit arm-none-eabi-gcc benutze, kann ich die 
Adresse für den Linker nicht dort einstellen, sondern muss das über das 
Linkerscript machen.

Sobald ich allerdings in mein Linkerscript gehe und dort die 
entscheidende Zeile ändere

FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 1024K

in diese Zeile

FLASH (rx) : ORIGIN = 0x08004000, LENGTH = 1024K - 0x4000

geht nichts mehr, das Programm wird sogar scheinbar übertragen, der 
Debugger schickt aber merkwürdige Fehlermeldungen  [Error: address + 
size wrapped(0xffffffff, 0x00000004)] und das Programm läuft nicht 
durch.

1. Was mache ich falsch?

2. Warum sollte ich die Startadresse im Linker verändern, obwohl ich 
erstmal das Bootloader Programm an die Adresse 0x08000000 schreiben 
muss? Die andere Startadresse brauche ich doch erst, wenn das Bootloader 
Programm schon läuft. Das verstehe ich nicht.

3. Oder gibt es die Möglichkeit, dort zwei Linkerscripte zu verwenden, 
ein flash.ld zum flashen des Bootloaders und ein flash_offset.ld, was 
ich brauche, wenn ich mein Userprogrammimage vom Bootloader aus 
nachlade? Und wie mache ich das? Das wird leider aus den Application 
Notes überhaupt nicht klar.

Vielen Dank schonmal für die Beantwortung. Falls es schon einen anderen 
passenden Thread gibt, verlinkt mich einfach oder gebt mir ein 
Suchstichwort, dann ist mir auch geholfen.

von Kai (Gast)


Lesenswert?

Kann mir keiner weiterhelfen? Schade.

von Dirk B. (garag)


Lesenswert?

Wenn das Programm Interrupts verwendet muß noch der Offset für die IRQ 
Vektortabelle gesetzt werden.

Zum Build Prozess:

1) Ich würde erwarten, dass der Bootloader ein eigenes Projekt mit dem 
normalem Linkerscript ist.

FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 1024K

2) Das Programm wird dann mit dem angepassten Linkerscript übersetzt.

FLASH (rx) : ORIGIN = 0x08004000, LENGTH = 1024K - 0x4000

Mit dem Debuggen könnte es etwas schwieriger werden. Wenn der Bootloader 
automatisch das Vorhandensein des Programms erkennt und mit angepasster 
Vektortabelle in das Programm springt (Reset Vektor als Einsprung und 
Stack Pointer nicht vergessen) könnte es auch mit dem Debugger gehen. 
Oder der Debugger müsste entsprechend die Einstellungen vornehmen.

von Kai (Gast)


Lesenswert?

Dirk B. schrieb:
> Wenn das Programm Interrupts verwendet muß noch der Offset für die IRQ
> Vektortabelle gesetzt werden.

Ja, das ist klar. Kann man z.B. im Sourcecode setzen mit

#define VECT_TAB_OFFSET 0x4000

Ich nehme an, diesen Wert muss man beim Einsprung in das andere Programm 
als Parameter übergeben.

> Zum Build Prozess:
>
> 1) Ich würde erwarten, dass der Bootloader ein eigenes Projekt mit dem
> normalem Linkerscript ist.
>
> FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 1024K

D.h. ich übersetze, linke und lade erstmal meinen Bootloader mit  obiger 
Zeile an den Anfang des Flashspeichers. Soweit ACK.

> 2) Das Programm wird dann mit dem angepassten Linkerscript übersetzt.
>
> FLASH (rx) : ORIGIN = 0x08004000, LENGTH = 1024K - 0x4000

Hier war ja mein Verständnisproblem. Ich bin noch relativ neu im 
Geschäft mit uCs, also nochmal langsam für mich als uC-Einteiger:

Ich übersetze und linke mir also ein zweites Programm, das ich in den 
höheren Speicherbereich schreiben möchte. Mit der obigen Zeile 2 im 
eigenen Linkerscript. Dieses kann ich dann über den Bootloader in den 
höheren Speicherbereich schreiben und dorthin springen, falls alles 
klappt. Ja, das hört sich schlüssig an, auch was die Application Notes 
angeht.

> Mit dem Debuggen könnte es etwas schwieriger werden. Wenn der Bootloader
> automatisch das Vorhandensein des Programms erkennt

Da es mein eigener Booloader sein wird, ja.

> und mit angepasster
> Vektortabelle in das Programm springt (Reset Vektor als Einsprung und
> Stack Pointer nicht vergessen) könnte es auch mit dem Debugger gehen.
> Oder der Debugger müsste entsprechend die Einstellungen vornehmen.

Das wird wohl mein Problem sein, sonst hätte ich ja schon direkt dort an 
0x08004000 debuggen können.

Weiss jemand, wie ich den OCD unter Eclipse dazu bekomme, dort hin zu 
springen?

Erstmal tausend Dank an Dirk.

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.