Dieser ArtikelBenutzerSuche |
ARM-DevCpp
Dieser Artikel beschreibt, wie man die Entwicklungsumgebung DevC++ so einstellt, dass sie mit dem GnuARM Compiler arbeitet.
[bearbeiten] Bezugsquellen
Die folgenden Schritte wurden mit DevC++ 4.9.9.2 und GNU Arm 3.4 und 4.0 für Cygwin gemacht. [bearbeiten] DevC++ Einrichten[bearbeiten] Compiler einrichtenZuerst muss man DevC++ mitteilen, dass auf dem System ein (weiterer) C-Compiler vorhanden ist. Dazu öffne man den Dialog Werkzeuge->Compiler Optionen. Im Compiler Set konfigurieren-Abschnitt fügt man einen neuen Compiler durch betätigen der +-Taste hinzu, z.B. GNU ARM. Im folgenden ist wichtig, dass in der Auswahlliste neben der +-Taste der neu hinzugefügte Compiler ausgewählt ist (GNU ARM). Beim Compileraufruf müssen einige Flags angefügt werden: Folgende Befehle beim Compiler-Aufruf hinzufügen ankreuzen und in das darunterliegende Textfeld folgendes Eintragen: -g -Os -std=c99. Der Code wird dann auf Größe optimiert und der C99 Standard verwendet (for (int i = 0; i<10; i++){ ... } ist erlaubt) Ähnliches gilt für den Linker-Aufruf. Auch hier das Kächsten markieren und in das Textfeld darunter folgendes eintragen: -Tmem.ld -lc -lgcc -nostartfiles -g3 -nostdlib. Damit wird das Linkerscript mem.ld automatisch verwendet (dies ist bei Atmel's SAM7-Controller nötig). In der Karteikarte Einstellungen sind i.A. keine Änderungen vorzunehmen. Der Compiler arbeitet einwandfrei, wenn alle Auswahlmöglichkeiten auf No stehen. Als nächstes öffnet man die Karteikarte Verzeichnisse. Hier müssen die Verzeichnisse des Compilers eingestellt werden. Vorher ggf. vorhandene Verzeichnisse mit Löschen entfernen. In der Kartei Programmdateien das Verzeichnis für die GNU ARM Compilerdateien durch Eintragen in die Textzeile unter der Liste und anschließendem Betätigen von Hinzufügen einfügen (C:\Programme\GNUARM\bin). In der Kartei Bibliotheken muss das Verzeichnis lib eingefügt werden (C:\Programme\GNUARM\lib). Die Kartei C-Includes ist etwas umfangreicher zu ergänzen: Hier müssen die Includes für den Compiler und den Controller eingefügt werden (C:\Programme\GNUARM\include\atmel für den Controller und C:\Programme\GNUARM\arm-elf\include\ für die allgemeinen Funktionen des Compilers). Ähnliches gilt für die C++-Includes, hier ist C:\Programme\GNUARM\include\c++\3.4.3 (4.0.1 für den 4.0er Compiler) nötig (noch nicht getestet, ggf. Unterverzeichnisse hinzufügen). Nun ist die Umgebung schon fast fertig eingerichtet. In der Karteikarte Programme müssen nun noch die richtigen Programme ausgewählt werden: Als gcc wird arm-elf-gcc.exe eingetragen, als g++ arm-elf-g++.exe und als gdb arm-elf-gdb.exe. Nun kann dieser Dialog geschlossen werden. [bearbeiten] Projekt VorlageAls nächstes wird eine Vorlage gebraucht. Diese kann anschließend für ein neues Projekt kopiert werden (per Explorer/Arbeitsplatz o.ä.). Leider kann diese Aufgabe nicht durch ein Template gereglt werden, da dieses die nötigen Einstellungen nicht unterstützt. Man erstelle ein neues Projekt Datei->Neu->Projekt und wähle in der Kategorie Basic Empty Project aus. Als Namen gebe man z.B. ARM-C-Vorlage an und wähle im rechten unteren Teil C-Projekt aus. Als nächstes wird gefragt, wo das Projekt angelegt werden soll. Danach wird ein leeres Projekt erzeugt. Als erstes fügt man eine Haupt-Datei hinzu: Projekt->Neue Datei. Hier schreibt man eine Routine int main(void){ while(1); } mit einer Endlosschleife rein. Danach speichert man diese (Datei->Speichern) unter dem Namen main.c. [bearbeiten] Hersteller Spezifischer CodeWeiterhin muss dem Projekt noch der Startup-Code hinzugefügt werden (Projekt->Zum Projekt hinzufügen). Dieser ist je nach Zielkontroller ggf. etwas unterschiedlich. [bearbeiten] Atmel AT91SAM7S-SerieFür Atmel-Controller gibt es die Dateien Cstartup_c.c und Cstartup.S. Gute Vorlagen dieser Dateien gibt es z.B. in den AT91SAM7 Examples von Martin Thomas. Wird die Datei Cstartup_c.c von Martin Thomas verwendet, so empfiehlt es sich, auch die Datei Board.h und AT91SAM7S64.h zu übernehmen. [bearbeiten] Phillips LPC2000-SerieDen nötigen Startup-Code gibt´s in dem example Ordner von WinARM. Wer kein WinARM hat sollte sich auf der WinARM Seite die examples herunterladen und diese als Beispiel nehmen. [bearbeiten] DateieinstellungenNun sind folgende Dateien vorhanden:
Als nächstes müssen noch einige Einstellungen für das Projekt vorgenommen werden: Projekt->Projekt Optionen öffnet das benötigte Dialogfenster. Hier ist folgendes Wichtig:
[bearbeiten] MakefileDevC++ erzeugt durch die Einstellungen automatisch ein Makefile (Makefile.win). Manchmal sind aber Erweiterungen hierzu nötig: Zuerst erstellt man eine neue Datei Datei->Neu->Quelldatei. Diese Datei braucht nicht dem Projekt hinzugefügt werden. Dann fügt man in diese folgendes ein:
OBJDUMP = arm-elf-objdump
OBJCOPY = arm-elf-objcopy
all-after:
$(OBJCOPY) -O binary $(BIN) $(BIN).bin
$(OBJDUMP) -h -S -d $(BIN) >> $(BIN).lss
clean-custom:
${RM} $(BIN).bin
${RM} $(BIN).lss
Anschließend speichert man diese Datei unter dem Namen Makefile.inc im Projektverzeichnis ab und trägt in dem Dialog Projekt->Projekt Optionen in der Karteikarte Make Datei in die Liste den Eintrag Makefile.inc ein (darunterliegendes Textfenster benutzen). Diese Makefile erzeugt aus dem Ergebnis der Kompilation eine Binärdatei (für SAM-BA) und eine Disassemblierung (.lss). [bearbeiten] Linker-ScriptDa der ARM fast immer über einen Assembler-Startup-Code gestartet und initialisiert wird, der nicht in den Standardbibliotheken enthalten ist, muss dem Linker noch mitgeteilt werden, dass der Assembler-Startup-Code ganz an den Anfang des Programms muss. Dies wird in der Datei mem.ld im Projektverzeichnis festgelegt. Diese gibt es z.B. in dem AT91SAM7S64-Beispiel von Martin Thomas, dort heisst sie allerdings AT91SAM7S64-ROM.ld und muss also umbenannt werden nach mem.ld [bearbeiten] ZusammenfassungIm Projektverzeichnis befinden sich nun folgende Dateien:
Nach einer Erfolgreichen Kompilation und Linkung kommen folgende Dateien hinzu:
Anschließend sollte das Projekt einwandfrei Kompilieren und eine *.elf.bin und *.elf.lss Datei erzeugen. [bearbeiten] Links
|