Poniższy zestaw zadań został opracowany w celu poznania podstawowych mechanizmów czasu rzeczywistego dostępnych w systemie Xenomai. Obejmuje on zapoznanie się ze środowiskiem programistycznym, obsługą zegara i zadań RT, mechanizmami synchronizacji i komunikacji, a także korzystaniem z przerwań. Cały zestaw poprzedzony jest ćwiczeniem wstępnym wprowadzającym do maszyn wirtualnych Qemu/KVM i infrastruktury laboratorium 07/C3. Oryginalne opracowanie: Krzysztof Maziarz, 2011 Aktualizacja: Witold Paluszyński, 2012

1

Praca z maszyną wirtualną qemu/kvm

1.1

Uwagi do pracy w laboratorium

Praca w laboratorium odbywa się na terminalach łączących się z serwerem panamint. Żeby uzyskać dostęp do maszyny wirtualnej należy się połączyć (z obsługą środowiska graficznego): $ ssh -X panamint

1.2

Praca w trybie okienkowym

W celu umożliwienia bezpiecznego programowania i testowania w środowisku Xenomai został stworzony obraz dysku dla maszyny wirtualnej QEMU (KVM). Zgodnie z poleceniami prowadzącego, przekopiuj podany plik obrazu dysku we wskazane miejsce, z nazwą identyfikującą Ciebie jako właściciela maszyny wirtualnej. Aby uruchomić maszynę w trybie okienkowym z posiadanego obrazu dysku z zainstalowanym systemem, zwykle wystarczy wykonać: $ kvm -hda xenomai.qcow2 Jednak czasami, ze względu na niezgodność obsługi klawiatury przez systemy sieciowe, przez które łączymy się z maszyną gospodarzem (panamintem), do polecenia uruchomienia kvm często trzeba dodać opcję -k en-us. Nastąpi uruchomienie na maszynie wirtualnej systemu Linux Xenomai, do którego można zalogować się jako domyślny użytkownik: user:

user

password: pass

1

Ponieważ jest to Twoja własna maszyna, zmień hasło użytkownika user na swoje indywidualne, i zapamiętaj to hasło do dalszego korzystania z maszyny. Poleceniem startx można uruchomić środowisko graficzne X Window i menedżer okien Fluxbox. Aby aktywować obsługę myszy w emulatorze wystarczy kliknąć w jego okno. Kombinacja klawiszy + przywraca mysz gospodarzowi. Wypróbuj te mechanizmy. Na maszynie wirtualnej zainstalowane są domyślnie edytory vim, emacs i nano. Uruchom i przećwicz wybrany edytor, tak aby swobodnie posługiwać się nim w trakcie wykonywania dalszych ćwiczeń.

1.3

Kopiowanie plików z i do maszyny wirtualnej

Program scp służy do kopiowania plików, jednak w domyślnej konfiguracji może być użyte jedynie z wewnątrz maszyny (pliki mogą być kopiowane w obu kierunkach).

1.4

Opcje zaawansowane — port szeregowy

Warto jednak dodać kilka opcji, które mogą okazać się przydatne w pracy z systemem. Jedną z takich opcji jest przekierowanie wyjścia wirtualnego portu szeregowego. W praktyce oznacza to, że w przypadku zawieszenia systemu (Kernel Panic) będzie można odczytać ostatnie logi systemu, czyli najprawdopodobniej poznać przyczynę awarii. $ kvm -hda xenomai.qcow2 -serial /dev/stdout To spowoduje bezpośrednie przekierowanie na terminal, można również wysłać logi do pliku -serial file:log.txt.

1.5

Przekierowanie portów sieciowych

Kolejną istotną sprawą jest komunikacja z gospodarzem, czyli komputerem na którym maszyna działa. Najwygodniej jest to zrobić poprzez przekierowanie pakietów sieciowych i połączenie np. poprzez ssh. W tym celu należy uruchomić maszynę w podany sposób: $ kvm -hda xenomai.qcow2 -redir tcp:5022::22 W ten sposób uruchomiona maszyna wirtualna tworzy port sieciowy w systemie gospodarza, do którego podłączony jest serwer połączeń ssh w systemie gościa. Pozwala ol łączyć się z systemem na maszynie za pomocą polecenia:

2

