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

Podobne dokumenty