Forum: Mikrocontroller und Digitale Elektronik Neue STM32 Toolchain - Bootloader Problem


von Florian M. (micro-flo)


Lesenswert?

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 :)

von scherenschleifer (Gast)


Lesenswert?

Den Resetvektor hast Du sicher entsprechend angepasst?

von Jim M. (turboj)


Lesenswert?

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.

von Florian M. (micro-flo)


Lesenswert?

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