Cykliczny kierownik
Cykliczny zarządca jest alternatywą dla systemu operacyjnego czasu rzeczywistego . Jest to forma kooperacyjnego wielozadaniowości , w której jest tylko jedno zadanie . Jedyne zadanie jest zwykle realizowane jako nieskończona pętla w main(), np. w C .
Podstawowy schemat polega na przechodzeniu przez powtarzającą się sekwencję czynności z ustaloną częstotliwością (AKA cykliczne uruchamianie czasowe). Rozważmy na przykład system wbudowany przeznaczony do monitorowania czujnika temperatury i aktualizacji wyświetlacza LCD . Wyświetlacz LCD może wymagać zapisu dwadzieścia razy na sekundę (tj. co 50 ms). Jeśli czujnik temperatury musi być odczytywany co 100 ms z innych powodów, możemy skonstruować pętlę o następującym wyglądzie:
int main ( void ) { while ( 1 ) { // Ta pętla ma trwać 100 ms, co oznacza, że // wszystkie kroki sumują się do 100 ms. // Ponieważ jest to kod demonstracyjny i nie wiemy, jak długo trwa // wykonanie tempRead lub lcdWrite, zakładamy, // że zajmuje to zero czasu. // W rezultacie opóźnienia są odpowiedzialne za planowanie / synchronizację zadań. // Odczyt temperatury raz na cykl (co 100 ms) currTemp = tempRead (); // Zapis do LCD dwa razy na cykl (co 50 ms) lcdWrite ( currTemp ); opóźnienie ( 50 ); lcdWrite ( bieżąca temperatura ); opóźnienie ( 50 ); // Teraz 100 ms (delay(50) + delay(50) + tempRead + lcdWrite + lcdWrite) // minęło, więc powtarzamy cykl. } }
Zewnętrzny cykl 100 ms nazywany jest głównym cyklem. W tym przypadku występuje również wewnętrzny mniejszy cykl o długości 50 ms. W tym pierwszym przykładzie zewnętrzne i wewnętrzne cykle nie są oczywiste. Możemy użyć mechanizmu liczenia, aby wyjaśnić główne i mniejsze cykle.
0
0
int main ( pusty ) { bez znaku int i = ; while ( 1 ) { // Ta pętla ma trwać 50 ms. // Ponieważ jest to kod demonstracyjny i nie wiemy, jak długo trwa // wykonanie tempRead lub lcdWrite, zakładamy, // że zajmuje to zero czasu. // Ponieważ chcemy, aby tempRead był wykonywany co 100 ms, używamy // instrukcji if, aby sprawdzić, czy licznik jest nieparzysty czy parzysty, // i zdecydować, czy wykonać tempRead. // Odczyt temp. co drugi cykl (co 100 ms) if ( ( i % 2 ) == ) { currTemp = tempRead (); } // Zapis do LCD raz na cykl (co 50 ms) lcdWrite ( currTemp ); opóźnienie ( 50 ); ja ++ ; // Teraz minęło 50 ms, więc powtarzamy cykl. } }
Zobacz też
- Arduino - popularny przykład tego paradygmatu
- Pętla zdarzeń
- Wywłaszczanie (obliczenia)