Dawno nie szukałem dobrej odpowiedzi na to pytanie.
Zazwyczaj każdy projekt Arduino, ale najprostszy obejmuje:
- Główny plik kodu źródłowego
MyProject.ino
- Biblioteki specyficzne dla projektu (
MyProjectLibrary1.h
,MyProjectLibrary1.cpp
...) - Biblioteki innych firm (ogólnie bezpłatne oprogramowanie typu open source, dodawane ręcznie do katalogu bibliotek Arduino)
- Schematy, diagramy PCB
- Dokumentacja
- ...
Wszystko to sprawia, że trudno jest zachować cały kod i dokument jednego projektu w ramach zarządzania kodem źródłowym (np. W Subversion, Git lub GitHub).
Zarządzanie kontrolą źródła projektu oznacza zarządzanie wersją wszystkich plików używanych przez projekt, w tym bibliotek zewnętrznych.
Teraz dla jednego projektu muszę zdefiniować strukturę katalogów, która:
- Obejmuje wszystkie pliki projektu, jak opisano powyżej
- Mogę całkowicie zaangażować się w narzędzie do zarządzania kodem źródłowym (w tym zależności osób trzecich)
- Mogę kasować w dowolnym miejscu na dysku twardym i stamtąd budować projekt (czy musi to być pojedyncza lokalizacja narzucona przez Arduino IDE)
- Mogę spakować do samodzielnego archiwum, które mogę wysłać znajomemu, aby zbudował go tak łatwo, jak to możliwe (bez dodatkowego ręcznego pobierania)
Szczególnie trudne w projektach Arduino jest zarządzanie zależnościami bibliotek zewnętrznych. Projekty mają programistów Java Maven repozytoriów za to i to bardzo pomaga w zarządzaniu wszystkie deps zewnętrznych. Ale nie mamy równoważnego systemu dla bibliotek Arduino.
Chciałbym wiedzieć, jak inni twórcy Arduino radzą sobie z tymi aspektami we własnych projektach.
Zauważ też, że jestem otwarty na zmianę mojego procesu rozwoju, w tym mojego IDE (obecnie używam Eclipse z wtyczką Arduino przez większość czasu, a następnie zapewniam, że moje projekty mogą również współpracować bezpośrednio z Arduino IDE).
źródło
Odpowiedzi:
Mój sposób organizowania projektu arduino jest dość prosty, wszystkie moje projekty to repozytoria git, więc są co najmniej następujące:
Preferuję używanie mojego ulubionego edytora i pliku Makefile, który przygotowałem do pracy z większością przypadków użycia (a nawet ulepszyłem ten, który wkrótce udostępnię).
W przypadku bibliotek wolę zachować je jako własne repozytoria i użyć modułu podrzędnego git, aby uwzględnić je w projekcie. Ponieważ wiele bibliotek napisanych przez społeczność jest udostępnianych jako repozytoria git, jest to dobre ogólne rozwiązanie. Następnie w pliku Makefile muszę tylko dodać ścieżkę bibliotek, którą chcę uwzględnić w zmiennej LOCALLIBS .
Chociaż w przypadku niektórych projektów sensowne jest enkapsulowanie bibliotek w bibliotekę warstw abstrakcji sprzętowej przygotowaną dla projektu, wolę użyć ścieżki takiej jak:
project
project.ino
Makefile
project_hal_lib
library1
library2
library3
Chociaż w arduino 1.5.x oferowany jest nowy sposób określania bibliotek , który zapewni sposób tworzenia i budowania projektów arduino w taki sam sposób, jak już to robimy z pipy i virtualenv w pythonie, tj. Definiujesz zestaw bibliotek, których potrzebujesz pobierz.
źródło
flash
użycia programatora, alboupload
bootloadera. Oprócz obsługi łączenia bootloadera z oprogramowaniem układowym. Napisałem także ustawiacz bezpieczników w pliku.Najprostszym sposobem na to jest skopiowanie plików nagłówka i kodu biblioteki do katalogu źródłowego i dołączenie ich.
W swoim kodzie możesz to zrobić
include "somelib.h"
Wadą tego jest to, że biblioteki muszą znajdować się w tym samym folderze, a nie w podfolderach, przez co katalog wygląda na bałagan.
Jeśli chodzi o strukturę katalogów całego mojego projektu, w tym schematy i dokumentację, mój zwykle wygląda tak:
źródło
Podmoduły Git są niezwykle potężne, jeśli chodzi o organizowanie wielu zagnieżdżonych repozytoriów. Obsługa wielu bibliotek z różnych źródeł, a nawet obsługa części własnego projektu, które mogą być przechowywane w różnych źródłach, stają się łatwe dzięki podmodułom git.
Struktura katalogów
Sposobem na zorganizowanie projektów będzie:
projectA - Parent Directory
projectA - katalog kodu źródłowego zawierający kod Arduino
docs - Twój główny katalog dokumentacji
schematy - można je przechowywać osobno na osobnym repozytorium Git lub części tego samego repozytorium
libs - Będzie zawierał biblioteki stron trzecich.
licencja
CZYTAJ
Makefile - niezbędny do obsługi zależności między katalogami
Przepływ pracy
Śledziłbyś normalny cykl wprowadzania zmian, dodawania i zatwierdzania w odniesieniu do głównego repozytorium. Z pod-repozytoriami robi się ciekawie.
Masz możliwość dodania repozytorium do katalogu nadrzędnego głównego repozytorium. Oznacza to, że dowolna część twojej struktury katalogów, tj. Dokumenty, schematy itp. Może być utrzymywana jako osobne repozytorium i stale aktualizowana.
Możesz to zrobić za pomocą
git submodule add <repo.git>
polecenia. Aby go aktualizować, możesz użyćgit submodule update <path>
.Jeśli chodzi o utrzymywanie wielu bibliotek stron trzecich w twoim repozytorium, tak aby każda z nich mogła być kontrolowana sama w sobie lub aktualizowana w razie potrzeby, podmoduł git ponownie oszczędza Twój dzień!
Aby dodać repozytorium innej firmy do libs , użyj polecenia
git submodule add <lib1.git> libs/lib1
. Następnie, aby utrzymać bibliotekę w stałym punkcie w cyklu wydania, sprawdź bibliotekę i dokonaj zatwierdzenia. Aby aktualizować bibliotekę, użyj poleceniagit submodule update <path>
.Teraz możesz utrzymywać wiele repozytoriów w głównym repozytorium, a także wiele bibliotek stron trzecich na niezależnych etapach wydania.
W porównaniu z podejściem z pojedynczym katalogiem
Chociaż podejście z jednym katalogiem jest najprostsze, nie jest możliwe kontrolowanie wersji części katalogu bez większego bólu. Dlatego proste podejście nie uwzględnia różnych repozytoriów o różnych stanach w projekcie.
Takie podejście pozwala na utrzymanie wielu repozytoriów, ale wymaga Makefile do obsługi procesu kompilacji i łączenia.
W zależności od złożoności projektu można wybrać optymalne podejście.
źródło
vendor
,node_modules
itd.) Git odwołuje się do nich i śledzi je.Oto sposób, w jaki ostatecznie zdecydowałem się pójść za moimi projektami.
Arduino-CMake
Pierwszą ważną decyzją, którą podjąłem, był wybór narzędzia do kompilacji, które mogłoby działać w moim środowisku (Windows), ale nie ograniczało się do niego (chcę, aby moje projekty mogły być łatwo wykorzystywane przez inne osoby).
Testowałem różne narzędzia do tworzenia Arduino typu open source:
Znalazłem również ArduinoDevel , kolejne narzędzie do kompilacji Arduino - którego nie eksperymentowałem - które może generować pliki Makefile lub pliki Ant
build.xml
; ten wydawał się interesujący, ale nieco ograniczony pod względem funkcjonalności.W końcu zdecydowałem się na Arduino-CMake :
CMakeLists.txt
pliku konfiguracyjnym, aby dostosować właściwości, które były potrzebne w moim środowisku, np. typ Arduino, port szeregowy)w wygenerowanej marce tworzy się kilka celów do obsługi:
Struktura projektu
Ponieważ Arduono-CMake nie narzuca żadnej struktury katalogów dla twojego projektu, możesz wybrać ten, który najbardziej Ci odpowiada.
Oto, co zrobiłem osobiście (wciąż wymaga to dopracowania, ale teraz jestem z tego zadowolony):
Zdecydowałem się umieścić wszystkie moje projekty we wspólnym
arduino-stuff
katalogu (który zobowiązuję się do github jako całości, wiem, że mógłbym użyć podmodułów git dla lepszej organizacji na githubie, ale nie miałem jeszcze czasu, aby to sprawdzić).arduino-stuff
ma następującą treść:build
: to katalog, w którym cmake i make wygenerują wszystkie swoje rzeczy (makefile, pamięć podręczna, pliki obiektów ...); ten nie angażuje się w githubcmake
: ten jest tylko kopią (niemodyfikowaną) katalogu cmake Arduino-CMake . Ten dostaje się na github, więc łatwiej jest komuś, kto chce budować moje projektyCMakeLists.txt
: to jest „globalna” konfiguracja CMake, która deklaruje wszystkie wartości domyślne dla mojego środowiska (płyta, port szeregowy) i listę podkatalogów docelowych kompilacjiTaskManager
: to mój pierwszy projekt oparty na Arduino-CMake, ten jest biblioteką z przykładami; ta idrectory zawiera również wartość określającąCMakeLists.txt
cele dla projektuPunkty do poprawy
Obecne rozwiązanie nie jest jednak idealne. Wśród ulepszeń, które widzę (dotyczy to raczej projektu Arduino-CMake, aby uwzględnić te ulepszenia, jeśli uznają to za stosowne):
źródło
Folder MyProject (katalog główny repozytorium)
Powodem, dla którego sugeruję pozornie zbędny
MyProject
folder główny, jest to, że wspomniałeś o korzystaniu z GitHub. Podczas pobierania (zamiast klonowania) zawartości repozytorium GitHub nazwa gałęzi lub tagu jest dołączana do nazwy repozytorium (np.MyProject-master
). Arduino IDE wymaga, aby nazwa folderu szkicu była zgodna z nazwą pliku szkicu. Jeśli otworzysz plik .ino, który znajduje się w folderze, który nie pasuje do nazwy szkicu, Arduino IDE wyświetli monit o utworzenie odpowiednio nazwanego folderu szkicu i przeniesienie szkicu do tego folderu. Oprócz tego, że nie jest to bardzo dobre początkowe doświadczenie dla użytkownika, większym problemem jest to, że Arduino IDE może nie kopiować wszystkich innych powiązanych plików do nowo utworzonego folderu, co może spowodować, że program nie będzie się już kompilował. Umieszczając szkic w podfolderze, unikniesz GitHub zmieniającego nazwę folderu szkicu.Jeśli nazwa pliku GitHub nie jest dla Ciebie problemem, to zbędny folder główny nie jest konieczny.
folder danych
Polecam używanie
data
podfolderu do plików innych niż kod, ponieważ Arduino IDE ma specjalne traktowanie podfolderów o tej nazwie. Są one kopiowane do nowej lokalizacji, kiedy wykonujesz Plik> Zapisz jako ... . Podfoldery o innych nazwach nie są.folder src
src
Podfolder ma szczególną właściwość pozwala rekurencyjną kompilację . Oznacza to, że możesz pozostawić biblioteki w tym folderze i dołączyć je ze szkicu w następujący sposób:Arduino 1.5 Biblioteka Folder Format struktura jest również wspierany, trzeba tylko dostosować swoje
#include
oświadczenia odpowiednio.Należy pamiętać, że tylko Arduino IDE 1.6.10 (arduino-builder 1.3.19) i nowsze obsługują kompilację szkiców rekurencyjnych.
Niestety niektóre biblioteki używają niepoprawnej
#include
składni dla plików lokalnych (np.#include <ThirdPartyLibrary.h>
Zamiast#include "ThirdPartyLibrary.h"
). To nadal działa, gdy biblioteka jest zainstalowana w jednym zlibraries
folderów Arduino, ale nie działa, gdy biblioteka jest dołączona do szkicu. Dlatego niektóre biblioteki mogą wymagać drobnych zmian w celu użycia w ten sposób.Zdecydowanie wolę tę opcję niż zrzucanie wszystkich plików bibliotecznych w katalogu głównym folderu szkicu, ponieważ jest to bałagan, a każdy plik biblioteki będzie wyświetlany w Arduino IDE jako zakładki po otwarciu szkicu (oczywiście wszystkie pliki źródłowe robisz chcesz być edytowalne z Arduino IDE należy umieścić w folderze głównym szkicu).
Możliwość korzystania z dołączonych bibliotek w miejscu jest również zgodna z innym celem:
Usunięcie wymogu ręcznego instalowania bibliotek znacznie ułatwia korzystanie z projektu.
Pozwoli to również uniknąć szans na konflikt z innymi wersjami plików biblioteki o tej samej nazwie, które mogą być wcześniej zainstalowane.
źródło
Możesz użyć makefile https://github.com/sudar/Arduino-Makefile do kompilacji kodów Arduino. Niekoniecznie potrzebujesz IDE.
źródło
Prawdopodobnie naprawdę późno do gry, ale jest to wystarczająco popularne pytanie, aby odpowiedzieć przy użyciu nieco innych metod niż te już opublikowane.
Jeśli chcesz bezpośrednio zachować zgodność z Arduino IDE, możesz użyć czegoś takiego jak ten, który tutaj przedstawiłem:
https://gitlab.com/mikealger/ExampleArduinoProjectStructure/tree/master/ExampleSketchBook
Większość tego opierałem na notatkach Arduino - Struktura projektu i proces kompilacji oraz kilka wskazówek, które zbierałem przez lata.
Naprawdę nie wiem, dlaczego tak trudno jest znaleźć bezpośrednio na stronach Arduino, wydaje się to głupie, biorąc pod uwagę półprofesjonalne tło, że proces kompilacji jest tak tępy.
powodzenia tam
źródło