Linux a czas rzeczywisty
Wprowadzenie do systemów RT: RTLinux: KURT Linux: Slajdy: |
UTIMEUTIME wprowadza kilka zasadniczych zmian do Linuksa, aby umożliwić wykonywanie aplikacji real-time. Przede wszystkim musi zapewnić możliwość generowania przerwań zegarowych częściej niż standardowo w Linuksie, gdyż wiele aplikacji rt wymaga dokładniejszego śledzenia czasu. W Linuksie czas pomiędzy kolejnymi przerwaniami zegarowymi wynosi 10 milisekund. UTIME zapewnia możliwość generowania przerwań nawet co 1 mikrosekundę. W Linuksie proces, który potrzebuje, aby dana funkcja została wykonana w danym momencie tworzy obiekt strukturytimer_list (plik include/linux/timer.h ) i dodaje go do listy timerów.
Pole Zegar systemowy jest niczym innym jak licznikiem kolejnych tyknięć zegara. Po każdym tyknięciu system uaktualnia licznik Jak zmienia to UTIME?Narzucającym się początkowo rozwiązaniem byłoby takie zaprogramowanie zegara systemowego, aby częściej zgłaszał przerwania do procesora, wtedy czas pomiędzy kolejnymi tyknięciami zmniejszyłby się. Oznaczałoby to jednak nadmierne wykorzystywanie i zegara i procesora, przerwania zgłaszane byłyby bardzo często niezależnie od tego, czy jakieś procesy potrzebują aktualnie aż tak dokładnego mierzenia czasu. Zauważmy jednak, że rzadko proces wymaga przerwań następujących w każdej mikrosekundzie. Nie potrzeba więc sprawdzać wszystkiego w każdej mikrosekundzie, wystarczy możliwość generowania przerwań w każdej mikrosekundzie. Jak więc dokładnie wygląda rozwiązanie? Do struktury timer dodano nowe pole usec. Oznacza ono dokładną mikrosekundę w danym "jiffy" kiedy ma zostać wykonana funkcja (a więc czas od początku liczenia czasu do wywołania funkcji w mikrosekundach wynosi Jest jednak pewien problem - niektóre podsystemy jądra zakładają, że licznik jiffies będzie regularnie uaktualniany, a tutaj może zdarzyć się tak, że w momencie, gdy licznik powinien być zwiększony, nie kończy się czas żadnego procesu. Aby wymusić regularne zwiększanie licznika, system podczas programowania czasu następnego przerwania sprawdza czy ma to nastąpić po spodziewanej kolejnej aktualizacji licznika. Jeśli tak, czas następnego przerwania ustawiany jest na moment potrzebnej aktualizacji, mimo że nie nastąpi wtedy żadne budzenie procesu. Pseudo-kod funkcji obsługi przerwania:
Pseudo-kod funkcji
|