Proponuję Googling dla projektów Makefile. Zrobiłem to jakiś czas temu dla programu Blink, po prostu widząc, co zostało wygenerowane przez IDE i replikując to w bardziej ogólny sposób.
#
# Simple Arduino Makefile
#
# Author: Nick Gammon
# Date: 18th March 2015
# where you installed the Arduino app
ARDUINO_DIR = C:/Documents and Settings/Nick/Desktop/arduino-1.0.6/
# various programs
CC = "$(ARDUINO_DIR)hardware/tools/avr/bin/avr-gcc"
CPP = "$(ARDUINO_DIR)hardware/tools/avr/bin/avr-g++"
AR = "$(ARDUINO_DIR)hardware/tools/avr/bin/avr-ar"
OBJ_COPY = "$(ARDUINO_DIR)hardware/tools/avr/bin/avr-objcopy"
MAIN_SKETCH = Blink.cpp
# compile flags for g++ and gcc
# may need to change these
F_CPU = 16000000
MCU = atmega328p
# compile flags
GENERAL_FLAGS = -c -g -Os -Wall -ffunction-sections -fdata-sections -mmcu=$(MCU) -DF_CPU=$(F_CPU)L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=106
CPP_FLAGS = $(GENERAL_FLAGS) -fno-exceptions
CC_FLAGS = $(GENERAL_FLAGS)
# location of include files
INCLUDE_FILES = "-I$(ARDUINO_DIR)hardware/arduino/cores/arduino" "-I$(ARDUINO_DIR)hardware/arduino/variants/standard"
# library sources
LIBRARY_DIR = "$(ARDUINO_DIR)hardware/arduino/cores/arduino/"
build:
$(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(MAIN_SKETCH) -o $(MAIN_SKETCH).o
$(CC) $(CC_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)avr-libc/malloc.c -o malloc.c.o
$(CC) $(CC_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)avr-libc/realloc.c -o realloc.c.o
$(CC) $(CC_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)WInterrupts.c -o WInterrupts.c.o
$(CC) $(CC_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)wiring.c -o wiring.c.o
$(CC) $(CC_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)wiring_analog.c -o wiring_analog.c.o
$(CC) $(CC_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)wiring_digital.c -o wiring_digital.c.o
$(CC) $(CC_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)wiring_pulse.c -o wiring_pulse.c.o
$(CC) $(CC_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)wiring_shift.c -o wiring_shift.c.o
$(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)CDC.cpp -o CDC.cpp.o
$(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)HardwareSerial.cpp -o HardwareSerial.cpp.o
$(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)HID.cpp -o HID.cpp.o
$(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)IPAddress.cpp -o IPAddress.cpp.o
$(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)main.cpp -o main.cpp.o
$(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)new.cpp -o new.cpp.o
$(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)Print.cpp -o Print.cpp.o
$(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)Stream.cpp -o Stream.cpp.o
$(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)Tone.cpp -o Tone.cpp.o
$(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)USBCore.cpp -o USBCore.cpp.o
$(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)WMath.cpp -o WMath.cpp.o
$(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)WString.cpp -o WString.cpp.o
rm core.a
$(AR) rcs core.a malloc.c.o
$(AR) rcs core.a realloc.c.o
$(AR) rcs core.a WInterrupts.c.o
$(AR) rcs core.a wiring.c.o
$(AR) rcs core.a wiring_analog.c.o
$(AR) rcs core.a wiring_digital.c.o
$(AR) rcs core.a wiring_pulse.c.o
$(AR) rcs core.a wiring_shift.c.o
$(AR) rcs core.a CDC.cpp.o
$(AR) rcs core.a HardwareSerial.cpp.o
$(AR) rcs core.a HID.cpp.o
$(AR) rcs core.a IPAddress.cpp.o
$(AR) rcs core.a main.cpp.o
$(AR) rcs core.a new.cpp.o
$(AR) rcs core.a Print.cpp.o
$(AR) rcs core.a Stream.cpp.o
$(AR) rcs core.a Tone.cpp.o
$(AR) rcs core.a USBCore.cpp.o
$(AR) rcs core.a WMath.cpp.o
$(AR) rcs core.a WString.cpp.o
$(CC) -Os -Wl,--gc-sections -mmcu=$(MCU) -o $(MAIN_SKETCH).elf $(MAIN_SKETCH).o core.a -lm
$(OBJ_COPY) -O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load --no-change-warnings --change-section-lma .eeprom=0 $(MAIN_SKETCH).elf $(MAIN_SKETCH).eep
$(OBJ_COPY) -O ihex -R .eeprom $(MAIN_SKETCH).elf $(MAIN_SKETCH).hex
Trzeba by ARDUINO_DIR
przynajmniej zmienić , aby odzwierciedlić miejsce instalacji IDE. Jeśli używasz innych rzeczy, takich jak biblioteka Wire, musisz ją nieco rozwinąć, aby skompilować dodatkowe biblioteki. Ponownie możesz użyć tego, co generuje IDE, aby poprowadzić zmiany.
Linie z wiodącymi spacjami powyżej wymagają znaku tabulacji zamiast spacji, co jest normalne dla pliku Makefile.
Używam interfejsu wiersza polecenia do
arduino
polecenia .Uruchamiam tak:
Istnieje strona opisująca inne narzędzia wiersza polecenia, takie jak
inotool
. Ta strona ma również przykładMakefile
. Te alternatywy wydają się kuszące, ale najwyraźniej żadna z nich nie działa. Zakładam, że jest to spowodowane pewnymi niedawnymi zmianami w plikach dystrybucyjnych Arduino IDE, od których zależą.Działa
arduino
jak powyżej, jest trochę powolna, bo chyba ładuje Javę, ale przynajmniej działa. Istnieje równieżarduino-builder
polecenie dostarczane z dystrybucją Arduino IDE. W chwili pisania tego tekstu nie było wystarczająco dobrze udokumentowane, żebym mógł wymyślić, jak go używać. Na przykład nie ma przykładowych wierszy poleceń w README ani w żadnym samouczku, z którym się spotkałem, i nie mogłem wymyślić, jak go użyć, aby załadować kod na tablicę. Jednak przypuszczalnie jest w stanie zapewnić nam szybszą kompilację niżarduino
. W README wspomniano również o możliwości ponownego wykorzystania plików obiektowych z poprzedniej kompilacji, więc istnieje kilka podobnych funkcji.Aby wyświetlić wyjście szeregowe , używam czegoś takiego
Liczba 1000000 powinna pasować do liczby, którą przekazujesz
Serial.begin()
w kodzie planszy. Możesz także użyć,screen
jeśli masz program interaktywny, który jest odpowiednio interaktywny, lub możesz użyć dowolnego narzędzia do pisania bezpośrednio na urządzeniu. Nawiasem mówiąc, mój Due pojawia się jako/dev/ttyACM0
(zamiast/dev/ttyUSB0
Uno).źródło
*.ino
plik w katalogu, ponieważ niekoniecznie musi on przesyłać ten wymieniony w--upload
parametrze.Potrzebujesz pliku Makefile. W okolicy Arduino jest kilka projektów Makefile. Googling dla „Arduino Makefile” zwraca wiele wyników, w tym to, co wygląda dobrze na Github: https://github.com/sudar/Arduino-Makefile
Kompilacja z wiersza poleceń nie jest trywialna ze względu na sposób, w jaki Arduino IDE obsługuje biblioteki.
W przypadku monitora szeregowego polecam Minicom. Jest to w pełni funkcjonalny emulator terminala (vt102) w wierszu poleceń.
... na przykład.
źródło
Jeśli chcesz w pełni kompatybilne rozwiązanie dla Arduino projektu (tak, można udostępnić swój projekt z innymi osobami, które korzystają tylko zwykły Arduino IDE) trzeba sprawdzić AUpewnij narzędzia uproszczenie CLI Arduino, używam go z Geany ale inni używają go z vi, Atom itp.
Jest zainspirowany i martwe projekty Ino i Arturo; poświęć 5 minut na przetestowanie go i prześlij opinię.
Przykładowe zastosowanie:
Ma tam jakiś inteligentny klej, może zapamiętać płytkę i plik, a nawet automatycznie wykryć USB płyty; więc po udanym poleceniu „amake -v” możesz to zrobić w wierszu poleceń i zadziała.
Jeśli użyjesz niektórych makr IDE, możesz łatwo tworzyć polecenia kompilacji i przesyłania, na przykład używając Geany IDE:
Więcej pomocy można uzyskać po zainstalowaniu „amake” lub „amake -h”.
Może również obsługiwać KAŻDĄ płytkę / lib / programator, który zainstalowałeś / skonfigurowałeś w swoim Arduino IDE, tak, nowoczesna płyta, taka jak Adafuit Trinket M0 / Arduino M0 itp ...
Po prostu uruchom Arduino IDE, przejdź do menedżera forum, zainstaluj wsparcie i to wszystko, jutro postępuj zgodnie z prostymi instrukcjami i gotowe.
Twoja płyta nie jest obsługiwana? to nie problem, wykryj plik fqbn (przeczytaj plik README.md) i przekaż go jako nazwę płyty.
Szukam testerów, aby zwiększyć liczbę lub aliasy płyty i automatyczne wykrywanie prawidłowych podpisów USB.
Pamiętaj, że to prywatne narzędzie, teraz udostępniane publicznie, wiesz, tylko programista drapie się po swędzeniu ...
Twoje zdrowie.
źródło
Oficjalne narzędzie CLI
Zespół arduino pracuje nad klientem cli https://github.com/arduino/arduino-cli
Ogłoszenie : https://blog.arduino.cc/2018/08/24/announcing-the-arduino-command-line-interface-cli/
Dzięki temu możesz zrobić prawie wszystko, od pobierania płyt i bibliotek, po kompilowanie i przesyłanie skryptów. Brakuje części monitorującej (możesz użyć metody Metamorphic za pomocą
stty
cat
, To działa!)Polecenia są bardzo podobne do odpowiedzi Metamorphic, ponieważ to narzędzie rozgałęzia się od tego
Instrukcje w repozytorium Github i stronie podręcznika:
źródło