1 Zapoznanie się ze środowiskiem Xenomai.

Podobne dokumenty
1 Praca z maszyną wirtualną qemu/kvm

Wstęp do Programowania, laboratorium 02

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

Wstęp do programowania

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

Laboratorium Systemów Operacyjnych. Ćwiczenie 4. Operacje na plikach

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

Wstęp do Informatyki i Programowania Laboratorium: Lista 0 Środowisko programowania

Zadanie 1. Stosowanie stylów

/*W tym miejscu funkcja system wywołuje systemową komendę PAUSE tj.czeka tak długo, aż zostanie wciśnięty dowolny znak z

RPC. Zdalne wywoływanie procedur (ang. Remote Procedure Calls )

Podstawy Informatyki Wprowadzenie do języka C dr inż. Jarosław Bułat

Ćwiczenie 6. Wiadomości ogólne.

Podstawy Programowania.

Tworzenie oprogramowania

Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki

Programowanie niskopoziomowe

Lab 9 Podstawy Programowania

Instytut Teleinformatyki

Zespół Szkół Technicznych w Suwałkach. Pracownia Systemów Komputerowych. Ćwiczenie Nr 25 ARCHITEKTURA SYSTEMU LINUX. Opracował Sławomir Zieliński

PLUTO Sterownik bezpieczeństwa Skrócona Instrukcja obsługi oprogramowania. PlutoProgrammingManualPL_v7A.pdf 1

Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach?

Część XVII C++ Funkcje. Funkcja bezargumentowa Najprostszym przypadkiem funkcji jest jej wersja bezargumentowa. Spójrzmy na przykład.

Wprowadzenie do środowiska Qt Creator

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Programowanie w C++ Wykład 1. Katarzyna Grzelak. 26 luty K.Grzelak (Wykład 1) Programowanie w C++ 1 / 28

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady

PROGRAM TESTOWY LCWIN.EXE OPIS DZIAŁANIA I INSTRUKCJA UŻYTKOWNIKA

TEMAT : KLASY DZIEDZICZENIE

Argumenty wywołania programu, operacje na plikach

Instrukcja. importu dokumentów. z programu Fakt do programu Płatnik. oraz. przesyłania danych do ZUS. przy pomocy programu Płatnik

1.Wstęp. 2.Generowanie systemu w EDK

Platforma.NET. Laboratorium nr 1 Podstawy języka C#

Podstawy Programowania

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27

Wyrażenie include(sciezka_do_pliku) pozwala na załadowanie (wnętrza) pliku do skryptu php. Plik ten może zawierać wszystko, co może się znaleźć w

Implementacja aplikacji sieciowych z wykorzystaniem środowiska Qt

Temat 1: Podstawowe pojęcia: program, kompilacja, kod

Utworzenie pliku. Dowiesz się:

Jeśli chcesz łatwo i szybko opanować podstawy C++, sięgnij po tę książkę.

Cwiczenie nr 1 Pierwszy program w języku C na mikrokontroler AVR

SYSTEMY OPERACYJNE ĆWICZENIE POLECENIA SYSTEMU MSDOS

Programowanie Proceduralne

Adam Kotynia, Łukasz Kowalczyk

Szkolenia specjalistyczne

Typy wyliczeniowe Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki

Rys. 1. Widok uruchomienia polecenia apt-get install build-essential. Rys. 2. Widok uruchomienia polecenia apt-get install apache2

1. Opis. 2. Wymagania sprzętowe:

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

Programowanie w języku Python. Grażyna Koba

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

Linux: System Plików

Programowanie obiektowe

Wykład 3: Implementacja programów wbudowanych

Java Podstawy. Michał Bereta

Systemy Operacyjne - Operacje na plikach

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Podstawy Programowania 2

MentorGraphics ModelSim

Wstęp. do języka C na procesor (kompilator RC51)

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Git, Bitbucket, IntelliJ IDEA

Wprowadzenie do biblioteki klas C++

Programowanie I. O czym będziemy mówili. Plan wykładu nieco dokładniej. Plan wykładu z lotu ptaka. Podstawy programowania w językach. Uwaga!

Podstawy programowania skrót z wykładów:

Zajęcia nr 1 Podstawy programowania. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami

Sposoby wykrywania i usuwania błędów. Tomasz Borzyszkowski

Wprowadzenie. Dariusz Wawrzyniak. Miejsce, rola i zadania systemu operacyjnego w oprogramowaniu komputera

Programowanie mikrokontrolerów AVR

W pierwszej kolumnie wyświetlany jest identyfikator procesu (pid)

Ćwiczenie 1. Przygotowanie środowiska JAVA

Wprowadzenie. Dariusz Wawrzyniak. Miejsce, rola i zadania systemu operacyjnego w oprogramowaniu komputera

INSTRUKCJA INSTALACJI I URUCHOMIENIA PROGRAMÓW FINKA DOS W SYSTEMACH 64 bit

Administracja sieciowymi systemami operacyjnymi III Klasa - Linux

MATERIAŁY DO ZAJĘĆ I. Podstawowe pojęcia. Algorytm. Spis treści Przepis

IBM SPSS Statistics - Essentials for R: Instrukcje instalacji dla Linux

Systemy operacyjne. Wprowadzenie. Wykład prowadzą: Jerzy Brzeziński Dariusz Wawrzyniak

Programowanie na poziomie sprzętu. Programowanie w Windows API

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

Fragment wykładu z języka C ( )

Szablony klas, zastosowanie szablonów w programach

/* dołączenie pliku nagłówkowego zawierającego deklaracje symboli dla wykorzystywanego mikrokontrolera */ #include <aduc834.h>

Wskaźniki w C. Anna Gogolińska

Pytania sprawdzające wiedzę z programowania C++

Linux: Procesy. Systemy Operacyjne. Mateusz Hołenko. 26 marca 2013

learningpanel - logowanie

1 Podstawy c++ w pigułce.

Aplikacje internetowe i rozproszone - laboratorium

Autor: dr inż. Zofia Kruczkiewicz, Programowanie aplikacji internetowych 1

WPROWADZENIE DO INFORMATYKI

Wstęp do programowania. Wykład 1

Zadanie 2: Arytmetyka symboli

#include <iostream> using namespace std; void ela(int); int main( ); { Funkcja 3. return 0; }

Automatyzacja kompilacji. Automatyzacja kompilacji 1/28

Standardy programowania protokołów komunikacyjnych Laboratorium nr 5 komunikacja multicastowa IPv6

4. Procesy pojęcia podstawowe

Adresowanie obiektów. Adresowanie bitów. Adresowanie bajtów i słów. Adresowanie bajtów i słów. Adresowanie timerów i liczników. Adresowanie timerów

Transkrypt:

1 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óźnieniaprintf. 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 oraz wypisz je (Task management services/ rt_task_inquire). 7

8

2 Uruchamianie zadań i dostęp do timera systemowego. Odpowiednikiem procesu w systemie czasu rzeczywistego jest zadanie. Posiada własny stos, jest odpowiedzialne za wykonanie fragmentu kodu w czasie przydzielanym mu przez planistę(scheduler) RT. Xenomai jest systemem wielozadaniowym z szeregowaniem zadań opartym na priorytetach. Tworzenie oraz startowanie zadania. Poniżej znajduje się deklaracja funkcji odpowiedzialnej za utworzenie zadania. int rt_task_create (RT_TASK*task, const char*name, int stksize, int prio, int mode); Pierwszy argument task przyjmuje adres wcześniej zadeklarowanego obiektu typu RT_TASK, w którym przechowywane są informacje o zadaniu niezbędne podczas jego wykonywania. Każde zadanie musi posiadać unikalną nazwę, którą przekazuje się parametrem name. Służy ona do identyfikacji zadania w specjalnej przestrzeni nazw środowiska Xenomai. Pozostałe argumenty określają rozmiar stosu(w bajtach), priorytet(0-99) oraz flagi ustawień. Szczegółowy opis tych parametrów znajduje się w dokumentacji w opisie omawianej funkcji(task Management Services/ rt_task_create). Wszystkim domyślnie można przypisać wartość 0. Wartość 0 dla stosu oznacza automatyczny przydział potrzebnej liczby bajtów przez Xenomai. Gdy zadanie zostało utworzone i zarejestrowane w globalnej przestrzeni nazw znajduje się w stanie gotowości. Przejście do stanu wykonywania zadania następuje dzięki wywołaniu niżej podanej funkcji. int rt_task_start (RT_TASK*task, void(*entry)(void*cookie), void*cookie) Pierwszym parametrem jest identyfikator utworzonego wcześniej zadania. Drugi parametr określa adres funkcji, która będzie punktem startowym zadania, czyli rzeczywiście wykonywanym fragmentem kodu w jego obrębie. Trzeci argument służy do przekazania dowolnej paczki danych do zadania. Funkcja obsługi zadania musi przyjmować odpowiedni wzorzec: void func(void*arg) { /*routine*/ 9

} Kompilacja i uruchomienie programu. Zapoznaj się z zawartością plików ex2 main.c i Makefile znajdujących się w katalogu src/ex2/. Plik ex2 main.c zawiera najprostszy przykład użycia wcześniej opisanych funkcji. Tworzy oraz startuje zadanie czasu rzeczywistego, które następnie w cyklu 1s wypisuje na ekran rzeczywisty, zmierzony czas między kolejnymi wywołaniami. Za pomocą poniższych poleceń skompiluj oraz uruchom program. Aby przerwać jego działanie wciśnij ^C. $make $./ex2_main (a) Za pomocą zmiany SLEEP_TIME sprawdź poprawność wypisywanego czasu dla kilku mniejszych wartości(np. 100ms, 10ms, 1ms). Przy czym należy pamiętać, żeby nie schodzić zbyt nisko, wartości poniżej 100us mogą być już traktowane jako działanie w pętli nieskończonej i przy obecnej wersji systemu powodować jego zawieszenie. Kluczowym składnikiem każdego zadania jest jego priorytet. Określa on wagę wykonywanych przez nie operacji, a tym samym pierwszeństwo w dostępnie do najważniejszego zasobu procesora, czyli czasu. (b) Dodaj do poprzedniego programu nowe zadanie(task2) w analogiczny sposób jak zostało stworzone zadanie task. Nie zapomnij o zmianie nazwy na nową, oraz o funkcji usunięcia zadania(rt_task_delete). W dokumentacji systemu zapoznaj się z funkcjami rt_task_sleep(task management services), oraz rt_timer_spin(timer management services). Stwórz funkcję func2 i przypisz ją jako punkt startowy zadania task2. void func2(void*arg) { while(1){ time2 = rt_timer_read(); rt_timer_spin(sleep_time); rt_task_sleep(sleep_time); rt_printf("2%12lld\n\n",(rt_timer_read()-time2)); } } 10

SLEEP_TIME ustaw na 1s, a okres zadania task1 na SLEEP_TIME/2. Skompiluj i uruchom program. Na ekranie rozkład zadań powinien wyglądać tak jak przedstawiono poniżej. 1 1000171639 1 498298511 1 499962431 2 2000039025 1 1000198777 1 499858787 1 499796832 2 2000102671... Pytanie sprawdzające. Wyjaśnij dlaczego pierwsze zadanie(task1) wyświetla kolejne czasy swojego wywołania w przedstawiony sposób. Dlaczego odstępy czasowe pomiędzy tymi wywołaniami różnią się? 11

12