Forum: Mikrocontroller und Digitale Elektronik XMC4700 Linker Fehler


von techniker (Gast)


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?

von techniker (Gast)


Lesenswert?

Wie kann man erkennen welche Variable oder Funktion die Adresse 
0x0802001c benutzt?

von (º°)·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.· (Gast)


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.

von Steffen R. (steffen_rose)


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.

von Steffen R. (steffen_rose)


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.

von Alabama J. (alabamajack)


Lesenswert?

Zeig mal dein linkerscript

von Steffen R. (steffen_rose)


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?

von techniker (Gast)


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?

von techniker (Gast)


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?

von Steffen R. (steffen_rose)


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.

von techniker (Gast)


Lesenswert?

Ich wüsste jetzt nicht wo ich da suchen sollte. Das verstehe ich nicht.

von techniker (Gast)


Lesenswert?

Achso. In der ethernetif.c Datei sowie in der sys_arch.c werden jeweils 
die main.h aufgerufen. Das könnte die Ursache sein.

von techniker (Gast)


Lesenswert?

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.

von Steffen R. (steffen_rose)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.