Jak pisać szkice zgodne z makefile?

9

Chciałbym pisać swoje szkice, aby móc je budować / przesyłać za pomocą Arduino IDE lub opcjonalnie za pomocą GCC i makefile.

Wiem o dołączaniu deklaracji funkcji na górze, ale czy jest coś jeszcze, aby mój szkic mógł zostać uznany za prawidłowy C ++ przez mój kompilator?

Aktualizacja 1

Zrozumienie, co Arduino IDE robi z plikami .ino i .pde, jest w porządku, ale nie ma związku z moim pytaniem, więc nie jest to duplikat. Chcę wiedzieć, jak napisać program, który jest uważany za poprawny zarówno przez Arduino IDE, jak i g ++.

Oficjalny (?) Plik makefile dostępny tutaj wyjaśnia, co zrobić, jeśli używasz pliku makefile zamiast 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);

... ale to nie wyjaśnia, jak używać zarówno IDE, jak i makefile.

Aktualizacja 2

Niedawno znalazłem PlatformIO, które nie odpowiada bezpośrednio na to pytanie, ale automatyzuje dużą część procesu (generuje dla Ciebie pliki Scons) i do tej pory wolę przepływ pracy niż zarówno Arduino IDE, jak i źródło + makefile. Dobre wsparcie ze strony autorów.

hoosierEE
źródło
Tak więc pytanie jest daleko poza moją wiedzą, ale niektóre rzeczy, które należy wziąć pod uwagę, to dołączenie pliku Arduino.h. Zawarcie bootloadera; i cokolwiek innego. Będę
śledzić
Proponuję rzucić okiem na Arduino-CMake ( github.com/queezythegreat/arduino-cmake ).
jfpoilpret
inotool.org
jippie
1
Nie możesz napisać „programu”, który jest uważany za prawidłowy zarówno przez IDE, jak i G ++, chyba że zechcesz dokonać wielu poświęceń. Zajmij się Ino.
Ignacio Vazquez-Abrams
1
Znalazłem moją odpowiedź tutaj , w komentarzach dołączonego makefile.
hoosierEE

Odpowiedzi:

1

Według gcc / g ++ Myślę, że odnosi się to w szczególności do avr-gcc / avr-g ++. Twój kod arduino prawdopodobnie nie będzie uważany za prawidłowy kod C / C ++, ponieważ gcc spróbuje skompilować się z twoim komputerem jako systemem docelowym. Wiele makr w „WProgram.h” będzie odnosić się do niedostępnej pamięci w systemie docelowym.

Pod warunkiem, że dołączasz plik nagłówka „WProgram.h” i budujesz swój kod przy użyciu powyższego pliku Arduino Makefile (który używa avr-g ++ nie g ++), twoje pliki cpp powinny się poprawnie skompilować i połączyć. Podobnie, będziesz mógł otworzyć swój kod Arduino w IDE i tam zweryfikować swój kod. IDE umieszcza w tobie plik „WProgram.h”, więc technicznie byłby zawarty dwukrotnie. Jednak osłony dołączania zapobiegną kompilacji duplikatów kodu.

Sean
źródło
1

Zasadniczo musisz podać funkcje setup()i loop(), są one tylko opakowaniami IDE:

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

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

  return 0; // never reached
}

Działa to zarówno w IDE, jak i w wierszu poleceń. Gdy określisz Board i SerialPort w IDE, musisz także podać oba w Makefile. Skończysz z dwiema konfiguracjami.

Wiele osób opuszcza IDE, ponieważ wolą korzystać z różnych edytorów lub mają więcej opcji konfiguracyjnych, ustawiając przełączniki kompilatora i konsolidatora.

Aby było to naprawdę łatwe, możesz użyć Arduino Makefile . Dzisiaj wystąpił z 347 gwiazdkami.

Oto przykład 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
#

Pliki „* .ino” nie muszą być zmieniane, a Makefileplik należy umieścić w tym samym katalogu.

Tymczasem wolę Makefilesposób, ale nadal używam IDE do małych projektów.


źródło
1

Chcę wiedzieć, jak napisać program, który jest uważany za poprawny zarówno przez Arduino IDE, jak i g ++.

Zobacz: Jak uniknąć dziwactwa wstępnego przetwarzania pliku szkicu IDE .

Bez względu na chwilę, jak będzie wyglądał plik Makefile, prostą odpowiedzią na twoje pytanie, jak omówiono w powyższym linku, jest umieszczenie wszystkiego w kartach .cpp i .h w IDE i pozostawienie głównego „szkicu” (.ino plik) puste. To nadal będzie się kompilować pod IDE, a zatem będzie to również normalny C ++.

Upewnij się, że zaczynasz swoje pliki .cpp za pomocą:

#include <Arduino.h>

Jeśli korzystasz z bibliotek (np. SPI), musisz uwzględnić je w głównym pliku szkicu, co spowoduje, że IDE skopiuje je do tymczasowego pliku kompilacji projektu. Makefile nie będzie się tym przejmował, ponieważ upewnisz się, że Twój Makefile zawiera wszystkie niezbędne pliki bibliotek.

Zobacz także moją odpowiedź tutaj: Klasy i obiekty: ile i jakich typów plików faktycznie muszę ich używać?

Nick Gammon
źródło