1. Timery i zdarzenia

Podobne dokumenty
1. Timery i zdarzenia

1 Timery i zdarzenia

1. Kolejki komunikatów POSIX

POSIX: IEEE Std (Issue 6, 2004 edition)

PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO

Sprz etowy zegar czasu rzeczywistego RTC. Synchronizacja zegara RTC

Sprz etowy zegar czasu rzeczywistego RTC

Timer sprz etowy. Sprz etowy zegar czasu rzeczywistego RTC. Synchronizacja zegara RTC. Timer sprz etowy (cd.)

Sygnały. 7. Sygnały (2005/2006)

1. Tworzenie nowego projektu.

Sprz etowy zegar czasu rzeczywistego RTC. Synchronizacja zegara RTC. Timer sprz etowy. Timer sprz etowy (cd.)

Kolejki komunikatów POSIX

13. Kolejki komunikatów POSIX

CZAS 1. Układy pomiaru czasu w komputerze PC

PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO

SUMA KONTROLNA (icmp_cksum) NUMER KOLEJNY (icmp_seq)

1. Utwórz blok pamięci współdzielonej korzystając z poniższego kodu:

// Liczy srednie w wierszach i kolumnach tablicy "dwuwymiarowej" // Elementy tablicy są generowane losowo #include <stdio.h> #include <stdlib.

Jedrzej Ułasiewicz Komputerowe systemy sterowania 1

QNX Neutrino (v 6.3)

Materiał uzupełniający do ćwiczen z przedmiotu: Programowanie w C ++ - ćwiczenia na wskaźnikach

Sygnały i ich obsługa

1. Kolejki komunikatów POSIX

Procesy. Systemy Operacyjne 2 laboratorium. Mateusz Hołenko. 9 października 2011

Programowanie Proceduralne

Temat zajęć: Tworzenie i obsługa wątków.

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

PROGRAMOWANIE w C prolog

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

Pobieranie argumentów wiersza polecenia

CZAS 1. Układy pomiaru czasu w komputerze PC

Wykład 1

Typy złożone. Struktury, pola bitowe i unie. Programowanie Proceduralne 1

Podział programu na moduły

Łącza nienazwane(potoki) Łącza nienazwane mogą być używane tylko pomiędzy procesami ze sobą powiązanymi.

Funkcja (podprogram) void

Laboratorium 7: Liczniki czasu (jedne zajęcia) dr inż. Arkadiusz Chrobot

Programowanie Współbieżne

Struktury czyli rekordy w C/C++

Wstęp do programowania 1

UNIX. mgr inż. Marcin Borkowski

Pomoc dla użytkowników systemu asix 6 i 7. Drajwer Bufor. Dok. Nr PLP6021 Wersja:

Pliki w C/C++ Przykłady na podstawie materiałów dr T. Jeleniewskiego

Krótkie wprowadzenie do korzystania z OpenSSL

dynamiczny przydział pamięci calloc() memset() memcpy( ) (wskaźniki!! )

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

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

procesy odrębne dzielone

Programowanie obiektowe

Obsługa plików. Systemy Operacyjne 2 laboratorium. Mateusz Hołenko. 25 września 2011

1.1 Przykład znajdowanie liczb pierwszych leżących w zadanym zakresie, tryb bezpołączeniowy

Procesy, pliki, potoki, sygnały - uzupełnienie

Semafor ustaw_semafor(key_t nazwa, int start); Semafor usun_semafor(semafor sem); void signal(semafor sem); void wait(semafor sem);

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

Politechnika Gdańska Katedra Optoelektroniki i Systemów Elektronicznych

Sygnał mechanizm asynchronicznego powiadamiania procesów o zdarzeniach zwykle awaryjnych.

5 Przygotował: mgr inż. Maciej Lasota

Programowanie I C / C++ laboratorium 02 Składnia pętli, typy zmiennych, operatory

Qt sygnały i designer

Systemy wbudowane. Wykład 6: Modelowanie systemów wbudowanych w SystemC, cz.i struktura specyfikacji. Standard IEEE Open source

Programowanie w C Wartości pseudolosowe i pomiar czasu

Metody obsługi zdarzeń

