Come scrivere schizzi compatibili con makefile?


9

Vorrei scrivere i miei schizzi in modo da poterli compilare / caricarli utilizzando l'IDE di Arduino o, facoltativamente, usando GCC e un makefile.

So di includere le dichiarazioni delle funzioni in alto, ma c'è qualcos'altro da fare affinché il mio compilatore sia considerato C ++ valido dal mio compilatore?

Aggiornamento 1

Capire cosa fa l'IDE di Arduino ai file .ino e .pde va bene, ma è estraneo alla mia domanda, quindi questo non è un duplicato. Quello che voglio sapere è "come scrivo un programma in modo tale che sia considerato valido sia dall'IDE di Arduino che da g ++.

Il makefile ufficiale (?) Disponibile qui spiega cosa fare se si utilizza il makefile anziché l'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);

... ma questo non spiega come usare sia l'IDE sia un makefile.

Aggiornamento 2

Di recente ho trovato PlatformIO che non risponde direttamente a questa domanda, ma automatizza gran parte del processo (genera file Scons per te) e finora preferisco il flusso di lavoro sia sull'IDE di Arduino sia sull'approccio source + makefile. Buon supporto anche dagli autori.


Quindi la domanda va ben oltre la mia conoscenza, ma alcune cose che dovresti considerare sono l'inclusione del file Arduino.h. Incorporando il bootloader; e quant'altro.
Seguirò

Ti suggerirei di dare un'occhiata a Arduino-CMake ( github.com/queezythegreat/arduino-cmake ).
jfpoilpret,


1
Non puoi scrivere un "programma" che sia considerato valido sia dall'IDE sia dal G ++ direttamente a meno che tu non sia disposto a fare una serie di sacrifici. Tratta con Ino.
Ignacio Vazquez-Abrams,

1
Ho trovato la mia risposta qui , nei commenti del makefile allegato.
hoosierEE,

Risposte:


1

Di gcc / g ++ penso che ti riferisca specificamente ad avr-gcc / avr-g ++. Il tuo codice arduino probabilmente non sarà considerato un codice C / C ++ valido perché gcc tenterà di compilare con il tuo PC come sistema di destinazione. Molte delle macro in "WProgram.h" faranno riferimento a memoria inaccessibile sul sistema di destinazione.

Se si include il file di intestazione "WProgram.h" e si crea il codice con il Makefile Arduino sopra (che utilizza avr-g ++ non g ++), i file cpp devono essere compilati e collegati correttamente. Allo stesso modo, sarai in grado di aprire il tuo codice Arduino all'interno dell'IDE e verificare il tuo codice lì. L'IDE inserisce il file "WProgram.h" per te, quindi tecnicamente verrebbe incluso due volte. Tuttavia, le protezioni di inclusione impediranno la compilazione di qualsiasi codice duplicato.


1

Generalmente dovrai dichiarare le funzioni setup()e loop(), sono solo wrapper dell'IDE:

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

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

  return 0; // never reached
}

Funziona sia nell'IDE che nella riga di comando. Quando specifichi Board e SerialPort nell'IDE, dovrai anche specificare entrambi nel Makefile. Quindi finirai con due configurazioni.

Molte persone lasciano l'IDE perché preferiscono utilizzare editor diversi o hanno più opzioni di configurazione impostando gli switch del compilatore e del linker.

Per renderlo davvero semplice, puoi usare Arduino Makefile . Oggi ha recitato con 347.

Ecco un esempio 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
#

Non è necessario modificare i Makefilefile '* .ino' e il file deve essere inserito nella stessa directory.

Nel frattempo preferisco la Makefilestrada, ma uso ancora l'IDE per piccoli progetti.


1

Quello che voglio sapere è "come scrivo un programma in modo tale che sia considerato valido sia dall'IDE di Arduino che da g ++.

Vedere: Come evitare le stranezze della pre-elaborazione del file di schizzo IDE .

Trascurando per il momento come apparirà il Makefile, la semplice risposta alla tua domanda, come discusso nel link sopra, è mettere tutto nelle schede .cpp e .h nell'IDE, e lasciare il "sketch" principale (.ino file) vuoto. Ciò verrà comunque compilato sotto l'IDE e sarà quindi anche C ++ normale.

Assicurati di avviare i tuoi file .cpp con:

#include <Arduino.h>

Se si utilizzano librerie (ad es. SPI), è necessario includerle nel file di schizzo principale, che attiva l'IDE per copiarle nel file di build del progetto temporaneo. Il Makefile non se ne preoccuperà, poiché ti assicurerai che il tuo Makefile includa tutti i file di libreria necessari.

Vedi anche la mia risposta qui: Classi e oggetti: quanti e quali tipi di file sono effettivamente necessari per usarli?

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.