Forum: Compiler & IDEs Aus dem Makefile dem Assembler eine Variable übergeben!


von Heiko_S (Gast)


Lesenswert?

Hallo zusammen!

Ich möchte ein Stück Software compilieren (Eclipse und WinARM), wobei 
für die Initialisierung des SAM7X256 ein startup.s notwendig ist. Dem 
Aufruf vom GCC Assembler möchte ich nun eine Variable (SAM7X256 od. 
SAM7X64 od. ähnliches) mitgeben, die wiederum im Assembler Code 
ausgewertet werden kann.
Hintergrund ist das eigentliche Setzen vom Stackpointer auf das reale 
Speicherende. Bisher habe ich keine Möglichkeit gefunden (vielleicht bin 
ich ja auch nur zu blöde) und ich möchte eigentlich die Definition für 
welche CPU (Speicher) dieses Programm übersetzt werden soll im Makefile 
durchführen und nicht im Assembler fest codieren.

von Martin T. (mthomas) (Moderator) Benutzerseite


Lesenswert?

Einfachste Lösung ist wahrscheinlich den C-Preprozessor zu verwenden. 
Assembler nicht direkt aufrufen, sondern über das Frontend (arm-*-gcc), 
Dateiendung der Assemblerdatei mit grossem S und "Umschalter-Defintion" 
per -D übergeben.

von Heiko_S (Gast)


Lesenswert?

@Martin

Ich hatte die -D Option schon ausprobiert, musste in der arm-elf-as.exe 
Beschreibung feststellen, das die Option -D nur der Kompatibilität zu 
anderen Compiliern dient und eigentlich ignoriert wird. Warum der 
Unterschied "s" und "S" und was bewirkt dieser Unterschied?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Du rufst nicht as (bzw. arm-elf-as) selbst auf, sondern du rufst
gcc (arm-elf-gcc) mit einer *.S-Datei auf.  Dieser wiederum nimmt
den Suffix .S als Kennzeichen, dass er den C-Präprozessor (cpp)
mit all den für den Präprozessor relevanten Optionen (-D, -I, -U)
auf die originale Datei aufrufen soll, und anschließend den
eigentlichen Assembler auf die Ausgabe des Präprozessors losschickt.

Bei Dateien auf *.s hingegen würde der Compiler nur den Assembler
rufen.

von Heiko_S (Gast)


Lesenswert?

Ach, ich bin heute aber schwer von Begriff!!

Ja, ich benutze "arm-elf-gcc". Mein Aufruf ->
arm-elf-gcc -g -mcpu=arm7tdmi -DAT91SAM7X256 -c -O0 -Wall -I./ 
-Wa,-adhlns=cstartup.lst,--gdwarf-2 cstartup.s -o cstartup.o
Der wiederum ruft den Assembler "as.exe" auf.
Im Assembler Code habe ich die Definition ->
.ifdef AT91SAM7X256
 .print "TOP_OF_MEMORY,  0x00210000"
 .equ  TOP_OF_MEMORY,  0x00210000
.endif
Aber ich erhalte die Fehlermeldung ->
D:\Programme\Atmel\ARM\Projekte\Olimex_SAM7X256_RAM/cstartup.s:252: 
undefined reference to `TOP_OF_MEMORY'

von Heiko_S (Gast)


Lesenswert?

Wieder etwas gelernt!!

Wenn ich die Datei umbenenne, Endung mit "S", kann ich im Ass-Code mit 
#ifdef (nicht mit .ifdef) tatsächlich die Variable die mit "-D" 
eingestellt wird abfragen.

Vielen Dank euch Beiden!!

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Du kannst dann übrigens auch im Assemblercode C-Kommentare benutzen. ;-)

(Das liegt daran, dass diese Kommentare auch bereits vom Präprozessor
durch Leerzeichen ersetzt werden.)

von Heiko_S (Gast)


Lesenswert?

Das ist ja einfach!!
Dann kann ich sogar die at91sam7x256.h mit includieren (blödes Wort) und 
brauche nicht alle schon fertigen Definitionen nochmals machen.
Das ist ja einfach!!

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Genau so ist es wohl sicher auch gedacht gewesen...

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.