3. Identyfikacja. SKŁADNIA #include <sys/socket.h> int getpeername(int socket, struct sockaddr *addr, int *addrlen);

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

Gniazda BSD. komunikacja bezpołączeniowa

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Wstęp do programowania 1

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 12 - sem.iii. M. Czyżak

1. Przerwania ogólnie

Licznik prędkości LP100 rev. 2.48

Programowanie proceduralne INP001210WL rok akademicki 2015/16 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

WPROWADZENIE DO SYSTEMÓW CZASU RZECZYWISTEGO

Jędrzej Ułasiewicz Programownie aplikacji współbieżnych str. 1. Wątki

Krótki kurs programowania współbieżnego

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Język ludzki kod maszynowy

Wykład 3. Procesy i wątki. Wojciech Kwedlo, Wykład z Systemów Operacyjnych -1- Wydział Informatyki PB

Wątek - definicja. Wykorzystanie kilku rdzeni procesora jednocześnie Zrównoleglenie obliczeń Jednoczesna obsługa ekranu i procesu obliczeniowego

Układy czasowo-licznikowe w systemach 80x86

Informacje wstępne #include <nazwa> - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char

1. Uruchom poniższy program tworzący pojedynczy wątek:

10. Synchronizacja użycia zasobów, Semafory Problem producenta i konsumenta

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

Wykład 15. Literatura. Kompilatory. Elementarne różnice. Preprocesor. Słowa kluczowe

Zaawansowane programowanie w C++

7. Szeregowanie procesów w systemie QNX6 Neutrino

3 Przygotował: mgr inż. Maciej Lasota

4.2 Sposób korzystania z l acza

Mariusz Rudnicki PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO CZ.2

Instytut Teleinformatyki

Poniższe funkcje opisane są w 2 i 3 części pomocy systemowej.

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Rysowanie punktów na powierzchni graficznej

PMiK Programowanie Mikrokontrolera 8051

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

Programowanie strukturalne język C - wprowadzenie

Futex (Fast Userspace Mutex) Łukasz Białek

Programowanie procesorów graficznych NVIDIA (rdzenie CUDA) Wykład nr 1

PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO

Obsługa sygnałów. Tomasz Borzyszkowski

Transkrypt:

Sygnały 1 1. Timery i zdarzenia 1.1 Funkcje i programowanie timerów Jedną z najczęściej spotykanych funkcji systemu jest generowanie zdarzeń które w ustalonym czasie uruchomić mają określone akcje systemu. System operacyjny zawiera specjalnie do tego celu utworzone obiekty nazywane timerami (ang. timers). Aby użyć timera należy: utworzyć podaje się specyfikację generowanego zdarzenia nastawić podaje się specyfikację czasu wyzwolenia W systemie Linux timery generować mogą następujące typy zdarzeń: 1. Sygnały 2. Utworzenie nowego wątku Sygnał zdarzenie Timer P1 handler sygnału P2 kod wątka wątek Wysłanie sygnalu Utworzenie wątka Rys. 1-1 Dwa rodzaje akcji inicjowanych przez timer Ustawienie timera polega na przekazaniu mu informacji o planowanym czasie wyzwolenia, sposobie określenia tego czasu trybie pracy timera.

Sygnały 2 Czas można określać w sposób: absolutny - czas UTC lub lokalny relatywny - przesunięcie czasowe począwszy od chwili bieżącej Timer może pracować w dwóch trybach: 1. Wyzwolenie jednorazowe (ang. one shot) 2. Wyzwalanie cykliczne (ang. periodical) Wysłanie sygnału Utworzenie wątka Utworzenie zdarzenia czas relatywny czas absolutny zdarzenie start Utworzenie timera timer_create(...) Nastawienie timera timer_settime(...) czas wyzwolenia okres wyzwalania Rys. 1-2 Etapy przygotowania timera do pracy

Sygnały 3 1.2 Zdarzenia System Linux posiada uniwersalny a zarazem jednolity system powiadamiania o zdarzeniach (ang. event). Zdarzenie może być: sygnałem zdarzeniem które uruchamia wątek. W zawiadomieniach używa się struktury pliku nagłówkowym <sys/siginfo.h> sigevent zdefiniowanej w union sigval { /* Data passed with notification */ int sival_int; /* Integer value */ void *sival_ptr; /* Pointer value */ }; struct sigevent { int sigev_notify; /* Notification method */ int sigev_signo; /* Notification signal */ union sigval sigev_value; /* Data passed with notification */ void (*sigev_notify_function) (union sigval); /* Function used for thread notification (SIGEV_THREAD) */ void *sigev_notify_attributes; /* Attributes for notification thread (SIGEV_THREAD) */ pid_t sigev_notify_thread_id; /* ID of thread to signal (SIGEV_THREAD_ID) */ }; Listing 1-1 Budowa struktury sigevent Znaczenie pól struktury zależy od wartości pola sigev_notify które określa typ zawiadomienia.

Sygnały 4 Wartość pola sigev_notify SIGEV_NONE Akcja Brak akcji SIGEV_SIGNAL SIGEV_THREAD SIGEV_THREAD_ID Wysłanie do procesu sygnału zwykłego którego numer zawarty jest w polu sigev_signo Utworzenie wątku, kod wątku zawarty jest w funkcji wskazywanej przez pole sigev_notify_function (Tylko Linux) Działanie takie jak dla SIGEV_SIGNAL ale sygnał kierowany do wątku którego identyfikator zawarty jest w polu sigev_notify_thread_id. Wartość ta zwracana jest przez funkcję clone i gettid. Tabela 1-1 Typy zawiadomień w systemie Linux Na poziomie aplikacji używane są zawiadomienia w postaci: sygnałów wątków

Sygnały 5 1.3 Tworzenie i ustawianie timerów Timer jest obiektem tworzonym przez system operacyjny a jego funkcją jest generowanie zdarzeń w precyzyjnie określonych chwilach czasu. Aby użyć timera należy wykonać następujące czynności: 1. Zdecydować jaki typ zawiadomień ma generować timer (impulsy, sygnały, uruchomienie wątku) i utworzyć strukturę typu sigevent. 2. Utworzyć timer. 3. Zdecydować o rodzaju określenia czasu (absolutny lub relatywny). 4. Zdecydować o trybie pracy (timer jednorazowy lub cykliczny) 5. Nastawić go czyli określić tryb pracy i czas zadziałania. Opis Utworzenia timera Nastawienie timera Uzyskanie opóźnienia timera Kasowanie timera Tabela 1-2 Funkcje operujące na timerach Funkcja timer_create() timer_settime() timer_getoverrun() timer_delete() Tworzenie timera Timer tworzy się za pomocą funkcji timer_create(). int timer_create(clockid_t clock, struct sigevent *evn, timer_t *timerid) clock Identyfikator zegara użytego do odmierzania czasu obecnie CLOCK_REALTIME evn Struktura typu sigevent zawierająca specyfikację generowanego zdarzenia. timerid Wskaźnik do struktury zawierającej nowo tworzony timer Typ powiadomienia określa struktura sigevent sygnał - SIGEV_SIGNAL odblokowanie wątku - SIGEV_THREAD

