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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.