XMC4700 Linker Fehler

Gast #4939534
Lesenswert?

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 #4939641
Lesenswert?

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.
#4939698
Lesenswert?

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.
#4939701
Lesenswert?

(º°)·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.· 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.
#4939759
Lesenswert?

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 #4939830
Lesenswert?

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 #4939861
Lesenswert?

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?
#4939862
Lesenswert?

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.
#4944102
Lesenswert?

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

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