PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO

Podobne dokumenty
1. Tworzenie nowego projektu.

Mariusz Rudnicki PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO CZ.2

Driver interfejsu szeregowego dla systemu QNX Neutrino

Jedrzej Ułasiewicz Komputerowe systemy sterowania 1

PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO

Mariusz Rudnicki PROGRAMOWANIE WSPÓŁBIEŻNE I SYSTEMY CZASU RZECZYWISTEGO CZ.2

Pobieranie argumentów wiersza polecenia

PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO

Programowanie Systemów Czasu Rzeczywistego

Programowanie Proceduralne

PRZERWANIA. P1 - Procedura obslugi przerwania. Obsługa zdarzenia Z1 poprzez procedurę obsługi przerwania P1

1. Timery i zdarzenia

1. Timery i zdarzenia

1. Obsługa przerwań w systemie QNX6 Neutrino

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

QNX Neutrino (v 6.3)

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

Wskaźniki. Programowanie Proceduralne 1

Wykład 3: Implementacja programów wbudowanych

Uzupełnienie dot. przekazywania argumentów

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

Sieciowa komunikacja procesów - XDR i RPC

SUMA KONTROLNA (icmp_cksum) NUMER KOLEJNY (icmp_seq)

Wstęp do programowania 1

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

PRZERWANIA. 1. Obsługa zdarzeń, odpytywanie i przerwania Obsługa zdarzeń jest jedną z kluczowych funkcji w prawie każdym systemie czasu rzeczywistego.

Architektura Systemów Wbudowanych

Wstęp do Programowania, laboratorium 02

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

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

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

Wykład 1

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

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

wykład II uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - funkcje, tablice i wskaźniki wykład II dr Jarosław Mederski Spis

Co to jest sterta? Sterta (ang. heap) to obszar pamięci udostępniany przez system operacyjny wszystkim działającym programom (procesom).

Programowanie I C / C++ laboratorium 03 arytmetyka, operatory

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

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

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

Wstęp do programowania 1

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

PROGRAMOWANIE w C prolog

Aplikacja Sieciowa wątki po stronie klienta

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

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

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

Obliczenia równoległe i rozproszone w JAVIE. Michał Kozłowski 30 listopada 2003

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

WYKŁAD 8. Funkcje i algorytmy rekurencyjne Proste przykłady. Programy: c3_1.c..., c3_6.c. Tomasz Zieliński

Lab 8. Tablice liczbowe cd,. Operacje macierzowo-wektorowe, memcpy, memmove, memset. Wyrażenie warunkowe.

7. Szeregowanie procesów w systemie QNX6 Neutrino

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

Funkcja (podprogram) void

Wskaźniki. Informatyka

Tablice i struktury. czyli złożone typy danych. Programowanie Proceduralne 1

Zdalne wywołania procedur. Jarosław Kuchta Programowanie Współbieżne

Wstęp do programowania

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

Języki i metodyka programowania. Wprowadzenie do języka C

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

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

Zmienne, stałe i operatory

Argumenty wywołania programu, operacje na plikach

Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Wskaźniki w C. Anna Gogolińska

Język C zajęcia nr 5

Struktury czyli rekordy w C/C++

Język C++ zajęcia nr 2

Języki i paradygmaty programowania 1 studia stacjonarne 2018/19. Lab 9. Tablice liczbowe cd,. Operacje na tablicach o dwóch indeksach.

Microsoft IT Academy kurs programowania

Podział programu na moduły

CZAS 1. Układy pomiaru czasu w komputerze PC

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

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

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

Struktury. Przykład W8_1

2 Przygotował: mgr inż. Maciej Lasota

Obsługa wyjątków. Język C++ WW12

Struktura programu. Projekty złożone składają się zwykłe z różnych plików. Zawartość każdego pliku programista wyznacza zgodnie z jego przeznaczeniem.

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

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

1 Timery i zdarzenia

Czy procesor musi się grzać?

Dzisiejszy wykład. Klasa string. wersja prosta wersja ze zliczaniem odwołań. Wyjątki Specyfikator volatile Semafory

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

tablica: dane_liczbowe

5 Przygotował: mgr inż. Maciej Lasota

