Szykujemy nowy konkurs! Jaka powinna być nagroda? Wypełnij krótką ankietę (3 pytania) »

Arduino, co w środku… – #3 – źródło wbudowanych(?) funkcji

Arduino, co w środku… – #3 – źródło wbudowanych(?) funkcji

Poznaliśmy już schemat Arduino, wiemy jak działa bootloader oraz jak wgrać program do modułu. Czas zobaczyć co kryje Arduino IDE.

Opis dotyczy wersji 1.6.10, ale zarówno starsze, jak i nowsze wydania raczej nie będą różniły się od siebie zbyt drastycznie.


Zanim zaczniemy korzystać z Arduino musimy zainstalować środowisko. Ja wybrałem domyślną lokalizację: C:\Program Files (x86)\Arduino. Nie przepadam za nazwami katalogów zawierającymi spacje, chodziło jednak o opisanie typowej instalacji. Stąd Windows i taka lokalizacja plików.

Niezbędny przykładowy kod

Przykładowy program, to znany "Blink" skrócony o przydługie komentarze. Program można łatwo skompilować oraz uruchomić – chyba każdy kto bawił się Arduino ma to za sobą:

Środowisko gotowe do dalszych testów.

Środowisko gotowe do dalszych testów.

Ważna uwaga – domyślne nazwy programów mogą utrudnić dalsze prace, warto więc zapisać projekt w znanym miejscu i pod łatwo rozpoznawalną nazwą. Ja zdecydowałem się na test1, co może nie jest idealnym wyborem, ale daje się szybko rozpoznać wśród innych plików.

Jak widzimy, środowisko robi wszystko za nas. Wystarczy nacisnąć kilka przycisków i dioda na Arduino zacznie migać. Spróbujmy jednak dowiedzieć się jaka magia się za tym wszystkim kryje.

Więcej informacji w konsoli Arduino IDE

Najpierw sprawmy, żeby Arduino IDE było nieco bardziej wylewne podczas pracy. Okazuje się, że wystarczy wybrać odpowiednią opcję - z menu Plik wybieramy polecenie Preferencje. Powinniśmy zobaczyć okno z konfiguracją programu:

Konfiguracja środowiska Arduino.

Konfiguracje środowiska Arduino.

W powyższym panelu ustawień znajdziemy opcję: Pokaż szczegółowe informacje podczas. Zaznaczamy kompilacji oraz wgrywania. Teraz powinniśmy powiększyć okno naszego sketcha, bo komunikatów będzie sporo. Kompilujemy projekt i od razu widzimy (długi) rezultat:

Widok większej ilości szczegółów działania Arduino.

Widok większej ilości szczegółów działania Arduino.

Właściwie wszystko już wiemy (o ile znamy gcc)… Ale może warto chwilę poświęcić na omówienie tego co zobaczyliśmy. Poniżej mój log z kompilacji:

Jak przebiega kompilacja kodu?

Pomijając kilka pierwszych linijek widzimy te najciekawszą:

Zobaczmy zawartość katalogu, do którego się odwołuje to polecenie, czyli:

C:\Program Files (x86)\Arduino\hardware\tools\avr\bin

Miejsce, do którego odwołuje się kompilator.

Miejsce, do którego odwołuje się IDE.

Okazuje się, że znajdziemy tam najzwyklejszy kompilator gcc (w wersji dla AVR oczywiście). Nie jest to tajemniczy kompilator Arduino, ale normalny kompilator C/C++.

Podgląd uruchomionego avr-gcc.

Podgląd uruchomionego avr-gcc.

Jeśli pochodzimy trochę po katalogach, to w „okolicy” znajdziemy tam cały kompilator gcc, biblioteki standardowe C oraz avrdude, czyli program do programowania przez STK500 oraz bootloader.

Jak przebiega uruchomienie kompilatora?

Wiemy już, że kompilator jest standardowy, zobaczmy więc jak jest uruchamiany. Jako jeden z parametrów wywołania g++ jest prawie nasz projekt (test1.ino.cpp zamiast test1).