Sygnały 6 Ustawianie timera Ustawienie timera polega na określeniu: sposobu określenia czasu, czasu wyzwolenia, okresu repetycji. Do ustawiania timera służy funkcja timer_settime() int timer_settime(timer_t *timerid,int flag, struct itimerspec *val, struct itimerspec *oldval) timerid Identyfikator timera zainicjowany przez funkcję timer_create flag Flagi specyfikujące sposób określenia czasu 0 czas relatywny TIMER_ABSTIME czas absolutny val Specyfikacja nowego czasu aktywacji oldval Specyfikacja poprzedniego czasu aktywacji struct itimerspec { struct timespec it_value; // pierwsza aktywacja struct timespec it_interval; // interwał } struct timespec { long tv_sec; // sekundy long tv_nsec; // nanosekundy } it_value - Czas pierwszego uruchomienie it_interval - Okres repetycji

Sygnały 7 it_value it_interval Typ zdarzeń v > 0 x > 0 Cykliczne generowanie zdarzeń co x począwszy od v v > 0 0 Jednorazowa generacja zdarzenia w v 0 dowolny Timer zablokowany x > 0 x > 0 Cykliczne generowanie zdarzeń co x Tabela 1-3 Ustawianie trybu pracy timera Przykład 1 - timer jednorazowy it_value.tv_sec = 2; it_value.tv_nsec = 500 000 000; it_interval.tv_sec = 0 it_interval.tv_nsec = 0; Uruchomi się jednorazowo za 2.5 sekundy od chwili bieżącej. Przykład 2 - timer cykliczny it_value.tv_sec = 2; it_value.tv_nsec = 500 000 000; it_interval.tv_sec = 1 it_interval.tv_nsec = 0; po upływie 2.5 sekundy będzie generował zdarzenia cyklicznie co 1 sekundę. Przykład 3 - timer absolutny it_value.tv_sec = 1162378200; it_value.tv_nsec = 0; it_interval.tv_sec = 0 it_interval.tv_nsec = 0; 1 listopada 2006 roku, godzinie 12.50

Sygnały 8 it_value it_interval Czas pierwszego odpalenia Interwal tv_sec tv_nsec tv_sec tv_nsec struct itimerspec struct timespec Czas T Rys. 1-3 Pola struktury itimerspec dla timera cyklicznego (v = 2.5 sek, x=1sek) Testowanie timera Testowanie czasu pozostałego do wyzwolenia timera odbywa się za pomocą funkcji timer_gettime(). int timer_gettime(timer_t *timerid, struct itimerspec *value) timerid Identyfikator timera zainicjowany przez funkcję timer_create() value Wskaźnik na strukturę do której skopiowany będzie wynik Kasowanie timera Timer kasuje się funkcją timer_delete(). int timer_delete(timer_t *timerid) timerid Identyfikator timera zainicjowany przez funkcję timer_create

Sygnały 9 Przykład: #include <stdlib.h> #include <unistd.h> #include <stdio.h> #include <signal.h> #include <time.h> #define CLOCKID CLOCK_REALTIME #define SIG SIGRTMIN #define errexit(msg) do{ perror(msg); exit(exit_failure); \ } while (0) static void handler(int sig, siginfo_t *si, void *uc) { printf("odebrano sygnal %d\n", sig); signal(sig, SIG_IGN); } int main(int argc, char *argv[]){ timer_t timerid; struct sigevent sev; struct itimerspec its; long long freq_nanosecs; sigset_t mask; struct sigaction sa; sa.sa_flags = SA_SIGINFO; sa.sa_sigaction = handler; sigemptyset(&sa.sa_mask); if (sigaction(sig, &sa, NULL) == -1) errexit("sigaction"); // Blokowanie sygnalu SIG printf("blokowanie sygnalu: %d\n", SIG); sigemptyset(&mask); sigaddset(&mask, SIG); if (sigprocmask(sig_setmask, &mask, NULL) == -1) errexit("sigprocmask"); /* Utworzenie timera */ sev.sigev_notify = SIGEV_SIGNAL; sev.sigev_signo = SIG; sev.sigev_value.sival_ptr = &timerid; if (timer_create(clockid, &sev, &timerid) == -1) errexit("timer_create"); printf("identyfik. timer jest %lx\n", (long) timerid); /* Start timera */

Sygnały 10 freq_nanosecs = atoll(argv[2]); its.it_value.tv_sec = freq_nanosecs / 1000000000; its.it_value.tv_nsec = freq_nanosecs % 1000000000; its.it_interval.tv_sec = its.it_value.tv_sec; its.it_interval.tv_nsec = its.it_value.tv_nsec; if (timer_settime(timerid, 0, &its, NULL) == -1) errexit("timer_settime"); /*Blokujemy proces; w międzyczasie timer może być wyzwolony wiele razy */ printf("zablokowanie procesu na %d sek\n", atoi(argv[1])); sleep(atoi(argv[1])); } // Odblokowanie sygnalu SIG i oczekiwanie printf("odblokowanie sygnalu %d\n", SIG); if (sigprocmask(sig_unblock, &mask, NULL) == -1) errexit("sigprocmask"); sleep(atoi(argv[1])); exit(exit_success);