$ ssh user@localhost -p 5022 W podobny sposób można kopiować pliki poleceniem scp do i z systemu gościa, ale tym razem inicjując transfery z maszyny gospodarza. Uwaga: numer portu 5022 jest przykładem indywidualnie wybranego numeru portu. Należy wybrać jakiś własny numer portu, różny od numerów użytych przez innych użytkowników systemu gospodarza. Gdyby okazało się, że ktoś inny w tym samym momencie „zajął” już nasz wybrany port sieciowy na panamincie, to polecenie kvm z takim przekierowaniem nie uda się, i otrzymamy komunikat o błędzie. Należy wtedy wybrać inny numer przekierowania portu sieciowego. Przekierowany numer portu pozostaje w użyciu i jest zajęty przez cały czas uruchomienia maszyny wirtualnej. Przy kolejnym uruchomieniu maszyny można wybrać inny numer.

1.6

Uruchamianie w trybie demona

kvm -k en-us -net nic -net user -vga cirrus -hda xenomai.qcow2 \ -redir tcp:5022::22 -nographic -daemonize

1.7

Opcje zaawansowane — montowanie systemu plików

Wygodnie jest również zamontować system plików z maszyny gościa, co umożliwi edycję źródeł programów na maszynie gospodarza. Poniższe polecenie zamontuje katalog /home/user/ w utworzonym katalogu np. ~/xenomaifs/. Należy jednak pamiętać, że kompilacja musi się odbyć bezpośrednio na maszynie z Xenomai. $ sshfs user@localhost:/home/user/ ~/xenomaifs/ -p 5022::22 Żeby uzyskać dostęp do połączenia z internetem na maszynie gościa należy dodać opcje -net nic -net user. Ostatecznie polecenie uruchomienia emulatora z opisanymi opcjami wygląda następująco: $ kvm -net nic -net user -serial /dev/stdout -redir tcp:5022::22 \ -hda xenomai.qcow2

3

1.8

Zadanie domowe

Z zewnętrznego komputera połącz się z panamintem przez ssh. Nie korzystaj z systemu okienkowego (nie używaj opcji -X ani -Y programu ssh, a zamiast nich użyj opcji -x (małe x)). W systemie Windows konieczne będzie skorzystanie z programu takiego jak putty. Aby wyłączyć połączenie systemu okienkowego w systemie Windows wystarczy nieuruchamiać żadnego serwera ekranowego (jeśli nie wiesz co to jest to najpewniej nie masz go uruchomionego). Można również w ustawieniach programu putty znaleźć ustawienia tuneli, i wyłączyć (dezaktywować) tunel X Window (port 6000). W tym momencie praca na zdalnym komputerze będzie możliwa tylko w trybie tekstowym. Jest to ustawienie konieczne tylko na potrzeby tego zadania. W późniejszych zadaniach możesz włączać lub wyłączać system okienkowy, w zależności od potrzeby. Jednak pracując zdalnie, często praca w trybie okienkowym jest niemożliwa ze względu na jakość połączenia internetowego. Dlatego czasami konieczne jest łączenie się i praca w trybie tekstowym Po połączeniu się z panamintem, uruchom swoją maszynę wirtualną w trybie demona, z przekierowaniem portu ssh (22), używając wcześniej przedstawionych poleceń z przekierowaniem portów sieciowych. Następnie wejdź do maszyny i sprawdź, że możesz na niej pracować, korzystając wyłącznie z programów tekstowych (input/output). Rozłącz się z maszyną wirtualną nie wyłączając jej, rozłącz się z panamintem, a następnie połącz się z nim ponownie, i ponownie wejdź do uruchomionej wcześniej maszyny, sprawdzając, że nadal możesz na niej pracować. Ponownie przećwicz kopiowanie plików w obie strony (z maszyny na panaminta i w drugą stronę), i na dwa sposoby, najpierw inicjując kopiowanie z wewnątrz maszyny, a następnie inicjując kopiowanie z panaminta korzystając z wybranego przekierowanego numeru portu.

4

2

Zapoznanie się ze środowiskiem Xenomai.

Wszystkie ćwiczenia oraz programy opracowane zostały w Xenomai w wersji 2.5.6. Dlatego też odwołania do dokumentacji dotyczą dokumentu pod adresem: http://www.xenomai.org/documentation/xenomai-2.5/html/api/ Jest to oficjalna dokumentacja projektu, która stanowi podstawowy materiał do nauki. Dodatkowo używany będzie tylko interfejs natywny (Native Xenomai API). Aby uzyskać do niego dostęp należy po wejściu na stronę dokumentacji wybrać kolejno Modules/ i Native Xenomai API/ z menu znajdującego się po lewej stronie. Inne źródła informacji na temat Xenomai podane są poniżej: http://www.xenomai.org/documentation/xenomai-2.5/pdf/native-api.pdf http://git.xenomai.org/?p=xenomai-2.5.git;a=tree;f=include/native Dokumentacja dostępna jest również lokalnie w katalogu: /usr/xenomai/share/doc/xenomai/ Źródła (pliki nagłówkowe) znajdują się natomiast w katalogu: /usr/xenomai/include/native/

W celu sprawdzenia poprawności działania systemu i jego komponentów Xenomai dostarcza zbiór kilku programów konfiguracyjnych oraz testowych. Aby upewnić się co do wersji zainstalowanego systemu należy wykonać polecenie: $ xeno-config --version 2.5.6 Program ten najbardziej jest jednak przydatny na etapie kompilacji własnych programów. „Pamięta” prawidłowe ścieżki do bibliotek, plików nagłówkowych, oraz niezbędne flagi. Dodatkowo przechowuje również nazwę zalecanego kompilatora. Środowisko Xenomai oferuje szereg interfejsów programistycznych, z których jeden należy wybrać i wskazać w czasie kompilacji. Wszystkie prezentowane tutaj ćwiczenia i programy zostały wykonane przy użyciu interfejsu „native”. Flagi CFLAGS i LDFLAGS trzeba sparametryzować nazwą interfejsu, którego chcemy użyć. Polecenie wypisujące flagi dla kompilatora i linkera: $ /usr/xenomai/bin/xeno-config --skin=native --cflags -I/usr/xenomai/include -D_GNU_SOURCE -D_REENTRANT -Wall -pipe -D__XENO__ $ /usr/xenomai/bin/xeno-config --skin=native --ldflags -lnative -L/usr/xenomai/lib -lxenomai -lpthread 5

Informacje o systemie, jego zasobach, wątkach oraz wszystkich obiektach utworzonych przez Xenomai znajdują się w postaci plików i katalogów w systemie plików /proc, a dokładnie w /proc/xenomai/. Pliki sched i stat zawierają informacje o uruchomionych procesach RT. Wpisując polecenie cat sched można zauważyć, że uruchomiony jest jeden proces o nazwie ROOT/0 o priorytecie -1. Jest to Linux. Wydając polecenie cat stat wyświetlone zostaną dodatkowe informacje o nim, takie jak zużycie procesora. Uruchamiając teraz jeden z programów testowych Xenomai można zauważyć zmiany w plikach w /proc/xenomai/ spowodowane aktywnością systemu. Program switchtest służy do testowania zmian kontekstu wykonywanych zadań. W pierwszym terminalu należy wpisać: $ /usr/xenomai/bin/switchtest -s50 rtup rtup Po wydaniu tego polecenia naturalne będzie zauważalne spowolnienie reakcji systemu. Spowodowane jest to zamierzonym dodatkowym obciążeniem dodanym parametrem -s50. W drugim terminalu można sprawdzić zawartość plików sched i stat. Jak widać dodane zostały 3 nowe wątki, a proces ROOT/0 nie stanowi już 99czasu procesora.

Polecenie $ dmesg wyświetli informacje o wszystkich utworzonych i usuniętych obiektach. W przypadku błędów pojawią się tam również ich kody. Natomiast kody błędów zwracanych przez funkcje natywnego API można rozkodować na podstawie plików: /usr/include/asm-generic/errno-base.h /usr/include/asm-generic/errno.h Kompilacja i uruchomienie programu. Zapoznaj się z plikiem src/ex1/ex1_main.c. W pliku znajdują się komentarze opisujące wszystkie wykonywane instrukcje. Następnie skompiluj go i uruchom według podanych niżej poleceń: $ export XCFG=/usr/xenomai/bin/xeno-config $ export CFLAGS=‘$XCFG --skin=native --cflags‘ $ export LDFLAGS=‘$XCFG --skin=native --ldflags‘ $ gcc $CFLAGS $LDFLAGS -lrtdk ex0_main.c -o main $ ./main Program zawiera umyślnie umieszczoną instrukcję, która powoduje niepożądane opóźnienia printf. Spowodowane to jest znajdującymi się w niej wywołaniami systemowymi, które prowadzą do przełączenia trybu wykonywania. Ten skok oznacza, że Xenomai nadaje Linuksowi najwyższy 6

priorytet i wykonuje jego procesy, po czym wraca do normalnego trybu. Program po uruchomieniu wyświetla 3 informacje: nazwę zadania, liczbę przełączeń trybu, oraz czasy wykonywania zadania. Jak widać licznik przełączeń wskazuje na 1 z powodu znajdującego się printf. Uruchom program kilka razy i zwróć uwagę na czas wykonywania. Następnie usuń (zakomentuj) printf i uruchom program ponownie kilka razy. Można zauważyć, że czasy wykonywania wyraźnie się zmniejszyły. Korzystając z dokumentacji (źródła podane na początku) sprawdź jakie jeszcze informacje można

odczytać

z

RT_TASK_INFO

(Task management services / rt_task_inquire).

7

oraz

wypisz

je