Comment écrire des croquis compatibles avec makefile?


9

Je voudrais écrire mes croquis afin de pouvoir les créer / télécharger en utilisant l'IDE Arduino, ou éventuellement en utilisant GCC et un makefile.

Je sais comment inclure les déclarations de fonction en haut, mais y a-t-il autre chose à faire pour que mon croquis soit considéré comme C ++ valide par mon compilateur?

Mise à jour 1

Comprendre ce que l'IDE Arduino fait aux fichiers .ino et .pde est bien, mais étranger à ma question, donc ce n'est pas un doublon. Ce que je veux savoir, c'est "comment écrire un programme tel qu'il soit considéré comme valide à la fois par l'IDE Arduino et par g ++.

Le makefile officiel (?) Disponible ici explique ce qu'il faut faire si vous utilisez le makefile au lieu de 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);

... mais cela n'explique pas comment utiliser à la fois l'IDE et un makefile.

Mise à jour 2

J'ai récemment trouvé PlatformIO qui ne répond pas directement à cette question, mais automatise une grande partie du processus (génère des fichiers Scons pour vous) et jusqu'à présent, je préfère le flux de travail à la fois à l'IDE Arduino et à l'approche source + makefile. Bon soutien des auteurs également.


La question est donc bien au-delà de mes connaissances, mais certaines choses que vous devriez considérer sont l'inclusion du fichier Arduino.h. Intégration du chargeur de démarrage; et quoi que ce soit d'autre. Je suivrai cette question :)
Madivad

Je vous suggère de jeter un œil à Arduino-CMake ( github.com/queezythegreat/arduino-cmake ).
jfpoilpret


1
Vous ne pouvez pas écrire directement un "programme" considéré comme valide par l'IDE et le G ++ à moins que vous ne souhaitiez faire un certain nombre de sacrifices. Faites affaire avec Ino.
Ignacio Vazquez-Abrams

1
J'ai trouvé ma réponse ici , dans les commentaires du makefile ci-joint.
hoosierEE

Réponses:


1

Par gcc / g ++, je pense que vous faites référence spécifiquement à avr-gcc / avr-g ++. Votre code arduino ne sera probablement pas considéré comme du code C / C ++ valide car gcc essaiera de compiler avec votre PC comme système cible. La plupart des macros de "WProgram.h" font référence à une mémoire inaccessible sur votre système cible.

Si vous incluez le fichier d'en-tête "WProgram.h" et que vous créez votre code avec le Makefile Arduino ci-dessus (qui utilise avr-g ++ et non g ++), vos fichiers cpp doivent se compiler et se lier correctement. De même, vous pourrez ouvrir votre code Arduino dans l'IDE et y vérifier votre code. L'IDE place le fichier "WProgram.h" pour vous, donc techniquement il serait inclus deux fois. Cependant, les gardes d'inclusion empêcheront la compilation de tout code en double.


1

En général, vous devrez indiquer les fonctions setup()et loop(), ce ne sont que des wrappers de l'IDE:

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

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

  return 0; // never reached
}

Cela fonctionne à la fois dans l'EDI et sur la ligne de commande. Lorsque vous spécifiez la carte et le port série dans l'EDI, vous devrez également spécifier les deux dans le Makefile. Vous vous retrouverez donc avec deux configurations.

Beaucoup de gens quittent l'IDE car ils préfèrent utiliser différents éditeurs ou ont plus d'options de configuration en définissant les commutateurs du compilateur et de l'éditeur de liens.

Pour le rendre vraiment facile, vous pouvez utiliser Arduino Makefile . Aujourd'hui, avec 347.

Voici un exemple 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
#

Les fichiers '* .ino' n'ont pas besoin d'être modifiés et le Makefilefichier doit être placé dans le même répertoire.

En attendant, je préfère la Makefilevoie, mais j'utilise toujours l'IDE pour les petits projets.


1

Ce que je veux savoir, c'est "comment écrire un programme tel qu'il soit considéré comme valide à la fois par l'IDE Arduino et par g ++.

Voir: Comment éviter les caprices du prétraitement du fichier d'esquisse IDE .

Indépendamment de ce à quoi ressemblera le Makefile, la réponse simple à votre question, comme discuté dans le lien ci-dessus, est de tout mettre dans les onglets .cpp et .h dans l'IDE, et de laisser l'esquisse principale (.ino fichier) vide. Ce sera toujours compiler sous l'IDE, et sera donc aussi normal C ++.

Assurez-vous de démarrer vos fichiers .cpp avec:

#include <Arduino.h>

Si vous utilisez des bibliothèques (par exemple, SPI), vous devez les inclure dans le fichier d'esquisse principal, ce qui déclenche l'IDE pour les copier dans le fichier de construction de projet temporaire. Le Makefile ne s'en souciera pas, car vous vous assurerez que votre Makefile comprend tous les fichiers de bibliothèque nécessaires.

Voir également ma réponse ici: Classes et objets: combien et de quels types de fichiers ai-je réellement besoin pour les utiliser?

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.