ARM-DevCpp
-- Clemens Helfmeier 18:45, 22. Okt 2005 (CEST)
Dieser Artikel beschreibt, wie man die Entwicklungsumgebung DevC++ so einstellt, dass sie mit dem GnuARM Compiler arbeitet.
Bezugsquellen
- GNU ARM toolchain für Windows und Linux ist unter http://www.gnuarm.com/ zum kostenlosen Download erhältlich (Binaries stehen weiter unten).
- DevC++ ist eine IDE für C und C++ von Bloodshed. Download unter http://www.bloodshed.net/dev/devcpp.html
Die folgenden Schritte wurden mit DevC++ 4.9.9.2 und GNU Arm 3.4 und 4.0 für Cygwin gemacht.
DevC++ Einrichten
Compiler einrichten
Zuerst 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.
Projekt Vorlage
Als 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.
Hersteller Spezifischer Code
Weiterhin muss dem Projekt noch der Startup-Code hinzugefügt werden (Projekt->Zum Projekt hinzufügen). Dieser ist je nach Zielkontroller ggf. etwas unterschiedlich.
Atmel AT91SAM7S-Serie
Fü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.
Phillips LPC2000-Serie
Den 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.
Dateieinstellungen
Nun sind folgende Dateien vorhanden:
Dateiname | Inhalt | Einstellungen bei Projekt Optionen->Dateien |
Board.h | Board-Definitionen | keine Änderungen möglich (Header-Datei), nicht zwingend erforderlich |
Cstartup.S | Assembler-Startup-Code | In Kompilation Einbeziehen, Ins Linken einbeziehen, Überschreibe Build Kommando, Textfeld = $(CC) -c Cstartup.S -o Cstartup.o $(CFLAGS) |
Cstartup_c.c | C-Startup-Code | In Kompilation Einbeziehen, Ins Linken einbeziehen |
main.c | C-Programm | In Kompilation Einbeziehen, Ins Linken einbeziehen |
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:
- Karteikarte Allgemein: Der Projekt-Type muss Win32 Konsole sein,
- Karteikarte Dateien: Auf jede Datei klicken und die Einstellungen aus der obigen Tabelle übernehmen. Meine DevC++ stürzt ab, sobal die Priorität von 1000 verschieden ist. Davon also die Finger lassen ;-).
- Karteikarte Compiler: Hier muss der richtige Compiler ausgewählt werden (GNU ARM), der rest kann gelassen werden (alles auf No).
- Karteikarte Parameter: Hier muss der Controllertyp angegeben werden: -mcpu=arm7tdmi sowohl in das Compiler- als auch in das C++-Compiler-Textfeld einfügen.
- Karteikarte Build Optionen: Hier kann das Kästchen Überschreibe Ausgabe-Dateiname angewählt werden, wenn man keine *.exe Dateie erzeugen will. Ggf. ARM-C-Vorlage.elf eintragen.
- Karteikarte Make Datei: Es muss ein externes Makefile eingefügt werden, um aus der *.elf Datei eine *.bin Datei zu erzeugen. Es kann auch gleich eine Disassemblierung veranlassen, näheres dazu weiter unten.
Makefile
DevC++ 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).
Linker-Script
Da 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
Zusammenfassung
Im Projektverzeichnis befinden sich nun folgende Dateien:
- ARM-C-Vorlage.dev: DevC++-Projekt Datei
- ARM-C-Vorlage.layout: DevC++-Datei
- Board.h: Definitionen für das verwendete System (nicht zwingend erforderlich)
- Cstartup.S: Assembler-Startup-Datei
- Cstartup_c.c: C-Startup-Datei
- main.c: C-Programm Datei
- Makefile.inc: Zusätzliches Makefile
- mem.ld: Linker-Script
Nach einer Erfolgreichen Kompilation und Linkung kommen folgende Dateien hinzu:
- ARM-C-Vorlage.elf: Ergebnis des Linkers
- ARM-C-Vorlage.elf.bin: Binärdatei für den Flash
- ARM-C-Vorlage.elf.lss: Dissassemblierte Binärdatei
- Cstartup.o
- Cstartup_c.o
- main.o
- Makefile.win: Makefile von DevC++
Anschließend sollte das Projekt einwandfrei Kompilieren und eine *.elf.bin und *.elf.lss Datei erzeugen.
Links
- Martin Thomas' ARM-Projekt Seite
- ARM-elf-GCC-Tutorial
- Alexander Poddey's ARM startup on linux (gnu toolchain, openocd, olimex's arm-usb-ocd)
- http://sourceware.org/binutils/docs/ld/index.html - Ziemlich aktuelles GNU ld Manual mit ausführlicher Beschreibung der sog. Linkerskripte (engl.)