Je voudrais faire un makefile pour compiler des programmes c pour l'arduino. Je suis un peu familier avec make mais je ne l'ai jamais utilisé avec avr-gcc. Quelle est la façon la plus simple de mettre les commandes ci-dessous dans un makefile?
$ 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
et d'établir un lien aveclibcore.a
. :-)Réponses:
Ce n'est pas différent de travailler avec Make et toute autre forme de GCC. Réglez simplement votre variable CC et votre variable CFLAGS en conséquence et travaillez comme d'habitude.
Par exemple, je viens de faire tomber celui-ci:
Cela signifie que toute compilation C automatique se fera avec avr-gcc et les indicateurs spécifiés dans CFLAGS. Par défaut, il créera le fichier hex en utilisant OBJCOPY, qui est défini sur celui d'avril, qui s'appuie sur le fichier led.elf - donc pour obtenir ce fichier, il exécute la cible led.elf, qui relie le fichier objet led.o avec les bibliothèques par défaut utilisant tout ce qui a été défini dans CC. Pour ce faire, il a besoin de led.o, et il le fait automatiquement en utilisant le programme spécifié dans CC et les drapeaux dans CFLAGS. Vous pouvez ensuite éventuellement à
make install
qui s'exécuteraavrdude
pour installer le fichier hexadécimal dans la puce.Vous pouvez le rendre encore plus générique pour pouvoir le copier dans d'autres projets et apporter les modifications minimales nécessaires:
Cela utilise des "variables automatiques" et un simple remplacement de nom.
BIN
contient la "base" de vos fichiers binaires,OBJS
contient la liste des fichiers objets. $ @ est le nom de la cible actuelle, $ <est le nom du premier prérequis et $ ^ est la liste de tous les prérequis. Il suffit de changerBIN
etOBJS
de convenir. En bonus, j'ai ajoutémake clean
pour supprimer les fichiers compilés et vous laisser la source.la source
install
ou un fichier appeléclean
(scripts shell, peut-être?), Vousmake
pouvez penser qu'ils le sontUp to date
et ne rien faire.clean.sh
etinstall.sh
si vous devez les avoir.La réponse acceptée est excellente car elle m'a donné une leçon précieuse sur toutes sortes d'outils de débogage (avr-objdump -D est devenu un ami proche). À savoir, la ligne:
${OBJCOPY} -O ihex -R .eeprom $< $@
manque le drapeau d'architecture et devrait lire
$ {OBJCOPY} -mmcu = atmega328p -O ihex -R .eeprom $ <$ @
Sans l'indicateur d'architecture -mmcu, avr-gcc suppose que nous compilons pour l'architecture 8515 (certainement pas) et il produit le fichier .elf sans instructions initiales pour l'initialisation, c'est-à-dire sans instructions pour appeler la fonction "principale", etc.
Il en résulte un comportement déroutant car tout programme simple (par exemple clignotant) avec uniquement la fonction "principale" fonctionne parfaitement, mais si vous définissez une autre fonction avant ou après le "principal", il exécute cette fonction et n'appelle jamais "principal" ou il redémarre tout le temps, etc.
Je ne suis pas non plus un fan particulier d'éviter la vérification du type de MCU correct et du programme téléchargé, donc je recommanderais de ne pas utiliser -F et -V et d'utiliser -v à la place.
Ainsi, la réponse améliorée pourrait être:
la source