Forum: Compiler & IDEs ARM, Section Warning


von Heiko S. (heiko_s)


Lesenswert?

Hallo GCC Gemeinde,

ich erhalte folgende Fehlermeldung und kann nicht wirklich etwas damit 
anfangen, zumal eigentlich auch alles funktioniert!
Fehlermeldung: 
d:/programme/atmel/arm/programme/yagarto/bin/../lib/gcc/arm-elf/4.3.3/.. 
/../../../arm-elf/bin/ld.exe:  warning: dot moved backwards before 
`Flash_Buffer_Section'.

Aufruf: arm-elf-gcc -nostartfiles -Wl,--cref -lc -lgcc 
-TEVBmmTm_SAM7S256_RAM.cmd -Ttext 0x00100000 
-Wl,--section-start,Flash_Buffer_Section=0x0013A000 -Tdata 0x0020B000 -n 
-o evbmmtm_sam7S256_flash.elf cstartup_flash.o cpu_init.o pit_unit.o 
spi_unit.o flash_unit.o pio_unit.o uart_unit.o glcd_unit.o main.o > 
evbmmtm_sam7S256_flash.map.

Durch diesen Aufruf möchte ich eine Tabelle in die Flash_Buffer_Section 
laden.
Wenn ich nun das übersetzte Programm in den Flash_Speicher lade, 
funktioniert alles und die Tabelle steht an der richtigen Adresse, warum 
also die Fehlermeldung (Warning)?

von Martin Thomas (Gast)


Lesenswert?

Wenn Linker-Skript (EVBmmTm_SAM7S256_RAM.cmd) und das Map-File 
(evbmmtm_sam7S256_flash.map) gezeigt würden, könnte man evtl. besser 
helfen.

Hatte diese Warnung selbst noch nicht, wahrscheinlich weil ich für 
ARM-Projekte mit etwas speziellem Memory-Layout ein angepasstes 
Linkerskript statt Kommandozeilenparameter nutze. Somit nur eine 
Interpretation der Warnung (sicher ist das aber irgendwo auch richtig 
dokumentiert): der Adresszähler des Linkers ("dot") wird durch die 
Vorgabe der Startadresse der "Flash_Buffer_Section" auf einen Wert 
gesetzt wird, der kleiner ist als der zu diesem Zeitpunkt aktuelle Wert.

von Heiko S. (heiko_s)


Angehängte Dateien:

Lesenswert?

Hallo Martin,

erst einmal danke für die Antwort.

Das .map und .cmd File habe ich mal angehangen, aber ich glaube, dort 
steht nichts besonderes drin.
Ich habe die section-start auch schon an anderer Stelle, sprich in der 
Reihenfolge der Speicheradressierung probiert, die Meldung ist immer 
gleich.
Natürlich verwende ich auch ein Makefile, die Fehlermeldung war nur ein 
Auszug aus dem make Vorgang. Habe ich aber auch im Anhang.

Wenn ich eine Doku über die Einträge in der ".cmd" finden könnte, würde 
ich die Einträge für die Tabelle "Flash_Buffer" auch dort machen, denn 
die Fehlermeldung nervt!

von Martin T. (mthomas) (Moderator) Benutzerseite


Lesenswert?

Bitte eine minimale Beispielanwendung erstellen, in der alle 
erforderlichen Dateien (Makefile, Linker-Skript, Assembler- und C-Codes) 
für ein einfaches "make all" enthalten sind. Es ist etwas knifflig ein 
brauchbare Lösung zu zeigen, wenn man nicht genau weiß was in die 
Section soll, vermute mal es sind es read-only Daten aber evtl. ja auch 
noch Code.

Würde das in der Art lösen:

- je ein Linker-Skript für "RAM/Debug" und "Flash/relaease".
- In den Beiden Linker-Skripten MEMORY eintragen

Diese Punkte ersparen zumindest mal die Kommandozeilenparameter -Ttext 
und -Tdata und schließen damit eine Problemquelle aus. Vorlagen dafür 
z.B. in den softpacks von atmel.com

Sieht so aus, also ob die section genau an einer bestimmten 
Speicherstelle beginnen soll (falls nicht, nochmal fragen). Würde dann 
in der Art fortfahren (gibt mglw. bessere Alternativen):

- einen weiteren Eintrag im MEMORY-"Array" des Linker-Skripts für diesen 
Speicherbereich und ORIGIN/LENGTH der sonstigen Einträge anpassen.
- analog zu ".text/.data" in den vorhandenen Linker-Skripten weitere 
Einträge für die selbstdefinierte Section anlegen darin statt auf z.B. 
>flash ein >flash_buffer_mem damit diese dem Speicherbereich für 
zugewiesen werden, den man für den Buffer nutzen will.

Vorgehensweise ist ähnlich der, die man verwenden kann, wenn ein 
Controller nur DMA für bestimmte Speicherbereiche bietet. Dann muss man 
auch dafür sorge trage, dass das/die Arrrays für den Pufferbereich in 
eben diesen Speicherbereichen abgelegt werden).

Sorry, eine etwas ungenaue Erklärung aber ich kenne die korrekten 
Bezeichnungen für die Elemente von Linkerskipten selbst nicht so genau, 
da bisher "einfach gemacht" ohne sich die Definitionen aus dem gnu-ld 
Manual zu merken.

von Heiko S. (heiko_s)


Lesenswert?

Hallo Martin,

nochmals Danke!

Ich werde mal ein minimales Beispiel erstellen und dann hier ablegen. Es 
wird aber etwas dauern, da ich mir ein paar Tage Urlaub genehmigt habe.

Du hast recht, in dem Speicherbereich sollen Daten liegen, die als 
Source für SPI-send dienen sollen. Da der SAM7S für den PDC leider ein 
paar Fehler im SPI-fixedMode hat, muss ich im variableMode die Daten 
(528 * 4 Byte) zur Verfügung stellen und habe, da genug Flash zur 
Verfügung steht, die Tabelle im Flash abgelegt.
Wenn ich nun im RAM mein Programm debuggen möchte (Tabelle ist dann 
nicht Bestandteil des Programms) und nicht jedes Mal der Flash neu 
beschrieben werden soll, sollten die Daten an festen Adressen liegen 
(einmal im Flash, immer im Flash) und ich kann immer darauf zugreifen.
Wie gesagt, wenn ich die Syntax vom .cmd File kennen würde, könnte ich 
diese Tabelle als Bestandteil einbinden, aber dann wird ja doch nicht 
nur der RAM sondern auch der Flash beschrieben, nicht oder?

Ich lasse dann wieder etwas von mir hören.

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.