Como escrever esboços compatíveis com makefile?

9

Gostaria de escrever meus esboços para que eu possa compilá-los / enviá-los usando o Arduino IDE ou, opcionalmente, usando o GCC e um makefile.

Eu sei sobre a inclusão das declarações de função na parte superior, mas há mais alguma coisa a fazer para que meu esboço seja considerado C ++ válido pelo meu compilador?

Atualização 1

Entender o que o IDE do Arduino faz nos arquivos .ino e .pde é bom, mas estranho à minha pergunta, portanto, isso não é uma duplicata. O que eu quero saber é "como escrevo um programa para que ele seja considerado válido pelo IDE do Arduino e pelo g ++.

O makefile oficial (?) Disponível aqui explica o que fazer se estiver usando o makefile em vez do IDE:

# The Arduino environment does preliminary processing on a sketch before
# compiling it.  If you're using this makefile instead, you'll need to do
# a few things differently:
#
#   - Give your program's file a .cpp extension (e.g. foo.cpp).
#
#   - Put this line at top of your code: #include <WProgram.h>
#
#   - Write prototypes for all your functions (or define them before you
#     call them).  A prototype declares the types of parameters a
#     function will take and what type of value it will return.  This
#     means that you can have a call to a function before the definition
#     of the function.  A function prototype looks like the first line of
#     the function, with a semi-colon at the end.  For example:
#     int digitalRead(int pin);

... mas isso não explica como o uso tanto o IDE e um makefile.

Atualização 2

Recentemente, encontrei o PlatformIO que não responde diretamente a essa pergunta, mas automatiza grande parte do processo (gera arquivos Scons para você) e, até agora, prefiro o fluxo de trabalho sobre o Arduino IDE e a abordagem source + makefile. Bom apoio dos autores também.

hoosierEE
fonte
Portanto, a questão está muito além do meu conhecimento, mas algumas coisas que você deve considerar é a inclusão do arquivo Arduino.h. Incorporando o gerenciador de inicialização; e o que mais. Eu estarei seguindo esta pergunta :)
Madivad 2/14/14
Eu sugiro que você dê uma olhada no Arduino-CMake ( github.com/queezythegreat/arduino-cmake ).
Jfpoilpret
inotool.org
jippie
11
Você não pode escrever um "programa" considerado válido pelo IDE e pelo G ++ diretamente, a menos que esteja disposto a fazer vários sacrifícios. Lidar com Ino.
Ignacio Vazquez-Abrams
11
Encontrei minha resposta aqui , nos comentários do makefile em anexo.
hoosierEE

Respostas:

1

Por gcc / g ++, acho que você está se referindo especificamente ao avr-gcc / avr-g ++. Seu código do arduino provavelmente não será considerado código C / C ++ válido porque o gcc tentará compilar com o seu PC como o sistema de destino. Muitas das macros em "WProgram.h" se referem à memória inacessível no seu sistema de destino.

Desde que você inclua o arquivo de cabeçalho "WProgram.h" e construa seu código com o Arduino Makefile acima (que usa avr-g ++ e não g ++), seus arquivos cpp devem ser compilados e vinculados corretamente. Da mesma forma, você poderá abrir seu código do Arduino no IDE e verificar seu código lá. O IDE coloca o arquivo "WProgram.h" para você, portanto, tecnicamente, ele seria incluído duas vezes. No entanto, os protetores de inclusão impedirão que qualquer código duplicado seja compilado.

Sean
fonte
1

Geralmente você precisará declarar as funções setup()e loop(), elas são apenas invólucros do IDE:

void setup() {}
void loop() {}

int main() {
  setup();
  while (1)
    loop();

  return 0; // never reached
}

Isso funciona tanto no IDE quanto na linha de comando. Conforme você especifica a placa e o SerialPort no IDE, também precisará especificar ambos no Makefile. Então você terminará com duas configurações.

Muitas pessoas saem do IDE porque preferem usar editores diferentes ou têm mais opções de configuração definindo as opções do compilador e do vinculador.

Para facilitar, você pode usar o Arduino Makefile . Hoje estrelou com 347.

Aqui está um exemplo Makefile:

# try: make help
#
include /usr/share/arduino/Arduino.mk
ARDUINO_DIR = /usr/share/arduino
# list boards with: make show_boards
BOARD_TAG = promicro16
ARDUINO_LIBS = EEPROM 
# MONITOR_CMD = picocom -b 9600
MONITOR_CMD = moni -config ACM0-9600.cfg
ARDUINO_PORT = /dev/serial/by-id/usb-Arduino_LLC_Arduino_Leonardo-if00
# ARDUINO_PORT = /dev/ttyACM0
# ARDUINO_PORT = /dev/ttyUSB0
OPTIMIZATION_FLAGS = -Os -fexpensive-optimizations -fstrength-reduce
#

Os arquivos '* .ino' não precisam ser alterados e o Makefilearquivo deve ser colocado no mesmo diretório.

Enquanto isso, prefiro o Makefilecaminho, mas ainda uso o IDE para pequenos projetos.


fonte
1

O que eu quero saber é "como escrevo um programa para que ele seja considerado válido pelo IDE do Arduino e pelo g ++.

Consulte: Como evitar as peculiaridades do pré-processamento do arquivo de esboço IDE .

Desconsiderando por enquanto a aparência do Makefile, a resposta simples para sua pergunta, conforme discutido no link acima, é colocar tudo nas guias .cpp e .h no IDE e deixar o principal "esboço" (.ino arquivo) em branco. Isso ainda será compilado no IDE e, portanto, também será C ++ normal.

Certifique-se de iniciar seus arquivos .cpp com:

#include <Arduino.h>

Se você usa bibliotecas (por exemplo, SPI), deve incluí-las no arquivo de esboço principal, o que aciona o IDE para copiá-las no arquivo de construção temporário do projeto. O Makefile não se importará com isso, pois você garantirá que o Makefile inclua todos os arquivos de biblioteca necessários.

Veja também minha resposta aqui: Classes e objetos: quantos e quais tipos de arquivo eu realmente preciso para usá-los?

Nick Gammon
fonte