KRÓTKO O HISTORII RT-LINUX STAN PRAWNY - NIEFORTUNNY PATENT INNE ROZWIĄZANIA ZGODNOŚĆ Z POSIX (1003.13 PSE51 (minimal realtime system profile) KLUCZOWE ELEMENTY KONCEPCJI RTL WIRTUALNY SYSTEM PRZERWAŃ ALGORYTM SZEREGOWANIA ZADAŃ MECHANIZMY KOMUNIKACJI MIĘDZY PROCESAMI POMIAR CZASU
RTLinux został zaprojektowany w Institute of Mining and Technology of New Mexico w ramach zajęć studenckich prof. Victora YODAIKENa przy współpracy Michaela Barabanova (1997) VxWorks, QNX, VME... Początkowe systemy czasu rzeczywistego były dosyć prymitywnymi systemami wykonawczymi, z ubogą biblioteką podprogramów. Obecnie aplikacje czasu rzeczywistego wymagają rutynowych dostępów do sieci (TCP/IP), grafiki komputerowej,systemu okien itp. usług non-real time. Rada: albo uzupełniać RT OS o te serwisy albo modyfikować jądro standardowego systemu tak by było wywłaszczalne W RTLinux przyjęto takie rozwiązanie, że małe jądro czasu rzeczywistego RTCore kontroluje pracę jądra Linuxa traktując je jako jedno ze swoich zadań o najniższym priorytecie.
WYDZIELENIE PRZETWARZANIA W CZASIE RZECZYWISTYM...
Wszystkie przerwania są przechwytywane przez jądro RTLinux, a przekazywane do obsługi przez Linux'a tylko wtedy, gdy nie wykonuje się żadne zadanie czasu rzeczywistego. RTLinux emuluje Interrupt control hardware (co m.in. minimalizuje zmiany systemu). Kiedy Linux wyłącza przerwania (ulubione zajęcie standardowych systemów operacyjnych) to jadro RTL zapamiętuje i porządkuje przerwania i przekazuje je do jądra Linuxa, gdy nie wykonuje się aktualnie zadanie RT i gdy jądro Linux'a odblokowuje przerwania. Technicznie: zamiast instrukcji cli, sti oraz iret funkcjonują makra: S_CLI, S_STI i S_IRET S_CLI: movl SFIF, $0 zamiast zerować znacznik IF opuszczamy wirtualną flagę ------------------------------------------------------------------------------------------------------------------------ S_STI: sti pushfl pushl $KERNEL_CS pushl $lf S_IRET To makro włącza przerwania, posyła na stos flagi procesora, adres segmentowy jądra i adres powrotu jak przygotowanie do obsługi przerwania.
Macro S_IRET odkłada na stos zawartości rejestrów (ds, eax, edx) ustawia rejestr segmentu danych na rejestr segmentu jądra, aby mieć dostęp do zmiennych globalnych (chodzenie po linie ), przegląda maskę bitową SFREQ w poszukiwaniu oczekujących przerwań. Prawdziwy powrót następuje, gdy już nie ma żadnego oczekującego przerwania. Ponieważ każde przerwanie kończy się przez S_IRET to gwarantuje, że wszystkie zostaną obsłużone. Zadania krytyczne użytkownika wykonywane są w przestrzeni adresowej jądra RTCore, szeregowane przez projektanta jak wiemy. Wszelkie błędy w nich mogą prowadzić do padnięcia systemu. Ale zyskujemy - na szybkim przełączaniu kontekstu (bez zmiany rejestru bazowego ) - na bezpośrednim dzieleniu danych bez komplikacji z komunikacją międzyprocesową Zadania mogą być wykonywane okresowo, zawieszane i budzone z poziomu systemu przerwań.
SCHEDULER jest modułem jądra RTCore. Można go zmieniać, napisać własny... znamy zasady POSIX... Przykład dwóch zadań okresowych: Zad. 1. : okres T1 = 50 ms, czas wykonania (worst case): 25 ms Zad. 2.: okres T2 = 100 ms, czas wykonania (worst case): 40 ms Każde powinno się zakończyć NIE PÓŹNIEJ niż wypada początek następnego okresu! Raczej klęska...
Lepiej Rate Monotonic Scheduling (RMS) krótszy okres zadania wyższy priorytet Znawcy wyliczają wykorzystanie procesora przez zadanie licząc C/T (dla zbioru zadań l liczy się wykorzystanie sumaryczne). Schedulable band ograniczenie szeregowalności. RMS ma to w ok 70%!!! Earliest Deadline First (EDL) to czasem stosowany (obecnie w RTL?) dynamiczny przydział priorytetów pozwala na osiągnięcie 100% schedulable band ale płaci się rachunkiem priorytetów.
No i są jeszcze zadania nieokresowe jak grom z jasnego nieba, asynchroniczne. Slot Shifting lub Stack Stealing - algorytmy próbujące wykorzystywać wolne cykle procesora. DOKŁADNY POMIAR CZASU INTEL 8253/8254 jest na pokładzie każdego PC. Jest programowalny i można generować okresowe lub jednokrotne przerwania po wybranym przedziale czasu. Jeśli RTL_CLOCK_MODE_ONESHOT to np. dla dwóch zadań okresowych o T1=A i T2=B generuje się wpierw przerwanie po A, przeprogramowuje czasomierz (co zabiera czas x) i generuje przerwanie następne po B-A-x tickach. x - dla jedno-procesorowych 80x86 jest dosyć długie więc wprowadzono możliwość wyboru trybu RTL_CLOCK_MODE_PERIODIC
Czekującego KOMUNIKACJA MIĘDZYPROCESOWA - Łącza RT-FIFO - pamięć dzielona Synchronizacja i wzajemne wykluczania - rodzina funkcji pthread_mutex Odwrócenie priorytetów - prymitywne - z procesem o średnim priorytecie PRIORITY INHERITANCE dziedziczenie priorytetów (zadanie o nisklim priorytecie dziedziczy priorytet oczekującego na zasób, jeśli on ma wyższy priorytet). To ma uniemożliwić wkadnięcia się procesu o pośrednim priorytecie. ALE! Możliwe zakleszczenie gdy zadanie dziedziczące zażąda innego zasobu będącego w posiadaniu właśnie oczekującego zadania z priorytetem, który został oddziedziczony! CEILING SEMAPHORE PROTOCOL zasób ma stowarzyszony semafor z pewną charaktrerystyczną liczbą (pułap). Zadanie otrzymując zasób ustawia priorytet równy pułapowi (tego zasobu) i utrzymuje go aż do zwolnienia zasobu.
STACK RESOURCE POLICY (SRP) Zadanie może się wykonywać jeśli jego priorytet jest najwyższy spośród zadań aktywnych (gotowych do wykonania) i gdy jego poziom wywłaszczania jest większy od pułapu systemowego. (Poziom wywłaszczania Pi = 1/ Di, gdzie Di jest terminem zakończenia zadania.) Według SRP zadanie wykonywane NIE zostanie zablokowane do momentu zakończenia o ile zadanie o wyższym priorytecie nie doprowadzi do jego wywłaszczenia.