Ich möchte ein Makefile zum Kompilieren von c-Programmen für das Arduino erstellen. Ich bin mit make etwas vertraut, habe es aber noch nie mit avr-gcc verwendet. Was ist der einfachste Weg, die folgenden Befehle in ein Makefile einzufügen?
$ avr-gcc -Os -DF_CPU=16000000UL -mmcu=atmega328p -c -o led.o led.c
$ avr-gcc -mmcu=atmega328p led.o -o led
$ avr-objcopy -O ihex -R .eeprom led led.hex
$ avrdude -F -V -c arduino -p ATMEGA328P -P /dev/ttyACM0 -b 115200 -U flash:w:led.hex
-I/usr/share/arduino/hardware/arduino/cores/arduino -I/usr/share/arduino/hardware/arduino/variants/standard
und zu verlinkenlibcore.a
. :-)Antworten:
Es ist nicht anders als mit Make und jeder anderen Form von GCC zu arbeiten. Stellen Sie einfach Ihre CC-Variable und CFLAGS-Variable entsprechend ein und arbeiten Sie wie gewohnt.
Zum Beispiel habe ich gerade diesen umgehauen:
Das heißt, dass jede automatische C-Kompilierung mit avr-gcc und den in CFLAGS angegebenen Flags durchgeführt wird. Standardmäßig wird die Hex-Datei mit OBJCOPY erstellt, das auf avr gesetzt ist und auf der Datei led.elf basiert. Um diese Datei zu erhalten, wird das Ziel led.elf ausgeführt, mit dem die Objektdatei led.o verknüpft ist Die Standardbibliotheken verwenden alles, was in CC festgelegt wurde. Dazu benötigt es led.o und macht dies automatisch mit dem in CC angegebenen Programm und den Flags in CFLAGS. Sie können dann optional
make install
ausführenavrdude
, um die Hex-Datei auf dem Chip zu installieren.Sie können es noch allgemeiner gestalten, um es in andere Projekte zu kopieren und die erforderlichen Mindeständerungen vorzunehmen:
Das nutzt "automatische Variablen" und einfache Namensersetzung.
BIN
enthält die "Basis" Ihrer Binärdateien,OBJS
enthält die Liste der Objektdateien. $ @ ist der Name des aktuellen Ziels, $ <ist der Name der ersten Voraussetzung und $ ^ ist die Liste aller Voraussetzungen. Einfach umziehenBIN
undOBJS
anpassen. Als Bonus habe ich eingeworfenmake clean
, um die kompilierten Dateien zu entfernen und Sie einfach mit der Quelle zu belassen.quelle
install
oder eine aufgerufene Datei erstellenclean
(vielleicht Shell-Skripte?),make
Denken Sie möglicherweise, dass dies der Fall ist,Up to date
und tun Sie nichts.clean.sh
undinstall.sh
wenn Sie sie haben müssen.Die akzeptierte Antwort ist großartig, da sie mir eine wertvolle Lektion in allen Arten von Debugging-Tools erteilt hat (avr-objdump -D ist ein enger Freund geworden). Die Zeile:
${OBJCOPY} -O ihex -R .eeprom $< $@
fehlt das Architekturflag und sollte lesen
$ {OBJCOPY} -mmcu = atmega328p -O ihex -R .eeprom $ <$ @
Ohne das Architektur-Flag -mmcu schätzt avr-gcc, dass wir für die 8515-Architektur kompilieren (definitiv nicht), und es erzeugt die .elf-Datei ohne anfängliche Anweisungen zum Initialisieren, dh ohne Anweisungen zum Aufrufen der "Haupt" -Funktion usw.
Dies führt zu einem verwirrenden Verhalten, da jedes einfache Programm (z. B. Blinken) mit nur der "main" -Funktion einwandfrei funktioniert. Wenn Sie jedoch vor oder nach dem "main" eine andere Funktion definieren, wird diese Funktion ausgeführt und niemals "main" aufgerufen oder neu gestartet die ganze Zeit usw.
Ich bin auch kein besonderer Fan davon, die Überprüfung des korrekten MCU-Typs und des hochgeladenen Programms zu vermeiden, daher würde ich empfehlen, nicht -F und -V und stattdessen -v zu verwenden.
Die verbesserte Antwort könnte also lauten:
quelle