www.mikrocontroller.net

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


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Florian Micro (micro-flo)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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 :)

Autor: scherenschleifer (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Den Resetvektor hast Du sicher entsprechend angepasst?

Autor: Jim Meba (turboj)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Florian Micro (micro-flo)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Beim vergleichen der MAP Files ist mir ist folgendes aufgefallen:

Alter Linker:
                0x20008000                _estack = 0x20008000
                0x0801f000                _seemul = 0x801f000
                0x00001000                _Minimum_Stack_Size = 0x1000
                0x00000001                ASSERT (0x1, Start of memory region flash not aligned for startup vector table)

.text           0x08005800     0xb6b8
                0x08005800                . = ALIGN (0x80)
                0x00000000                _isr_vectorsflash_offs = (. - 0x8005800)
 *(.isr_vectorsflash)
 .isr_vectorsflash
                0x08005800      0x1e4 FLASH_RUN/startup_stm32f10x_cl.o
                0x08005800                g_pfnVectors
                0x080059e4                . = ALIGN (0x4)

Neuer Linker:
                0x20008000                _estack = (ORIGIN (RAM) + 0x8000)
                0x0801f000                _seemul = ORIGIN (EEMUL)
                0x00001000                _Minimum_Stack_Size = 0x1000
                0x00000001                ASSERT ((ORIGIN (FLASH) == ALIGN (ORIGIN (FLASH), 0x80)), Start of memory region flash not aligned for startup vector table)

.text           0x08005800     0xc210
                0x08005800                . = ALIGN (0x80)
                0x00000000                _isr_vectorsflash_offs = (. - ORIGIN (FLASH))
 *(.isr_vectorsflash)
 .isr_vectorsflash
                0x08005800      0x1e4 FLASH_RUN/startup_stm32f10x_cl.o
                0x08005800                g_pfnVectors
                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():
                0x20008000                _estack = 0x20008000
                0x0801f000                _seemul = 0x801f000
                0x00001000                _Minimum_Stack_Size = 0x1000
                0x00000001                ASSERT ((ORIGIN (FLASH) == ALIGN (ORIGIN (FLASH), 0x80)), Start of memory region flash not aligned for startup vector table)

.text           0x08005800     0xc210
                0x08005800                . = ALIGN (0x80)
                0x00000000                _isr_vectorsflash_offs = (. - 0x8005800)
 *(.isr_vectorsflash)
 .isr_vectorsflash
                0x08005800      0x1e4 FLASH_RUN/startup_stm32f10x_cl.o
                0x08005800                g_pfnVectors
                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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
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.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net