Wie schreibe ich Makefile-kompatible Skizzen?


9

Ich möchte meine Skizzen schreiben, damit ich sie entweder mit der Arduino-IDE oder optional mit GCC und einem Makefile erstellen / hochladen kann.

Ich weiß, wie man die Funktionsdeklarationen oben einfügt, aber gibt es noch etwas zu tun, damit meine Skizze von meinem Compiler als gültiges C ++ betrachtet wird?

Update 1

Zu verstehen, was die Arduino-IDE mit .ino- und .pde-Dateien macht, ist in Ordnung, aber für meine Frage irrelevant. Es handelt sich also nicht um ein Duplikat. Was ich wissen möchte, ist "wie schreibe ich ein Programm so, dass es sowohl von der Arduino IDE als auch von g ++ als gültig angesehen wird .

Das hier verfügbare offizielle (?) Makefile erklärt, was zu tun ist, wenn das Makefile anstelle der IDE verwendet wird:

# 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);

... aber das erklärt nicht, wie man sowohl die IDE als auch ein Makefile verwendet.

Update 2

Ich habe kürzlich PlatformIO gefunden, das diese Frage nicht direkt beantwortet, aber einen Großteil des Prozesses automatisiert (Scons-Dateien für Sie generiert). Bisher bevorzuge ich den Workflow sowohl gegenüber der Arduino IDE als auch gegenüber dem Source + Makefile-Ansatz. Gute Unterstützung auch von den Autoren.


Daher geht die Frage weit über mein Wissen hinaus, aber einige Dinge, die Sie berücksichtigen müssten, sind das Einschließen der Datei Arduino.h. Einbau des Bootloaders; und was auch immer. Ich werde dieser Frage
folgen

Ich würde vorschlagen, dass Sie sich Arduino-CMake ansehen ( github.com/queezythegreat/arduino-cmake ).
jfpoilpret


1
Sie können kein "Programm" schreiben, das sowohl von der IDE als auch von G ++ direkt als gültig angesehen wird, es sei denn, Sie sind bereit, eine Reihe von Opfern zu bringen. Beschäftige dich mit Ino.
Ignacio Vazquez-Abrams

1
Ich habe meine Antwort hier in den Kommentaren des angehängten Makefiles gefunden.
hoosierEE

Antworten:


1

Von gcc / g ++ Ich denke, Sie beziehen sich speziell auf avr-gcc / avr-g ++. Ihr Arduino-Code wird wahrscheinlich nicht als gültiger C / C ++ - Code angesehen, da gcc versucht, mit Ihrem PC als Zielsystem zu kompilieren. Viele der Makros in "WProgram.h" beziehen sich auf unzugänglichen Speicher auf Ihrem Zielsystem.

Vorausgesetzt, Sie fügen die Header-Datei "WProgram.h" hinzu und erstellen Ihren Code mit dem obigen Arduino-Makefile (das avr-g ++ und nicht g ++ verwendet), sollten Ihre cpp-Dateien korrekt kompiliert und verknüpft werden. Ebenso können Sie Ihren Arduino-Code in der IDE öffnen und dort Ihren Code überprüfen. Die IDE fügt die Datei "WProgram.h" für Sie ein, sodass sie technisch gesehen zweimal enthalten wäre. Die Include-Schutzvorrichtungen verhindern jedoch, dass doppelter Code kompiliert wird.


1

Im Allgemeinen müssen Sie die setup()und loop()-Funktionen angeben, sie sind nur Wrapper der IDE:

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

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

  return 0; // never reached
}

Dies funktioniert sowohl in der IDE als auch in der Befehlszeile. Wenn Sie Board und SerialPort in der IDE angeben, müssen Sie auch beide im Makefile angeben. Sie erhalten also zwei Konfigurationen.

Viele Benutzer verlassen die IDE, weil sie andere Editoren bevorzugen oder mehr Konfigurationsoptionen haben, indem sie die Compiler- und Linker-Schalter einstellen.

Um es wirklich einfach zu machen, können Sie Arduino Makefile verwenden . Heute spielte mit 347.

Hier ein Beispiel für ein 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
#

Die '* .ino'-Dateien müssen nicht geändert werden und die MakefileDatei muss im selben Verzeichnis abgelegt werden.

Mittlerweile bevorzuge ich den MakefileWeg, benutze aber trotzdem die IDE für kleine Projekte.


1

Was ich wissen möchte, ist "wie schreibe ich ein Programm so, dass es sowohl von der Arduino IDE als auch von g ++ als gültig angesehen wird.

Siehe: So vermeiden Sie die Macken der Vorverarbeitung der IDE-Skizzendatei .

Wenn Sie für den Moment nicht berücksichtigen, wie das Makefile aussehen wird, besteht die einfache Antwort auf Ihre Frage, wie im obigen Link erläutert, darin, alles in die Registerkarten .cpp und .h in der IDE einzufügen und die Hauptskizze (.ino) zu belassen Datei) leer. Das wird weiterhin unter der IDE kompiliert und ist daher auch normales C ++.

Stellen Sie sicher, dass Sie Ihre CPP-Dateien starten mit:

#include <Arduino.h>

Wenn Sie Bibliotheken (z. B. SPI) verwenden, müssen Sie diese in die Hauptskizzendatei aufnehmen, wodurch die IDE veranlasst wird, sie in die temporäre Projekterstellungsdatei zu kopieren. Das Makefile kümmert sich nicht darum, da Sie sicherstellen, dass Ihr Makefile alle erforderlichen Bibliotheksdateien enthält.

Siehe auch meine Antwort hier: Klassen und Objekte: Wie viele und welche Dateitypen brauche ich tatsächlich, um sie zu verwenden?

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.