RTOS - Armata na muchę.¶
W wielu projektach niepotrzebnie dodaje się RTOS niepotrzebnie komplikując projekt i wydłużając czas opracowania oprogramowania nie wspominając o wydłużonym czasie testowania. Równocześnie rośnie złożoność i wielkość oprogramowania nie wspominając o wzroście zapotrzebowanie na pamięć programu FLASH i danych RAM. Zacznijmy od prostej analizy kiedy na pewno będziemy musieli użyć RTOS-a. Będą to systemy klasy safety połączone z oprogramowaniem non safety. Będziemy musieli je od siebie izolować, choć i to można dokonać bez systemu czasu rzeczywistego. Niewątpliwie będą to urządzenia realizujące wiele połączeń równocześnie oparte np. na stosie TCPIP. Będą to również urządzenia w których zadania muszą być obsługiwane w bardzo ścisłym reżymie czasowym. Przy sterowaniu urządzeń w czasie rzeczywistym.
Jednak większość aplikacji nie wymaga RTOS-a. Nawet te dla czasu rzeczywistego. Chciałbym przedstawić „packę na muchy” w miejsce używanej „armaty”. Dla tych którym wystarcza prosty szybki i zajmujący bardzo mało miejsca scheduler typu periodic tasks dla zadań wywoływanych okresowo. Chcę przedstawić rozwiązanie, które chyba częściej wykorzystuję niż RTOS.
Jego podstawowe zalety to:
lekki;
szybki;
bardzo prosty;
brak wywłaszczeń ułatwia debugowanie kodu;
Ma również wady:
jego czasy są ustalane w tak zwanym CT (Compile Time) i nie da się ich zmienić w czasie RT (Run Time);
taski wywoływane przez niego muszą być typu maszyna stanowa lub funkcja lecz bez możliwości użycia dealy lub oczekiwania na zdarzenie;
nie wywłaszcza co w wielu przypadkach może być wadą;
Rozwiązanie jest bardzo proste. funkcję ShedulerPeriodic() wpinamy w przerwanie zegara i uruchamiamy zegar. Akurat przykład był używany z tickiem systemowym 10ms. Jeśli dla kogoś jest to zbyt długi czas reakcji może dać czas np 1ms i skorygować stałe kroku dla poszczególnych czasów. Taski wywoływane cyklicznie dodajemy do odpowiednich definicji tasków w pliku scheduler.h w przykładzie mamy do dyspozycji
Task10Ms
Task20Ms
Task50Ms
Task100Ms
Task200Ms
Task500Ms
Task1s
Task2s
Task5s
Task10s
Task20s
W niektóre makra były wpięte funkcje wywoływane okresowo co widać w kodzie pliku .h.
Kod został tak skonstruowany, iż dopiero zdefiniowanie zadań dla danego czasookresu powoduje, iż zostaje wkompilowany odpowiedni kawałek kodu.
Kod rozwiązania: