Jakie są zalety każdego języka podczas korzystania z Arduino?
Myślę, że to dobre ogólne pytanie, ale dodam trochę o tym, dlaczego pytam, czy ktoś chce mi dać wskazówkę.
Mam doświadczenie w gotowych językach, takich jak JavaScript, PHP, i majstrowałem przy językach takich jak Java i Visual Basic. Innymi słowy, znam techniki programowania oraz klasyczną i prototypową orientację obiektową, ale nie mam nic na temat bezpośredniej komunikacji ze sprzętem.
Robię oktokopter i myślę, że podejście obiektowe będzie najłatwiejsze. (Oprogramowanie będzie miało bardzo wiele funkcji ...) Jednak nigdy nie pisałem w C ++.
Ponieważ jest to strona pytań i odpowiedzi, która ma pomagać innym, tylko ogólne pytanie przedstawione na początku ma duże znaczenie, ale doceniłbym wszelkie komentarze na temat mojej sytuacji.
źródło
C++ vs. The Arduino Language?
- „Arduino Language” to C ++. Jest trochę wstępnego przetwarzania, aby zaoszczędzić ci robienia prototypów funkcji, ale na pewno jest to C ++.Odpowiedzi:
Moje osobiste doświadczenie jako profesora (programowanie, mechatronika) jest takie, że jeśli masz wcześniejsze doświadczenie w programowaniu i znasz pojęcia takie jak OOP, lepiej wybrać C / C ++. Język arduino jest naprawdę świetny dla początkujących, ale ma pewne ograniczenia (np. Musisz mieć wszystkie pliki w tym samym folderze). I jest to w zasadzie uproszczenie C / C ++ (możesz praktycznie skopiować i wkleić kod arduino do pliku C / C ++, i to zadziała). Ma to również sens, że możesz przejść i używać całkowicie znanego IDE jako eclipse:
http://playground.arduino.cc/Code/Eclipse
Początkowo wymaga to nieco więcej konfiguracji i konfiguracji środowiska programistycznego, ale IMHO warto dla programistów z doświadczeniem w dowolnym innym języku.
W każdym razie nie zaszkodzi ci zacząć używać języka arduino i IDE arduino przez kilka dni, aby zapoznać się ze sprzętem arduino, a następnie przejść do C / C ++ z Eclipse, aby naprawdę rozwinąć swój projekt.
źródło
Teoretycznie ...
Tak naprawdę nie ma języka Arduino. To naprawdę tylko C ++ z niektórymi bibliotekami specyficznymi dla domeny. Dodają one różne funkcje, takie jak funkcje, które można wywołać w celu sterowania sprzętem. Jeśli nie posiadasz tych funkcji, będziesz musiał bawić się bezpośrednio specjalnymi rejestrami, aby kontrolować wszystko. Tak zazwyczaj wykonuje się programowanie wbudowane. Jest szybki, ale może być trudny do nauczenia się i zrozumienia.
Oprócz funkcji biblioteki dodają alternatywne nazwy dla niektórych typów. Na przykład
boolean
ibyte
nie są w standardzie C ++. Są one jednak bezpośrednio równoważne zbool
iunsigned char
.Wszystkie te rzeczy oznaczają, że prawdopodobnie możesz bez trudu przenieść ogólny kod C ++ bezpośrednio na Arduino. Jednak cofnięcie się w drugą stronę może wymagać niewielkiej edycji.
W praktyce ...
Powiedziawszy to wszystko, programowanie w Arduino nie jest dokładnie tym samym, co ogólne programowanie w C ++. Wiele różnic jest jednak wspólnych dla wszystkich programów wbudowanych (takich jak ograniczona pamięć i moc obliczeniowa).
Warto również zauważyć, że jeśli używasz oficjalnego Arduino IDE, istnieją różne denerwujące dziwactwa i ograniczenia dotyczące konfiguracji kodu. Istnieją obejścia we wszystkich przypadkach (o ile mi wiadomo), ale czasami są dość frustrujące.
Aby uzyskać pełną elastyczność, użyj zewnętrznego IDE (takiego jak Eclipse) z wtyczką do obsługi Arduino. To powinno dać ci wszystkie zalety C ++, wraz z bibliotekami Arduino.
źródło
Po pierwsze, kompilator Arduino / IDE akceptuje C i C ++ bez zmian. W rzeczywistości wiele bibliotek jest napisanych w C ++. Znaczna część podstawowego systemu nie jest zorientowana obiektowo, ale może tak być.
Zatem „językiem arduino” jest C ++ lub C.
C ++ nie jest odśmiecany. Zarządza zmiennymi w zakresie - jeśli napiszesz:
Wtedy to znajdziesz
led
ii
nie rób ani nie wyciekaj, bez względu na to, ile razy dzwoniszblinkTimes
.Gdyby
i
była klasą, podobnie zostałaby usunięta po zakończeniu funkcji. Tak długo, jak nie używasznew
podobnych funkcji alokacji pamięci do tworzenia nowych obiektów, nie musisz się martwić o wycieki.Nadal może zabraknąć pamięci, jeśli tworzyć ogromne klas i używać ich sporo w funkcji głęboko zagnieżdżonych, ale w ogóle nie zamierzamy wpaść w kłopoty, dopóki nie rozpocznie kontaktach z
new
ifree
funkcje.Jeśli używasz
new
, będziesz musiał zadzwonićdelete
w odpowiednim czasie. C ++, a przez to Arduino, nie ma automatycznego czyszczenia pamięci, musisz jawnie zarządzać własną pamięcią.źródło
Językiem Arduino jest C ++, ale różni się bardzo od większości odmian C ++. Język Arduino ma wbudowane wiele abstrakcji, szczególnie w interfejsach sprzętowych, co czyni go bardzo łatwym w użyciu. Jeśli masz doświadczenie w Javie, C i C ++ powinny być bardzo podobne.
Główne różnice między Arduino i C ++ dotyczą pamięci. Zwykle nowoczesny komputer ma ponad 2 GB pamięci RAM, a Arduino Uno ma 2 kB (1 milion razy mniej). Arduino używa także instrukcji 8-bitowych zamiast 32-bitowych instrukcji używanych przez komputer. Wpłynie to głównie na ilość informacji, które można przechowywać w zmiennej.
Jeśli jesteś bardzo nowy w świecie Arduino, powinieneś poszukać samouczka, ponieważ istnieje wiele dobrych.
źródło
int blah = 5;
), Zostaną one automatycznie zniszczone, gdy wyjdą poza zakres (tj. Na końcu pętli lub funkcji). Jeśli jednak utworzysz je na stosie (np.int *blah = new int(5);
), Musisz je zwolnić samodzielnie. Jednak zwykle nie jest rozsądne wykorzystywanie danych sterty w programowaniu osadzonym.--- Aktualizacja 170412
Oryginalną odpowiedź napisałem trzy lata temu z perspektywy istnienia wyraźnego „Arduino C ++”. Językiem używanym w IDE jest standardowy C ++, ponieważ jest on implementowany przez kompilator GNU C ++. Wkraczają „pozorne” różnice, ponieważ IDE wykona wstępne przetwarzanie, aby pomóc nowym użytkownikom języka uniknąć kilku „gotcha”, wypełniając niektóre #include, f / ex. Ale możesz - i ja to robię - napisać do niego poprawny C ++ i uzyskać dokładnie to, czego oczekujesz.
--- koniec aktualizacji
Ogranicz korzystanie z funkcji języka C ++ do tych, których implementację w pełni rozumiesz. Istnieje kilka funkcji, które kompilują się do kodu bardziej wymagającego zasobów, niż wynika to z czytania kodu źródłowego. Opcjonalnie wygenerowana lista .lss (scalone źródło i zestaw) może dać ci dobry wgląd w to, co zrobił kompilator C ++, kiedy nie patrzyłeś.
Na twoje pytanie dotyczące pamięci: C ++ nie śmieci. Języki oparte na stosach, takie jak C i C ++, przydzielają tymczasowe miejsce przechowywania na stosie dla zmiennych automatycznych przy wprowadzaniu funkcji, które następnie są zwalniane po powrocie funkcji, ale nie jest to prawdziwe odśmiecanie. Obiekty utworzone w pamięci sterty lub globalnej są aktywne do momentu ich jawnego usunięcia. Upewnij się, że wiesz, gdzie, kiedy i jak długo będą tworzone różnego rodzaju obiekty. Naprawdę nie chcesz, żeby twoje obiekty do kodowania
new
idelete
-ing chciały nie chcąc. Zostaną one wbudowane w pamięć sterty, fragmentując ją i powodując, że wyrósł na stos. Wtedy twój kod - i twój miły 'copter' ulegnie awarii.C nie mniej dla ciebie więc można zrobić mniej do ciebie. To nie jest zły wybór. C z kilkoma funkcjami C ++ może być jeszcze lepszym wyborem, biorąc pod uwagę rozsądne wybranie dodatkowych funkcji C ++, jeśli są to dwie opcje:
[Oryginalna odpowiedź] - C ++ jest znormalizowanym językiem. Jest szeroko wdrażany w wielu środowiskach, w tym w systemach wbudowanych, dlatego jest bardziej gruntownie przetestowany niż bardzo podobny do C ++ język „Arduino”. Jest to szczególnie ważne w przypadku aplikacji o znaczeniu krytycznym / bezpieczeństwa, takich jak planowane. Rozbił kod oznacza rozbity helikopter, a nawet jeśli to nie boli kogoś, że będzie złamać drogie maszyny.
Standardowo C ++ jest przenośny. Potrzebujesz zaktualizować procesor? Wszystko oprócz kodu specyficznego dla krzemu przeniesie się do nowego. Chcesz zmienić zestaw narzędzi, system programistyczny, system operacyjny? C ++ będzie obsługiwany wszędzie. Chociaż Arduino IDE będzie działało wszędzie tam, gdzie obsługiwana jest Java, jest to jedyne narzędzie, które korzysta z Arduino C ++ i jest to bardzo ograniczone narzędzie. Jeśli chcesz korzystać z Eclipse, narzędzi AVR, chodzić boso w wierszu poleceń, rozwijać w Emacsie lub w innym preferowanym środowisku, obsługiwane będzie standardowe C ++.
Arduino IDE robi rzeczy za twoimi plecami - w szczególności # zawiera pliki .h, kiedy myśli, że ich potrzebujesz. Nawet jeśli jest to poprawne, naprawdę chcesz napisać, a przynajmniej zobaczyć i zrozumieć wszystko, co kompilator zobaczy. Języki programowania nie są tworzone dla komputerów (komputery jedzą kawałki na śniadanie); są stworzone dla ludzi, w szczególności osób śledzących cię w ramach projektu, z których najważniejszym może być ... ty !, kiedy 6 miesięcy po napisaniu modułu musisz wrócić, aby go ulepszyć, lub więcej prawdopodobnie napraw to. Naprawdę chcesz widzieć wszystko, co widzi kompilator.
źródło
Z mojego doświadczenia wynika, że najlepiej jest unikać nowych i usuwać je na komputerach z ograniczoną pamięcią.
Mogą istnieć przypadki, w których uzasadnione jest użycie dynamicznej budowy i niszczenia instancji, ale podejrzewam, że są rzadkie.
źródło
new
idelete
są również dostępne w Arduino IDE.Jak wspomniano w kilku odpowiedziach, jeśli ogólnie programujesz system wbudowany, powinieneś unikać nowego, chyba że zarządzasz własną stertą pamięci i naprawdę wiesz, jakie będą cykle życia obiektu. Zmienne alokacji statycznej lub stosu są znacznie bezpieczniejsze. To powiedziawszy, jedną z powszechnych sztuczek zarządzania takimi rzeczami, jak bufory o zmiennej długości przydzielane na czas trwania funkcji, jest posiadanie zmiennej automatycznej (na stosie), która jest obiektem, który wywołuje nowy w swoim konstruktorze, a następnie umieszcza usunięcie w destruktorze więc gdy obiekt wykracza poza zasięg, bufor jest zwalniany z powrotem na stos. Ponownie, jest to zwykle ograniczone zastosowanie w małych mikroskach, ale jest to fajny wzór do zapamiętania.
źródło
Oprócz powyższych komentarzy chciałbym jeszcze bardziej podkreślić problemy z działającą pamięcią RAM, które masz na płytach Arduino, szczególnie z Uno (i innymi, które mają ten sam mikrokontroler). Niedawno napisałem prostą grę Space Invaders działającą na matrycy LED 32x32 i wielokrotnie napotykałem problemy spowodowane niską pamięcią.
Uno ma tylko 2048 bajtów pamięci RAM. Biblioteka mojej matrycy zajęła ponad 3/4 tej wartości, pozostawiając mi około 400 bajtów na grę. Ponieważ moim zamiarem jest „uaktualnić” projekt w pewnym momencie, aby uruchomić wiele gier z tym samym programem w oparciu o mocniejszy Due, zaprojektowałem kod z zasadami OO i dużym dziedzictwem klasowym. (Klasa gry została odziedziczona z wirtualną aktualizacją i losowaniami, wszystkie elementy gry zostały odziedziczone).
Prawie zabrakło mi pamięci po prostu dodając najeźdźców. Próbowałem zaoszczędzić pamięć poprzez bit-fielding ich zmiennych składowych, ale zabrakło mi ponownie przy dodawaniu obiektów shield. Po nieco więcej skrobaniu zabrakło mi dodawania bomb / pocisków. W tym momencie przeszukałem kod i usunąłem wszystkie „wirtualne” tagi (wszystkie prototypy moich klas są zbudowane z fragmentu Visual Assist, a wszystkie destruktory są wirtualne automatycznie). To natychmiast zmniejszyło o połowę zużycie pamięci, uwalniając wystarczająco dużo, aby móc dokończyć kod.
Krótko mówiąc, wynikiem końcowym jest kod C ++, który tak naprawdę nie korzysta z żadnych funkcji C ++. Równie dobrze możesz trzymać się C i być bardzo świadomym wykorzystania pamięci. Jeśli nie przekroczysz 2 KB, nie uzyskasz żadnej pomocy - szczególnie jeśli korzystasz z alokacji dynamicznej, kod po prostu przestaje działać i pozostajesz przez chwilę drapiąc się w głowę, dopóki nie rozważysz możliwości przepełnienia pamięci.
PS - Zmienne pola bitowego są złe. Bardzo źle. Oprócz dodawania narzutu przetwarzania straciłem kontrolę nad tym, ile razy dodałem nowy stan do gry, ale kod nie działał i nie mogłem zrozumieć, dlaczego. Moja zmienna stanu nie była wystarczająco szeroka, aby pomieścić nową wartość stanu, więc otrzymałem jakiś nieoczekiwany stan.
źródło
Językiem Arduino jest C ++ (aczkolwiek zwykle implementowany w stylu bardziej podobnym do „C z klasami”, co w rzeczywistości jest dość powszechne w świecie mikrokontrolerów systemów wbudowanych). Koniec opowieści. Wystarczy, że ludzie myślą, że to już inny język! Wykorzystuje kompilator g ++.
Dowód:
Włącz pełne wyjście podczas kompilacji w Preferencjach i przesyłaj, a nauczysz się dużo po prostu czytając te wiersze.
Oto kilka dodatkowych informacji:
Moje własne słowa:
Kod Arduino to C ++. Podstawowe funkcje Arduino to po prostu zestaw klas i bibliotek C ++, których można używać. Jest budowany i kompilowany przy użyciu kompilatora GNU gcc / g ++ . Twoje funkcje setup () i loop () są po prostu umieszczane w obowiązkowej funkcji main () ( właśnie tutaj - zauważ, że plik to „main.cpp”, który jest plikiem źródłowym w C ++) automatycznie dla ciebie i jest kilka dodatkowych wstępne przetwarzanie wykonane, aby upewnić się, że jest to poprawny program C ++ (np. skanowanie wszystkich prototypów funkcji [aka: deklaracje] dla ciebie, abyś mógł użyć funkcji, nawet jeśli jej prototyp pojawi się później w pliku .ino). Jednak duża część Arduino jest napisana w „stylu C”, dlatego wymaga
# extern "C" {}
otaczających go nawiasów klamrowych, aby zapobiec używaniu C ++wywołanie funkcji „zmiany nazwy” (znanej również jako „dekorowanie nazwy / dekorowanie nazwy” ) do funkcji C implementowanych przez AVR-libc , która jest implementacją C dla ATmega328 i innych mikrokontrolerów architektury AVR .Słowa Arduino:
Źródło: https://www.arduino.cc/en/Main/FAQ#toc13
Kiedy używać biblioteki Arduino zamiast czystego C lub C ++?
Dlatego używaj języka Arduino, w którym to upraszcza, i pisz własne funkcje, w których potrzebujesz większej specjalizacji. Radzę jednak szybko uciec od IDE do pisania kodu - użyj go do kompilacji. Ustaw preferencje IDE, aby używały „Edytora zewnętrznego”. Następnie użyj profesjonalnego edytora kodu źródłowego / IDE, takiego jak Sublime Text 3 , Atom , Visual Studio Code lub Eclipse CDT, aby napisać kod. Następnie możesz kliknąć z powrotem do Arduino IDE, aby skompilować i przesłać. Jeśli korzystasz z Eclipse, możesz to zrobić w Eclipse (zobacz inne odpowiedzi tutaj i zobacz artykuł o Eclipse na placu zabaw Arduino ), więc zastanów się również nad użyciem tych technik.
źródło