Me gustaría hacer un makefile para compilar programas c para el arduino. Estoy familiarizado con make pero nunca lo he usado con avr-gcc. ¿Cuál es la forma más sencilla en que podría poner los comandos a continuación en un archivo MAKE?
$ 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
y enlazarlibcore.a
. :-)Respuestas:
No es diferente a trabajar con Make y cualquier otra forma de GCC. Simplemente configure su variable CC y la variable CFLAGS en consecuencia y trabaje como lo hace normalmente.
Por ejemplo, acabo de derribar este:
Eso significa que cualquier compilación automática de C se realizará con avr-gcc y los indicadores especificados en CFLAGS. Por defecto, creará el archivo hexadecimal utilizando OBJCOPY, que se establece en avr, que se basa en el archivo led.elf, por lo que para obtener ese archivo se ejecuta el objetivo led.elf, que vincula el archivo objeto led.o con las bibliotecas predeterminadas que usan lo que se configuró en CC. Para hacerlo necesita led.o, y lo hace automáticamente usando el programa especificado en CC y las banderas en CFLAGS. Entonces, opcionalmente,
make install
puede ejecutaravrdude
el archivo hexadecimal en el chip.Puede hacerlo aún más genérico para poder copiarlo en otros proyectos y realizar los cambios mínimos necesarios:
Que utiliza "variables automáticas" y un simple reemplazo de nombre.
BIN
contiene la "base" de sus archivos binarios,OBJS
contiene la lista de archivos de objetos. $ @ es el nombre del objetivo actual, $ <es el nombre del primer requisito previo y $ ^ es la lista de todos los requisitos previos. Solo cámbieloBIN
yOBJS
para adaptarse Como beneficio adicional, lo he agregadomake clean
para eliminar los archivos compilados y simplemente dejarlo con la fuente.fuente
install
o un archivo llamadoclean
(¿scripts de shell, tal vez?), Entoncesmake
puede pensar que sonUp to date
y no hacen nada.clean.sh
yinstall.sh
si debe tenerlos.La respuesta aceptada es excelente ya que me ha dado una valiosa lección en todo tipo de herramientas de depuración (avr-objdump -D se ha convertido en un amigo cercano). A saber, la línea:
${OBJCOPY} -O ihex -R .eeprom $< $@
le falta la bandera de arquitectura y debería leer
$ {OBJCOPY} -mmcu = atmega328p -O ihex -R .eeprom $ <$ @
Sin el indicador de arquitectura -mmcu, avr-gcc supone que estamos compilando para la arquitectura 8515 (definitivamente no) y produce el archivo .elf sin instrucciones iniciales para la inicialización, es decir, sin instrucciones para llamar a la función "principal", etc.
Esto da como resultado un comportamiento confuso ya que cualquier programa simple (por ejemplo, parpadeo) con solo la función "principal" funciona perfectamente, pero si define otra función antes o después de "principal", ejecuta esa función y nunca llama a "principal" o se reinicia todo el tiempo etc.
Tampoco soy un fanático particular de evitar la verificación del tipo correcto de MCU y el programa cargado, por lo que recomendaría no usar -F y -V y usar -v en su lugar.
Entonces, la respuesta mejorada podría ser:
fuente