logo
ОСНОВЫ АСУ ТП

10.6.5. Программирование операций ожидания

Процесс реального времени может явным образом ждать истечения некотор0го интервала (относительное время) или наступления заданного момента (абсолютн время). Соответствующие функции обычно имеют следующий формат:

wait (п)

и

wait until (время)

где п — интервал в секундах или миллисекундах, а переменная "время" имеет формат часы, минуты, секунды, миллисекунды

Когда выполняется одна из этих функций, операционная система помещает про­цесс в очередь ожидания. После истечения/наступления заданного времени процесс переводится в очередь готовых процессов.

Распространенный, но не лучший метод организации временной задержки -цикл, контроль системного времени в цикле занятого ожидания

repeat (* холостой ход *) until (time = 12:00:00);

Как правило, подобные активные циклы ожидания представляют собой бесполез­ную трату процессорного времени, и их следует избегать. Однако имеются исключе­ния. В системе, где аналого-цифровое преобразование занимает 20 мкс, а операция переключения процессов — 10 мкс, более экономно организовать ожидание на 20 мкс перед тем, как считать новые данные, чем начинать процедуру переключения процес­сов, неявно подразумеваемую "хорошей" операцией ожидания. Каждый случай тре­бует индивидуального подхода — для этого обычно нужно хорошее знание системы и развитое чутье.

Важной особенностью процессов, запускаемых периодически, — например, филь­трация и алгоритмы регулирования, — является накопленная ошибка времени. Это связано с тем, что процесс из очереди ожидания события опять попадает в очередь, но уже готовых процессов и должен ждать некоторый случайный интервал времени прежде, чем получит управление (рис. 10.9 а). Требуемое и фактическое время про­буждения процесса не совпадают. Ошибки ожидания накапливаются, если это время рассчитывается так

новое время пробуждения = время начала ожидания + интервал

По такому алгоритму работает холостой цикл "ждать 10 секунд". Накопленная временная ошибка представляет собой сумму времени, проведенного в очереди, и времени, необходимого для непосредственного исполнения. Правильное решение получается, если отсчет ведется от момента предыдущего пробуждения

новое время пробуждения = время предыдущего пробуждения + интервал

Таким образом, относительное время преобразуется в абсолютное. На практике не­обходимы две команды

wait until (ref_time);

ref time := ref time +10 seconds;