Из Википедии, свободной энциклопедии
Перейти к навигации Перейти к поиску

Циклическая исполнительный [1] [2] является альтернативой к операционной системе реального времени . Это форма совместной многозадачности , в которой есть только одна задача . Единственная задача , как правило , реализуются в виде бесконечной петли в главном (), например , в C .

Основная схема состоит в циклическом прохождении повторяющейся последовательности действий с заданной частотой (также известное как циклический исполнительный механизм, запускаемый по времени). Например, рассмотрим пример встроенной системы, предназначенной для мониторинга датчика температуры и обновления ЖК- дисплея. На ЖК-дисплее может потребоваться запись двадцать раз в секунду (т. Е. Каждые 50 мс). Если датчик температуры должен считываться каждые 100 мс по другим причинам, мы могли бы построить цикл следующего вида:

int  main ( void ) {  while  ( 1 )  {  // Этот цикл рассчитан на 100 мс, то есть  // все шаги в сумме составляют 100 мс.  // Поскольку это демонстрационный код, и мы не знаем, сколько времени  // требуется на выполнение tempRead или lcdWrite, мы предполагаем,  // что они занимают нулевое время.  // В результате задержки отвечают за планирование / время выполнения задачи. // Считываем температуру один раз за цикл (каждые 100 мс)  currTemp  =  tempRead (); // Запись на ЖК-дисплей дважды за цикл (каждые 50 мс)  lcdWrite ( currTemp );  задержка ( 50 );  lcdWrite ( currTemp );  задержка ( 50 ); // Теперь 100 мс (delay (50) + delay (50) + tempRead + lcdWrite + lcdWrite)  // прошло, поэтому мы повторяем цикл.  } }

Внешний цикл 100 мс называется основным циклом. В этом случае также имеется внутренний второстепенный цикл продолжительностью 50 мс. В этом первом примере сравнение внешнего и внутреннего циклов неочевидно. Мы можем использовать счетный механизм, чтобы уточнить основные и второстепенные циклы.

int  main ( void ) {  беззнаковый  int  я  ==  0 ;  while  ( 1 )  {  // Этот цикл рассчитан на 50 мс.  // Поскольку это демонстрационный код, и мы не знаем, сколько времени  // требуется на выполнение tempRead или lcdWrite, мы предполагаем,  // что они занимают нулевое время.  // Поскольку мы хотим, чтобы tempRead выполнялся каждые 100 мсек, мы используем  // оператор if, чтобы проверить, является ли счетчик четным или  // нечетным, и решить, выполнять ли tempRead. // Считываем температуру каждый второй цикл (каждые 100 мс)  if  (  ( i % 2 )  ==  0 )  {  currTemp  =  tempRead ();  } // Запись на ЖК-дисплей один раз за цикл (каждые 50 мс)  lcdWrite ( currTemp );  задержка ( 50 ); i ++ ;  // Теперь прошло 50 мс, поэтому повторяем цикл.  } }

См. Также [ править ]

Ссылки [ править ]

  1. ^ Брюс Пауэлл Дуглас (2003). Шаблоны проектирования в реальном времени: надежная масштабируемая архитектура для систем реального времени . Эддисон-Уэсли Лонгман Паблишинг Ко., Инк., Стр. 232–237. ISBN 0201699567.
  2. ^ Лапланте, Филипп А .; Оваска, Сеппо Дж. (2012). Проектирование и анализ систем в реальном времени (4-е изд.). Хобокен, Нью-Джерси: John Wiley & Sons, Inc., стр. 84–85, 100–102. ISBN 978-0-470-76864-8.