Циклический руководитель
Циклический руководитель [1] [2] является альтернативой операционной системе реального времени . Это форма совместной многозадачности , при которой существует только одна задача . Единственная задача обычно реализуется как бесконечный цикл в main(), например, C. в
Основная схема заключается в циклическом выполнении повторяющейся последовательности действий с заданной частотой (циклический исполнительный механизм, запускаемый по времени). Например, рассмотрим пример встроенной системы , предназначенной для мониторинга датчика температуры и обновления ЖК- дисплея. Возможно, на ЖК-дисплее потребуется запись двадцать раз в секунду (т. е. каждые 50 мс). Если по другим причинам показания датчика температуры необходимо считывать каждые 100 мс, можно построить цикл следующего вида:
int main(void){ while (1) { // This loop is designed to take 100 ms, meaning // all steps add up to 100 ms. // Since this is demo code and we don't know how long // tempRead or lcdWrite take to execute, we assume // they take zero time. // As a result, the delays are responsible for the task scheduling / timing. // Read temp once per cycle (every 100 ms) currTemp = tempRead(); // Write to LCD twice per cycle (every 50 ms) lcdWrite(currTemp); delay(50); lcdWrite(currTemp); delay(50); // Now 100 ms (delay(50) + delay(50) + tempRead + lcdWrite + lcdWrite) // has passed so we repeat the cycle. }}
Внешний цикл длительностью 100 мс называется основным циклом. В этом случае также имеется внутренний малый цикл длительностью 50 мс. В этом первом примере внешние и внутренние циклы не очевидны. Мы можем использовать механизм счета, чтобы уточнить основные и второстепенные циклы.
int main(void){ unsigned int i = 0; while (1) { // This loop is designed to take 50 ms. // Since this is demo code and we don't know how long // tempRead or lcdWrite take to execute, we assume // they take zero time. // Since we only want tempRead to execute every 100ms, we use // an if statement to check whether a counter is odd or even, // and decide whether to execute tempRead. // Read temp every other cycle (every 100 ms) if ( (i%2) == 0) { currTemp = tempRead(); } // Write to LCD once per cycle (every 50 ms) lcdWrite(currTemp); delay(50); i++; // Now 50 ms has passed so we repeat the cycle. }}
См. также
[ редактировать ]- Arduino — популярный пример этой парадигмы
- Цикл событий
- Упреждение (вычисления)
Ссылки
[ редактировать ]- ^ Брюс Пауэлл Дуглас (2003). Шаблоны проектирования реального времени: надежная масштабируемая архитектура для систем реального времени . Addison-Wesley Longman Publishing Co., Inc., стр. 232–237. ISBN 0201699567 .
- ^ Лапланте, Филипп А.; Оваска, Сеппо Дж. (2012). Проектирование и анализ систем реального времени (4-е изд.). Хобокен, Нью-Джерси: John Wiley & Sons, Inc., стр. 84–85, 100–102. ISBN 978-0-470-76864-8 .