Hallo zusammen, Gestern habe ich meine Toolchain geupdated und mir damit einen Fehler eingehandelt. alt: gcc version 4.4.1 (Sourcery G++ Lite 2009q3-68) neu: gcc version 4.6.1 (Sourcery CodeBench Lite 2011.09-69) Das Kompilieren normaler Programme funktioniert einwandfrei. Für Programme, die ich als Updates für Geräte mit Bootloader zur Verfügung stelle, muss ich das Programm an eine andere Stelle im Flash verschieben. Dafür ändere ich einfach im Linker-Skript folgende Zeile: FLASH (RX) : ORIGIN = 0x08000000+0, LENGTH = 128K-4K-0 in: FLASH (RX) : ORIGIN = 0x08000000+22K, LENGTH = 128K-4K-0-22K Alles lief einwandfrei bisher. Aber seit dem Toolchain-Update kann ich keine funktionierenden Updates mehr erstellen. Das Gerät startet einfach nicht. Ich bin jetzt wieder auf der alten Version, weil ich sonst nicht arbeiten kann, würde aber gerne updaten. Ist etwas bekannt, was sich an der Toolchain geändert hat? Der Compiler kann doch nicht daran schuld sein, weil erst der Linker aus dem fertigen Programm die HEX Datei macht? Danke :)
Den Resetvektor hast Du sicher entsprechend angepasst?
Auch der Linker ist neuer und sortiert jetzt noch mehr Dinge um wie es ihm passt. Das kann man mittels Mapfile (Linker Optionen --cref und -Map=Filename.map) nachvollziehen. Vielleicht ändert sich so ungewollt Deine Einsprungaddresse.
Beim vergleichen der MAP Files ist mir ist folgendes aufgefallen: Alter Linker:
1 | 0x20008000 _estack = 0x20008000 |
2 | 0x0801f000 _seemul = 0x801f000 |
3 | 0x00001000 _Minimum_Stack_Size = 0x1000 |
4 | 0x00000001 ASSERT (0x1, Start of memory region flash not aligned for startup vector table) |
5 | |
6 | .text 0x08005800 0xb6b8 |
7 | 0x08005800 . = ALIGN (0x80) |
8 | 0x00000000 _isr_vectorsflash_offs = (. - 0x8005800) |
9 | *(.isr_vectorsflash) |
10 | .isr_vectorsflash |
11 | 0x08005800 0x1e4 FLASH_RUN/startup_stm32f10x_cl.o |
12 | 0x08005800 g_pfnVectors |
13 | 0x080059e4 . = ALIGN (0x4) |
Neuer Linker:
1 | 0x20008000 _estack = (ORIGIN (RAM) + 0x8000) |
2 | 0x0801f000 _seemul = ORIGIN (EEMUL) |
3 | 0x00001000 _Minimum_Stack_Size = 0x1000 |
4 | 0x00000001 ASSERT ((ORIGIN (FLASH) == ALIGN (ORIGIN (FLASH), 0x80)), Start of memory region flash not aligned for startup vector table) |
5 | |
6 | .text 0x08005800 0xc210 |
7 | 0x08005800 . = ALIGN (0x80) |
8 | 0x00000000 _isr_vectorsflash_offs = (. - ORIGIN (FLASH)) |
9 | *(.isr_vectorsflash) |
10 | .isr_vectorsflash |
11 | 0x08005800 0x1e4 FLASH_RUN/startup_stm32f10x_cl.o |
12 | 0x08005800 g_pfnVectors |
13 | 0x080059e4 . = ALIGN (0x4) |
Der neue Linker scheint die ORIGIN() Funktion nicht mehr zu kennen? Ich habe das Linkerskript geändert und die Werte hart reingeschrieben, statt mit ORIGIN():
1 | 0x20008000 _estack = 0x20008000 |
2 | 0x0801f000 _seemul = 0x801f000 |
3 | 0x00001000 _Minimum_Stack_Size = 0x1000 |
4 | 0x00000001 ASSERT ((ORIGIN (FLASH) == ALIGN (ORIGIN (FLASH), 0x80)), Start of memory region flash not aligned for startup vector table) |
5 | |
6 | .text 0x08005800 0xc210 |
7 | 0x08005800 . = ALIGN (0x80) |
8 | 0x00000000 _isr_vectorsflash_offs = (. - 0x8005800) |
9 | *(.isr_vectorsflash) |
10 | .isr_vectorsflash |
11 | 0x08005800 0x1e4 FLASH_RUN/startup_stm32f10x_cl.o |
12 | 0x08005800 g_pfnVectors |
13 | 0x080059e4 . = ALIGN (0x4) |
Ich habe beide MAP Files verglichen, er ändert nichts anderes. Aber die neue HEX läuft! Es gibt nur einen Unterschied zwischen den Hex. Bei der funktionierenden steht an einer Stelle 08000000 und bei der nicht funktionierenden 08005800 Es reicht übrigens, wenn ich nur das ORIGIN() bei _isr_vectorsflash_offs = (. - 0x8005800) ersetze. Irgendwie kommt er mit dem ORIGIN() durcheinander oder das ist falsch eingesetzt worden.
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.