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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.