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/standardy 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 installpuede ejecutaravrdudeel 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.
BINcontiene la "base" de sus archivos binarios,OBJScontiene 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ámbieloBINyOBJSpara adaptarse Como beneficio adicional, lo he agregadomake cleanpara eliminar los archivos compilados y simplemente dejarlo con la fuente.fuente
installo un archivo llamadoclean(¿scripts de shell, tal vez?), Entoncesmakepuede pensar que sonUp to datey no hacen nada.clean.shyinstall.shsi 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