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.
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.
@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?
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.
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'
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!!
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.)
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!!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.