Imie i nazwisko Nr indeksu Liczba punktów: Ramki oznaczone kolorem żółtym należy uzupełnić odpowiednią informacją! Po zakończeniu ćwiczenia niniejszą formatkę należy wysłać na adres: iwona.kochanska@eti.pg.gda.pl Przebieg labororatorium: Uruchomienie Intel Galileo Kompilacja skrośna programu C dla Intel Galileo Obsługa interfejsu GPIO biblioteka mraa Kompilacja skrośna biblioteki mraa dla Intel Galileo Obsługa czujników przez interfejs GPIO Kolorem zielonym w instrukcji oznaczono polecenia wykonywane w terminalu Intel Galileo! Logowanie do systemu operacyjnego hosta (OS Linux Debian): LOGIN: student HASŁO: student* Uruchomienie Intel Galileo 1. Komunikacja z Intel Galileo UART-USB Procedura uruchamiania Intel Galileo: włóż kartę SD z systemem Linux (Debian) połącz IG z komputerem hosta za pomocą przewodu USB-UART włącz zasilanie połącz IG ze switchem za pomocą przewodu Ethernet na komputerze hosta uruchom program putty z uprawnieniami root-a. W tym celu w linii
poleceń terminala wpisz: ~$ sudo putty konfiguracja połączenia w putty: Logowanie do systemu IG: LOGIN: root HASŁO: root Po zalogowaniu możesz sprawdzić, czy interfejs eth0 otrzymał numer IP z serwera DHCP: ~$ ifconfig Jeśli tak, możesz połączyć się z IG za pomocą ssh w terminalu na maszynie hosta: $ ssh root@192.168.1.xxx XXX ostatnie 3 cyfry nr IP Kompilacja skrośna programu C na platformę Intel Galileo Napisz programu (w języku C lub C++) wyświetlający w konsoli napis Hello World. Możesz do tego wykorzystać edytor plików Geany (Applications Menu Development Geany). Plik z kodem programu zapisz w swoim katalogu domowym w podkatalogu programy
#include <stdio.h> int main() { printf( %s, Hello World! ); return 0; } Skompiluj program kompilatorem natywnym maszyny hosta: $ gcc hello.c -o hello i uruchom go: $./hello Następnie sprawdź nagłówek ELF pliku wykonywalnego: $ file hello Wklej zawartość nagłówka: Jest to plik wykonywalny dla maszyny hosta. Aby skompilować program do pliku wykonywalnego dla procesora Quark, należy wykorzystać kompilator skrośny (cross-kompilator). Toolchain zawierający taki kompilator skrośny można przygotować kierując się wskazówkami zawartymi w dokumentacji: http://www.intel.com/content/dam/www/public/us/en/documents/release-notes/quark-x1000-bsp-build-sw-rel-userguide.pdf Rozdział 7: Building the Linux* Cross Compile Toolchain Using Yocto Project Taka budowa kompilatora trwa jednak kilka godzin. Gotowy Toolchain można pobrać spod adresu: http://git.eti.pg.gda.pl/intel-grant/pliki/iotdevkit.zip Rozpakuj go w katalogu /opt/ (w takim miejscu toolchain został zapisany na maszynie, na której został zbudowany, zapisanie go w innym miejscu spowodowałoby konieczność zmiany ścieżek w plikach konfiguracyjnych) $ cd /opt/ Student nie ma praw zapisu w tym katalogu, więc kolejne działania należy wykonać z uprawnieniami root-a: $ sudo cp ~/Downloads/iotdevkit.zip. $ sudo unzip iotdevkit.zip
Zmień właściciela katalogu iot-devkit: $ sudo chown -R student:student iot-devkit Od teraz nie trzeba mieć uprawnień roota, by wykonywać akcje w katalogu iot-devkit Przejdź do katalogu 1.7.2/ i wyświetl jego zawartość: $ cd 1.7.2 $ ls W katalogu znajdują się skrypty konfiguracyjne oraz katalog zawierający system plików potrzebnych do kompilacji skrośnej. Wyświetl zawartość skryptu environment-setup-i586-pokylinux, z którego będziesz za chwilę korzystać do kompilacji na platformę IG $ cat environment-setup-i586-poky-linux Ustawia on wartości różnych zmiennych środowiskowych (za pomocą polecenia export) Napisz, jakie wartości mają zmienne: ścieżka do systemu plików (SDKTARGETSYSROOT) kompilator GCC (CC) kompilator G++ (CXX) architektura maszyny docelowej (ARCH) prefiks kompilatora skrośnego tor GCC (CROSS_COMPILE) Uruchom w powłoce skrypt konfiguracyjny environment-setup-i586-poky-linux: $ source environment-setup-i586-poky-linux Od teraz możesz się posługiwać poleceniem zapisanym w zmiennej ${CC} do kompilacji
programów.c na platformę IG: $ ${CC} hello.c -o hello Prześlij plik wynikowy hello na platformę Intel Galileo za pomocą polecenia scp: $ scp hello root@192.168.1.xxx/. I spróbuj go uruchomić (terminal IG) $./hello Obsługa interfejsu GPIO biblioteka mraa Do obsługi pinów GPIO można wykorzystać bibliotekę mraa. Jej źródła powinny się znajdować w katalogu /opt/sources/. Jeśli ich tam nie ma, pobierz plik archiwum z repozytorium: https://github.com/intel-iot-devkit/mraa Skopiuj plik archiwum do swojego katalogu domowego i rozpakuj go: $ cd ~ $ cp /opt/sources/mraa-master.zip. $ unzip mraa-master.zip W ten sposób zostanie utworzony katalog mraa-master/. Znajduje się w nim oprócz źródeł biblioteki podkatalog z przykładowymi programami (examples). Skopiuj z niego przykład blink_onboard.c do swojego katalogu programy: $ cp mraa-master/examples/blink_onboard.c programy/ i spróbuj skompilować kompilatorem natywnym gcc (lub g++) i cross-kompilatorem zapisanym w zmiennej ${CC} (lub ${CXX}). Jakie komunikaty zwrócą kompilatory? Natywny gcc (lub g++): Skrośny ${CC} (lub ${CXX}): Kompilator skrośny zgłosił brak referencji do nazw zmiennych i funkcji z biblioteki mraa. Biblioteka ta powinna być dołączona do programu w sposób dynamiczny. Należy poinformować o tym kompilator: $ ${CC} blink_onboard.c -lmraa -o blink_onboard Sprawdź nagłówek pliku wynikowego: $ file blink_onboard
Wynik: Spróbuj teraz uruchomić plik wynikowy na maszynie hosta: $./blink_onboard System pozwolił uruchomić plik, jednak zgłosił brak biblioteki współdzielonej. Samo uruchomienie pliku jest możliwe dzięki zgodności architektury procesora Quark z architekturą procesora na maszynie hosta (akceptowalna jest różnica: 32-bit / 64-bit). Nie byłoby to możliwe, gdyby plik został skompilowany na architekturę ARM (np. dla Raspberry Pi). Brak biblioteki wpsółdzielonej nie powinien dziwić. Nie ma jej w standardowych bibliotekach systemu hosta. Prześlij plik do IG $ scp blink_onboard root@192.168.1.xxx/. I uruchom go (terminal IG) $./link_onboard Tu również brakuje biblioteki mraa. Listę wszystkich bibliotek potrzebnych do uruchomienia programu można obejrzeć po wywołaniu polecenia ldd: $ldd link_onboard Bibliotekę mraa należy skompilować na maszynie hosta za pomocą kompilatora skrośnego i586-poky-linux- 3. Kompilacja skrośna biblioteki mraa na platformę Intel Galileo Otwórz nowe okno terminala. Każda kompilacja powinna być realizowana w nowej sesji terminala ze względu na dobry obyczaj czyszczenia zmiennych środowiskowych przed kolejnym zadaniem. Ponowne ustawienie zmiennych środowiskowych dla cross-kompilatora: $ source /opt/iot-devkit/1.7.2/environment-setup-i586-poky-linux Przejdź do katalogu ~/mraa-master. Utwórz w nim katalog build i przejdź do niego: $ mkdir build $ cd build Skonfiguruj proces kompilacji: $ cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/Toolchains/oe-sdk_cross.cmake.. Uruchom kompilator: $ make Biblioteka zostanie skompilowana przy użycia kompilatora skrośnego. Następnie zainstaluj skompilowane biblioteki:
$ sudo make install Przejrzyj informację zwróconą przez narzędzie make. Zwróć uwagę, gdzie zostały zainstalowane biblioteki (ścieżka wypisana jest po komunikatach -- Installing: ). Ścieżka do plików nagłówkowych (*.h) to: Ścieżka do biblioteki libmraa.so.0.10.1 oraz linków symbolicznych do niej: libmraa.so.0 i libmraa.so to: Skopiuj pliki biblioteki i linki do niej do właściwego katalogu (względem punktu montowania!) na Intel Galileo. Punkt montowania na maszynie hosta: /opt/iot-devkit/1.7.2/sysroots/i586-poky-linux/ Punkt montowania na maszynie IG: / Ponownie uruchom program na platformie IG. Dioda na płycie powinna zacząć mrugać. 4. Zapis danych z czujnika do pliku Napisz program w języku C lub C++ odczytujący sygnał z wybranego sensora, podłączonego do analogowych pinów wejściowych GPIO i zapisujący: nr pomiaru odczytaną wartość rezystancji wartości mierzonej wielkości fizycznej (obliczoną z rezystancji) Jako kolejne wiersze pliku tekstowego dane.txt. Program powinien działać tak długo, dopóki w konsoli nie zostanie wpisany znak 'k'. Przykładowy program odczytujący analogowy pin wejściowy GPIO znajdziesz wśród przykładów w mraa-master/examples. Wynikowy plik tekstowy prześlij (poleceniem scp) na maszynę hosta i wyświetl w formie wykresu. Można to zrobić np. za pomoca narzędzia gnuplot: $ gnuplot gnuplot> plot "dane.txt" with linespoints Kod programu:
Wykres: