SYSTEMY CZASU RZECZYWISTEGO
Transkrypt
SYSTEMY CZASU RZECZYWISTEGO
SYSTEMY CZASU RZECZYWISTEGO - VxWorks WZAJEMNE WYKLUCZANIE Wiele metod. Np. wyłączanie przerwań: funkcja() { // ... Int blokada = intLock(); // Obszar krytyczny, któremu nie możemy przerwać // … intUnlock(blokada); // … } … wyłączanie wywłaszczania: funkcja() { // … taskLock(); // Obszar krytyczny, który nie może być wywłaszczony // ... taskUnlok(); // … } Piotr Malecki 1//9 SYSTEMY CZASU RZECZYWISTEGO - VxWorks SEMAFORY VxWorks Binarne, wzajemnego wykluczania (mutex), całkowite (counting) Funkcje do ich obsługi: semBCreate() - tworzy i inicjalizuje semafor binarny semMCreate() - tworzy i incjalizuje semafor wzajemnego wykluczania semCCreate()` - tworzy i inicjalizuje semafor całkowity semDelete() - usuwa semafor semTake() - pobiera semafor semGive() - oddaje semafor semFlush - odblokowuje wszystkie zadania oczekujące na dany semafor #include „VxWorks.h” #include „semLib.h” // … SEM_ID semafor; // … // Utworzenie semafora zainicjowanie (dostępny), zadania w kolejce wstrzymanych // ustawione wg priorytetów semafor = semBCreate(SEM_Q_PRIORITY, SEM_FULL); // … Piotr Malecki 2//9 SYSTEMY CZASU RZECZYWISTEGO - VxWorks SEMAFORY VxWorks c.d. Przykład użycia semafora binarnego do wzajemnego wykluczania // … semTake(semafor, WAIT_FOREVER); // Obszar krytyczny – tylko jedno zadanie może być w posiadaniu semafora // Zadanie będzie czekało do skutku na semafor // … semGive(semafor); // … Semafory binarne bywają używane do synchronizacji zadań (zdarzeń), W takim przypadku zwykle kreuje się semafor od razu pusty. Zadanie, które chce oczekiwać na zdarzenie jest wstrzymane aż do zwolnienia semafora przez zdarzenie Piotr Malecki 3//9 SYSTEMY CZASU RZECZYWISTEGO - VxWorks SEMAFORY VxWorks c.d. #include „VxWorks.h” #include „semLib.h” // … SEM_ID semafor; // … // Utworzenie semafora i zainicjowanie (pusty), // … // zadanie_x będzie czekało na zdarzenie … zadanie_x (void) { // Wstrzymanie zadania w oczekiwaniu na zdarzenie semTake(semafor, WAIT_FOREVER); // … ) //Przykładowa procedura obsługi przerwania, reprezentująca „zdarzenie” procedura_obslugi_przerwania(void) { // … // Oddanie semafora, uwolnienie wstrzymanego zadania semGive(semafor); // … } Piotr Malecki 4//9 SYSTEMY CZASU RZECZYWISTEGO - VxWorks SEMAFORY VxWorks c.d. Semafory VxWorks posiadają opcje (nie ujęte w standardach POSIX), – przeterminowania – kolejek (FIFO lub priorytetowych) KOLEJKI KOMUNIKATÓW msgQCreate () msgQDelete {} msgQsend () msgQRceive () - utworzenie i zainicjowanie kolejki komunikatów usunięcie kolejki komunikatów wysłanie komunikatu do kolejki odebranie komunikatu z kolejki komunikatów Kreowanie definiuje liczbę maksymalną komunikatów i maksymalną długość komunikatu Jeśli żadne zadanie nie oczekuje na komunikat, to jest on dodawany do kolejki. Jeśli są zadania oczekujące na komunikat, to jest on dostarczony bezzwłocznie pierwszemu z nich Piotr Malecki 5//9 SYSTEMY CZASU RZECZYWISTEGO - VxWorks KOLEJKI KOMUNIKATÓW c.d. . Jeśli są zadania oczekujące na komunikat, to jest on dostarczony bezzwłocznie pierwszemu z nich. Jeśli komunikaty są w buforze, to pierwszy jest pobierany przez zadanie wywołujące. Jeśli nie ma komunikatu, to zadanie wywołujące jest blokowane i oddawane do kolejki zadań oczekujących na komunikaty. Kolejka zadań oczekujących na komunikaty może mieć kolejność wynikającą z priorytetów lub kolejność FIFO. (To określane jest na etapie tworzenia kolejki). Przeterminowanie Komunikaty pilne Piotr Malecki 6//9 SYSTEMY CZASU RZECZYWISTEGO - VxWorks KOLEJKI KOMUNIKATÓW c.d. Przykład użycia kolejek komunikatów #include „VxWorks.h” #include „msgQLib.h” // … #define MAX_MSGS (10) #define MAX_MSG_LEN (100) // … MSG_Q_ID kolejka_komunikatow; // … zadanie_2(void) { // … char bufor_komunikatów[MAX_MSG_LEN]; //Pobranie komunikatu z kolejki lub oczekiwanie na if(msgQReceive(kolejka_komunikatow, bufor_komunikatow, MAX_MSG_LEN, WAIT_FOREVER) == ERROR) return (ERROR); // … } Piotr Malecki 7//9 SYSTEMY CZASU RZECZYWISTEGO - VxWorks KOLEJKI KOMUNIKATÓW c.d. #define MESSAGE „Treść komunikatu” zadanie_1(void) { // … //Utworzenie kolejki komunikatów if((kolejka_komunikatow = msgQCreate(MAX_MSGS, MAX_MSG_LEN, MSG_Q_PRIORITY)) == ERROR) return (ERROR); //Wysyłanie komunikatu o zwykłym priorytecie lub czekanie na miejsce w kolejce if(msgQSend (kolejka_komunikatow, MESSAGE, sizeof(MESSAGE), WAIT_FOREVER, MSG_PRI_NORMAL) – ERROR) return(ERROR); // ... } Realizacja struktury klient – serwer POTOKI KOMUNIKACJA SIECIOWA SYGNAŁY .... (SZEREGOWANIE KARUZELOWE !!! ) Piotr Malecki 8//9 SYSTEMY CZASU RZECZYWISTEGO - VxWorks Piotr Malecki 9//9