Eu gostaria de fazer um makefile para compilar programas c para o arduino. Estou familiarizado com o make, mas nunca o usei com o avr-gcc. Qual é a maneira mais simples de colocar os comandos abaixo em um 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
e vincularlibcore.a
. :-)Respostas:
Não é diferente trabalhar com o Make e qualquer outra forma de GCC. Basta definir sua variável CC e CFLAGS de acordo e trabalhar como normalmente.
Por exemplo, eu acabei de ler este:
Isso significa que qualquer compilação C automática será feita com avr-gcc e os sinalizadores especificados em CFLAGS. Por padrão, ele cria o arquivo hexadecimal usando OBJCOPY, que é definido como avr, que depende do arquivo led.elf - para obter esse arquivo, ele executa o destino led.elf, que vincula o arquivo de objeto led.o a as bibliotecas padrão usando o que foi definido no CC. Para fazer isso, é necessário led.o, e isso é feito automaticamente usando o programa especificado em CC e os sinalizadores em CFLAGS. Em seguida, você pode, opcionalmente
make install
, executaravrdude
a instalação do arquivo hexadecimal no chip.Você pode torná-lo ainda mais genérico para copiá-lo em outros projetos e fazer as alterações mínimas necessárias:
Que usa "variáveis automáticas" e substituição simples de nome.
BIN
contém a "base" dos seus arquivos binários,OBJS
contém a lista de arquivos de objetos. $ @ é o nome do destino atual, $ <é o nome do primeiro pré-requisito e $ ^ é a lista de todos os pré-requisitos. Basta mudarBIN
eOBJS
se adequar. Como bônus, jogueimake clean
para remover os arquivos compilados e deixar você com a fonte.fonte
install
ou um arquivoclean
(shell scripts, talvez?),make
Poderá pensar que eles sãoUp to date
e não fazem nada.clean.sh
einstall.sh
se você precisar deles.A resposta aceita é ótima, pois me deu uma lição valiosa em todos os tipos de ferramentas de depuração (avr-objdump -D tornou-se um amigo próximo). Ou seja, a linha:
${OBJCOPY} -O ihex -R .eeprom $< $@
está faltando o sinalizador de arquitetura e deve ler
$ {OBJCOPY} -mmcu = atmega328p -O ihex -R .eeprom $ <$ @
Sem o sinalizador de arquitetura -mmcu, o avr-gcc acha que estamos compilando a arquitetura 8515 (definitivamente não) e produz o arquivo .elf sem instruções iniciais para a inicialização, ou seja, sem instruções para chamar a função "principal" etc.
Isso resulta em comportamento confuso, pois qualquer programa simples (por exemplo, piscar) com apenas a função "principal" funciona perfeitamente, mas se você definir outra função antes ou depois da "principal", ela executa essa função e nunca chama "principal" ou reinicia o tempo todo etc.
Também não sou um fã em particular de evitar a verificação do tipo MCU correto e do programa carregado, portanto, eu recomendaria não usar -F e -V e usar -v.
Portanto, a resposta melhorada pode ser:
fonte