Zobaczmy co zawiera katalog:

C:\Users\Piotrek\AppData\Local\Temp\build4e57d191c4249ccbbf44d7ace6800743.tmp

Zawartość wykorzystywanego katalogu.

Zawartość wykorzystywanego katalogu.

Okazuje się, że to jest lokalizacja, w której Arduino IDE przechowuje wszystkie pliki używane podczas kompilacji. Nasz oryginalny projekt to jeden plik: test1.ino. Z niego generowana jest zawartość widocznego katalogu.


Co ciekawe plik test1.ino.hex, to gotowy obraz dla avrdude – znowu standardowy, bez magii (niestety). W podkatalogu sketch znajdziemy plik, który jest wykorzystywany przez kompilator, czyli test1.ino.cpp.

Łatwo rozpoznać, że jest to nasz program z dodanymi kilkoma linijkami na początku. Najważniejsze jest #include<Arduino.h>. To właśnie dzięki tej linii mamy dostępne mnóstwo funkcji w programie.

Tutaj skrywa się cała "magia" Arduino

Czas poszukać pliku Arduino.h i sprawdzić co w nim znajdziemy. Linijka wywołująca g++ zawiera ścieżki do plików nagłówkowych (parametr -I). W moim przypadku, pliki nagłówkowe znajdziemy w katalogu: C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino

Plik nagłówkowy Arduino.h

Plik nagłówkowy Arduino.h

Zawartość tego pliku widoczna jest poniżej:

Jest tam wszystko co często traktowane jest jako "wbudowane", przykładowo:

Jak Arduino obsługuje liczby binarne?

Mnie najbardziej rozbroił plik „binary.h”, który jest włączany przez Arduino.h. Naiwnie uwierzyłem, że gcc dla AVR obsługuje liczby binarne, a tutaj taka niespodzianka:

Inna sprawa, że to świetna sztuczka, można wykorzystać w projektach, niezwiązanych z Arduino.


Wspomniany katalog jest bardzo interesujący. Znajdziemy w nim sporo funkcji i klas używanych w programach dla Arduino. Przykładowo WString zawiera klasę String używaną do manipulacji napisami, wiring.c dostarcza funkcji związanych z opóźnieniami i czasem (delay, milis), a wiring_digital.c zawiera funkcje manipulujące pinami (pinMode, digitalWrite, digitalRead).

Plik main.cpp - wywołanie setup() oraz loop()

Jednak najciekawszy (przynajmniej dla mnie) jest plik main.cpp

W nim znajduje się funkcja main! Jak łatwo zauważyć, wywołuje ona nasze funkcje setup() oraz loop() - tutaj jest cała magia Arduino. Widać że jest to zwykły program w C (albo raczej C++), tylko nieco dziwnie skonfigurowany. Na koniec możemy wgrać program na płytkę i zobaczyć:

Komunikaty widoczne podczas wgrywania programu.

Komunikaty podczas wgrywania programu.

Znowu nie ma magii – zwykłe wywołanie avrdude:

Podsumowując

Arduino, to po prostu gcc oraz avrdude wraz z bibliotekami oraz środowiskiem do programowania. Można je lubić lub nie – na pewno jest łatwe do zainstalowania i użycia dla początkujących. Co więcej jego kod źródłowy jest dostępny (na githubie), a samo środowisko jest pisane przy wykorzystaniu Eclipse…

Najważniejszy jest jednak następujący wniosek: jeśli uczymy się programować Arduino, możemy spokojnie chwalić się, że znamy C++. Nie ma żadnej różnicy między Arduino, a C/C++. To tylko inna wersja środowiska programistycznego.

Autor: Piotr (Elvis) Bugalski
Redakcja: Damian (Treker) Szymański

Nawigacja kursu


arduino, avr, C, gcc, programowanie

Trwa ładowanie komentarzy...