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ż