Циклическая исполнительный [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 мс, поэтому повторяем цикл. } }
См. Также [ править ]
- Arduino - популярный пример этой парадигмы
- Цикл событий
- Вытеснение (вычисление)
Ссылки [ править ]
- ^ Брюс Пауэлл Дуглас (2003). Шаблоны проектирования в реальном времени: надежная масштабируемая архитектура для систем реального времени . Эддисон-Уэсли Лонгман Паблишинг Ко., Инк., Стр. 232–237. ISBN 0201699567.
- ^ Лапланте, Филипп А .; Оваска, Сеппо Дж. (2012). Проектирование и анализ систем в реальном времени (4-е изд.). Хобокен, Нью-Джерси: John Wiley & Sons, Inc., стр. 84–85, 100–102. ISBN 978-0-470-76864-8.