XMC4700 Linker Fehler

Gast #4939534
Hallo,

auf dem Infineon Mikrocontroller XMC4700 benutze ich den ARM GCC 
Compiler.
Der Linker erzeugt folgende Meldung:

ld.exe: address 0x802001c of TestAppl.elf section `.abm' is not within 
region `FLASH_1_cached'

Auszug aus dem Linkerscript File:
1
MEMORY
2
{
3
    FLASH_1_cached(RX) : ORIGIN = 0x08000000, LENGTH = 0x00020000
4
    FLASH_1_uncached(RX) : ORIGIN = 0x0C000000, LENGTH = 0x00020000
5
    PSRAM_1(!RX) : ORIGIN = 0x1FFE8000, LENGTH = 0x18000
6
    DSRAM_1_system(!RX) : ORIGIN = 0x20000000, LENGTH = 0x20000
7
    DSRAM_2_comm(!RX) : ORIGIN = 0x20020000, LENGTH = 0x20000
8
    SRAM_combined(!RX) : ORIGIN = 0x1FFE8000, LENGTH = 0x58000
9
}
10

11
  /* http://mcuoneclipse.com/2012/11/01/defining-variables-at-absolute-addresses-with-gcc/ */
12
  .abm ABSOLUTE(0x0801FFE0): AT(0x0801FFE0 | 0x04000000)
13
  {
14
     KEEP(*(.flash_abm))
15
  } > FLASH_1_cached

MAP File:
1
.abm            0x0801ffe0       0x3c load address 0x0c01ffe0
2
 *(.flash_abm)
3
 .flash_abm     0x0801ffe0       0x14 ./Libraries/LwipLib/port/netif/ethernetif.o
4
 .flash_abm     0x0801fff4       0x14 ./Libraries/LwipLib/port/sys_arch.o
5
 .flash_abm     0x08020008       0x14 ./main.o
6

7
.rel.dyn        0x0802001c        0x0 load address 0x0c02001c
8
 .rel.iplt      0x00000000        0x0 ./Startup/startup_XMC4800.o

Wie kann ich diesen Fehler beheben?
Gast
Wenn Mann kein Laie ist, kann Mann den Koempeiler dazu bewegen
ein Mapfile zu erzeugen.
Fortgeschrittenere koennen auch mit objdump sich einen
Disassemblerdump aufs Auge druecken.
techniker schrieb:
>     FLASH_1_cached(RX) : ORIGIN = 0x08000000, LENGTH = 0x00020000

Also der Bereich ist schon mal außerhalb.

>  .flash_abm     0x08020008       0x14 ./main.o

Der .abm Bereich läuft eindeutig über.

techniker schrieb:
> Wie kann ich diesen Fehler beheben?

Über den Sinn und Zweck kann man nur spekulieren. Daher die einfache 
Antwort: Den .abm Bereich auf eine niedrigere Adresse legen. Momentan 
brauchst du soviel Platz:

techniker schrieb:
> .abm            0x0801ffe0       0x3c

0x3C Byte

Da das Linken aber noch nicht vollständig geklappt hat, kann es noch 
mehr werden.
(º°)·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.· schrieb im Beitrag 
#4939641:
> Wenn Mann kein Laie ist, kann Mann den Koempeiler dazu bewegen
> ein Mapfile zu erzeugen.

Er hat doch den relevanten Teil beigefügt und scheint Hilfe zu 
benötigen, diese zu verstehen.

> Fortgeschrittenere koennen auch mit objdump sich einen
> Disassemblerdump aufs Auge druecken.

Dürfte bei einem Linkerfehler noch nicht möglich sein.
Alabama J. schrieb:
> Zeig mal dein linkerscript


techniker schrieb:
> .abm ABSOLUTE(0x0801FFE0): AT(0x0801FFE0 | 0x04000000)
>   {
>      KEEP(*(.flash_abm))
>   } > FLASH_1_cached

.abm soll in FLASH_1_cached beginnend ab 0x0801FFE0

techniker schrieb:
> FLASH_1_cached(RX) : ORIGIN = 0x08000000, LENGTH = 0x00020000

FLASH_1_cached geht bis 0x081fffff

-> macht 32 Byte

Beim aktuellen Stand des Linkens
> .abm            0x0801ffe0       0x3c
werden schon 60 Byte benötigt.

Was mehr willst du aus dem Linkerfile erkennen?
Gast
Erstmal vielen Dank für eure Unterstützung.

Der abm ist der Application Boot Mode.Dieser wird benötigt damit ich in 
den oberen Flashbereich die Firmware starten kann. Dieser Bereich ist 
von Infineon fest vorgegeben.

Was könnte man noch tun damit dieser Linker Fehlermeldung nicht 
erscheint?
Gast
Heute Nachmittag habe ich den Compiler auf Optimierung eingestellt. Der 
Linker hat da nicht gemeckert allerdings hat das Programm nicht so 
richtig funktioniert. Sollte man das Compilieren wenn möglich ohne 
Optimierung durchführen?
Lt.
"Tooling - Boot mode options XMC4000 - Infineon"
Seite 18
gehört in den ABM-0 der ABM header rein.

>.flash_abm     0x0801ffe0       0x14 ./Libraries/LwipLib/port/netif/ethernetif.o
> .flash_abm     0x0801fff4       0x14 ./Libraries/LwipLib/port/sys_arch.o
> .flash_abm     0x08020008       0x14 ./main.o

Deutet darauf hin, dass du den Header 3x drin hast.
In diesen 3 Files mußt du schauen. Hier gibt es sicher eine Struktur mit 
dem Verweis auf .flash_abm.

Ich vermute, du hast zuviel gleichzeitig aktiviert. Zwei der Strukturen 
müssen wohl deaktiviert bleiben/werden.
Gast
Kann erst nächste Woche am Montag das ganze Testen. Mit sicherheit wird 
dies das Problem sein oder? In der main.h Datei ist auch die 
Implementierung von der abm Sprungfunktion enthalten.
Implementierungen im Header sind oft keine gute Wahl. Sinn und Zweck von 
Headern ist ja gerade, dass diese durch verschiedene C-Dateien 
inkludiert werden.

Manchmal löst man derartige Anforderungen dadurch, dass in einer C-datei 
vor dem inkludieren ein zusätzliches Define gesetzt wird, was diese 
Funktionalität freischaltet.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.