¿Cómo escribir bocetos compatibles con makefile?

9

Me gustaría escribir mis bocetos para poder compilarlos / cargarlos usando el IDE de Arduino, u opcionalmente usando GCC y un archivo MAKE.

Sé incluir las declaraciones de funciones en la parte superior, pero ¿hay algo más que hacer para que mi compilador considere válido C ++ por mi compilador?

Actualización 1

Comprender lo que el IDE de Arduino hace a los archivos .ino y .pde está bien, pero es extraño a mi pregunta, por lo que esto no es un duplicado. Lo que quiero saber es "cómo escribo un programa de modo que sea considerado válido tanto por Arduino IDE como por g ++.

El archivo MAKE oficial (?) Disponible aquí explica qué hacer si se utiliza el archivo MAKE en lugar del 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);

... pero esto no explica cómo usar tanto el IDE como un archivo MAKE.

Actualización 2

Recientemente encontré PlatformIO que no responde a esta pregunta directamente, pero automatiza gran parte del proceso (genera archivos Scons para usted) y hasta ahora prefiero el flujo de trabajo sobre el IDE Arduino y el enfoque fuente + archivo MAKE. Buen apoyo de los autores también.

hoosierEE
fuente
Por lo tanto, la pregunta está más allá de mi conocimiento, pero algunas cosas que debería considerar es la inclusión del archivo Arduino.h. Incorporando el gestor de arranque; y cualquier otra cosa
Seguiré
Te sugiero que eches un vistazo a Arduino-CMake ( github.com/queezythegreat/arduino-cmake ).
jfpoilpret
inotool.org
jippie
1
No puede escribir un "programa" que el IDE y G ++ consideren válido directamente a menos que esté dispuesto a hacer una serie de sacrificios. Tratar con Ino.
Ignacio Vazquez-Abrams
1
Encontré mi respuesta aquí , en los comentarios del archivo adjunto.
hoosierEE

Respuestas:

1

Por gcc / g ++ creo que te refieres específicamente a avr-gcc / avr-g ++. Su código arduino probablemente no se considerará un código C / C ++ válido porque gcc intentará compilarse con su PC como sistema de destino. Muchas de las macros en "WProgram.h" se referirán a la memoria inaccesible en su sistema de destino.

Siempre que incluya el archivo de encabezado "WProgram.h" y cree su código con el Arduino Makefile anterior (que usa avr-g ++ no g ++), sus archivos cpp deberían compilarse y vincularse correctamente. Del mismo modo, podrá abrir su código Arduino dentro del IDE y verificar su código allí. El IDE pone el archivo "WProgram.h" por usted, por lo que técnicamente se incluiría dos veces. Sin embargo, los guardias de inclusión evitarán que se compile cualquier código duplicado.

Sean
fuente
1

En general, deberá indicar las funciones setup()y loop(), son solo envoltorios del IDE:

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

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

  return 0; // never reached
}

Esto funciona tanto en el IDE como en la línea de comando. A medida que especifique Board y SerialPort en el IDE, también deberá especificar ambos en el Makefile. Entonces terminarás con dos configuraciones.

Muchas personas abandonan el IDE porque prefieren usar editores diferentes o tienen más opciones de configuración configurando el compilador y los conmutadores de enlace.

Para hacerlo realmente fácil, puede usar Arduino Makefile . Hoy protagonizó con 347.

Aquí un ejemplo de 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
#

Los archivos '* .ino' no necesitan cambiarse y el Makefilearchivo debe colocarse en el mismo directorio.

Mientras tanto, prefiero el Makefilecamino, pero todavía uso el IDE para pequeños proyectos.


fuente
1

Lo que quiero saber es "cómo escribo un programa de modo que sea considerado válido tanto por Arduino IDE como por g ++.

Consulte: Cómo evitar las peculiaridades del preprocesamiento del archivo de boceto IDE .

Sin tener en cuenta por el momento cómo se verá el Makefile, la respuesta simple a su pregunta, como se discutió en el enlace anterior, es poner todo en las pestañas .cpp y .h en el IDE, y dejar el "boceto" principal (.ino archivo) en blanco. Eso aún se compilará bajo el IDE y, por lo tanto, también será C ++ normal.

Asegúrese de iniciar sus archivos .cpp con:

#include <Arduino.h>

Si usa bibliotecas (por ejemplo, SPI), debe incluirlas en el archivo de boceto principal, lo que activa el IDE para copiarlas en el archivo de compilación del proyecto temporal. El Makefile no se preocupará por eso, ya que se asegurará de que su Makefile incluya todos los archivos de biblioteca necesarios.

También vea mi respuesta aquí: Clases y objetos: ¿cuántos y qué tipos de archivos necesito realmente para usarlos?

Nick Gammon
fuente