Informatyka. Wy-03 Dynamiczna alokacja pamięci, wyjątki. mgr inż. Krzysztof Kołodziejczyk

KURS C/C++ WYKŁAD 8. Deklaracja funkcji informuje komplilator jaką wartość funkcja będzie zwracała i jakiego typu są jej argumenty.

WYKŁAD 10. Zmienne o złożonej budowie Statyczne i dynamiczne struktury danych: lista, kolejka, stos, drzewo. Programy: c5_1.c, c5_2, c5_3, c5_4, c5_5

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

Jzyk C++ cz 3. Jarosław Gramacki Instytut Informatyki i Elektroniki ( $)*)+' *, - ( ' )*'.' '',*/ *, ','*0) 1 / ) %*+ 2'' 2" ( $%%) )'20 )*0) 1 / )

WYKŁAD 9. Algorytmy sortowania elementów zbioru (tablic) Programy: c4_1.c... c4_3.c. Tomasz Zieliński

// Potrzebne do memset oraz memcpy, czyli kopiowania bloków

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

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

Programowanie w modelu przesyłania komunikatów specyfikacja MPI. Krzysztof Banaś Obliczenia równoległe 1

Obsługa plików Procesy

Transkrypt:

PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO LABORATORIUM Temat: QNX Neutrino Interrupts Mariusz Rudnicki 2016

Wstęp W QNX Neutrino wszystkie przerwania sprzętowe przechwytywane są przez jądro systemu. Obsługę przerwania można zorganizować w dwojaki sposób: proces rejestruje funkcję obsługi przerwania ang. Interrupt Service Routine, która zostanie wywołana po wystąpieniu przerwania; proces żąda od jądra systemu powiadomienia o wystąpieniu przerwania. Wybór sposobu obsługi przerwania pociąga za sobą pewne konsekwencje z punktu widzenia systemu operacyjnego jak również innych procesów i wątków. Właściwości funkcji obsługi przerwania: rozmiar stosu, którym dysponuje procedura obsługi przerwania, jest ograniczony. Stąd nie powinna ona zawierać dużych tablic czy innych struktur danych. Bezpiecznie jest przyjąć, że dostępny rozmiar stosu wynosi około 200 bajtów. funkcja obsługi przerwań jest wykonywana asynchronicznie z wątkami należącymi do pewnego procesu i używa wspólnych z nimi danych. Wszystkie zmienne modyfikowane przez handler powinny być poprzedzone słowem kluczowym volatile a ich modyfikacja wewnątrz wątków zabezpieczona przez zablokowanie przerwań. Innym rozwiązaniem jest zastosowanie funkcji realizujących elementarne operacje arytmetyczne i bitowe w niepodzielny sposób. Nazwy tych funkcji zaczynają się od atomic_*.

funkcja obsługi przerwania jest wykonywana poza normalnym szeregowaniem, więc powinna być krótka, jak to tylko możliwe. Jeżeli wymagane jest wykonanie czasochłonnych czynności, to powinny być one wykonane w wątku, który zostanie odblokowany przez handlera. funkcja obsługi przerwania nie może wywoływać żadnych funkcji systemowych poza sporadycznymi wyjątkami. Porównanie ISR z powiadomieniem zdarzeniem rozmiar stosu, którym dysponuje procedura obsługi przerwania, jest ograniczony. Stąd nie powinna ona zawierać dużych tablic czy innych struktur danych. procedura obsługi przerwań jest wykonywana poza normalnym szeregowaniem, więc powinna być tak krótka, jak to tylko możliwe. Jeżeli wymagane jest wykonanie czasochłonnych czynności, to powinny być one wykonane w wątku, który zostanie przez handler odblokowany. odblokowany przez zdarzenie wątek ma priorytet i podlega zwykłemu szeregowaniu. uruchamianie wątków jest łatwiejsze niż handlerów. większa zwłoka pomiędzy przerwaniem a odblokowaniem wątku. w kodzie procedury obsługi przerwania należy wykonać tylko niezbędne czynności, a następnie powiadomić pewien wątek o wystąpieniu przerwania. Wątek ten wykona resztę pracy. Główne funkcje wiążące przerwanie ze zdarzeniem lub funkcję obsługi przerwania z danym przerwaniem sprzętowym.

Przygotowanie platformy i środowiska IDE Uruchom QNX Neutrino za pomocą maszyny wirtualnej. Sprawdź poleceniem pidin czy jest uruchomiony proces qconn. Jeśli nie ma go na liście pracujących procesów uruchom go poleceniem qconn #.Sprawdź adres IP poleceniem ifconfig. Następnie uruchom środowisko QNX Momentics IDE. Wybierz przestrzeń roboczą wskazaną przez prowadzącego. Zadanie 1. Przeanalizuj kod źródłowy poniższego programu int_timer. Odszukaj w nim fragmenty odpowiedzialne za obsługę przerwań. Wypisz odpowiednie funkcje w sprawozdaniu. /* int_timer.c This module demonstrates will contain code for handling an interrupt. To test is, simply run it. Note that you may have to do something to cause the interrupts to be generated (e.g. press a key if handling the keyboard interrupt). */ #include <errno.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/neutrino.h> #include <sys/syspage.h> char *progname = "int_timer"; struct sigevent int_event; // the event to wake up the thread const struct sigevent *hdlr( void *blah, int id ){ static int count = 0; if (++count > 1500 ){ count = 0; return &int_event; return NULL; main (int argc, char **argv) { int id; setvbuf (stdout, NULL, _IOLBF, 0); printf ("%s: starting...\n", progname); // request I/O privity ThreadCtl(_NTO_TCTL_IO, 0 ); // set up an event for the handler or the kernel to use to wake up // this thread. Use whatever type of event and event handling you want

SIGEV_INTR_INIT( &int_event ); // either register an interrupt handler or the event id = InterruptAttach(0, hdlr, NULL, 0, _NTO_INTR_FLAGS_TRK_MSK ); while (1) { // block here waiting for the event InterruptWait(0, NULL ); // if using a high frequency interrupt, don't print every interrupt printf ("%s: we got an event after 1500 timer ticks and unblocked\n", progname); Na podstawie powyższego kodu zmodyfikuj kod źródłowy projektu int_timer tak, aby mógł obsługiwać przerwania od timera systemowego. Po modyfikacjach uruchom program int_timer. Sprawdź w jakim stanie jest wątek oczekujący na przerwanie.

Zadanie 2. Przeanalizuj kod źródłowy poniższego programu int_kbd_event. Odszukaj w nim fragmenty odpowiedzialne za obsługę przerwań. Wypisz odpowiednie funkcje w sprawozdaniu. /* int_kbd_event.c This module demonstrates will contain code for handling an interrupt. To test is, simply run it. Note that you may have to do something to cause the interrupts to be generated (e.g. press a key if handling the keyboard interrupt). */ #include <errno.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/neutrino.h> #include <sys/syspage.h> char *progname = "int_kbd_event"; struct sigevent int_event; // the event to wake up the thread main (int argc, char **argv) { int id; int count = 0; setvbuf (stdout, NULL, _IOLBF, 0); printf ("%s: starting...\n", progname); // request I/O privity ThreadCtl(_NTO_TCTL_IO, 0 ); // set up an event for the handler or the kernel to use to wake up // this thread. Use whatever type of event and event handling you want SIGEV_INTR_INIT( &int_event ); // either register an interrupt handler or the event id = InterruptAttachEvent(1, &int_event, _NTO_INTR_FLAGS_TRK_MSK ); while (1) { // block here waiting for the event InterruptWait(0, NULL ); // if using a high frequency interrupt, don't print every interrupt InterruptUnmask( 1, id ); printf ("%s: we got a keyboard interrupt and unblocked (%d)\n", progname, count++); Na podstawie powyższego kodu zmodyfikuj kod źródłowy projektu int_kbd_event tak, aby mógł obsługiwać przerwania od klawiatury. Po modyfikacjach uruchom

program int_kbd_event. Sprawdź w jakim stanie jest wątek oczekujący na przerwanie. Podaj ile przerwań rejestrowanych jest podczas używania klawiatury. Skomentuj uzyskane wyniki.

Sprawozdanie. Grupa: