Neue STM32 Toolchain - Bootloader Problem

OP #2642188
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 :)
OP #2642385
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren