
- •1.1. Роль вычислительной техники в управлении процессами
- •1.5. Руководство для читателя
- •Глава 8 посвящена архитектуре системных шин; наибольшее внимание уделено стандарту vme.
- •Процессы реального времени. Методы программирования. Задачи цифрового управления
- •2.1.1. Пример — пресс для пластика
- •2.1.2. Управление на основе последовательного программирования
- •2.1.3. Управление на основе прерываний
- •2.2. Примеры задач управления процессами
- •2.2.1. Управление последовательностью событий и бинарное управление
- •2.2.2. Простой контур управления — регулятор температуры
- •2.2.3. Генерация опорного значения
- •2.2.4. Системы, содержащие несколько контуров управления.
- •2.2.5. Взаимосвязанные системы
- •2.2.6. Критичные по времени процессы
- •2.2.7. Свойства процессов, усложняющие управление
- •2.3. Особенности систем цифрового управления
- •2.4.2 Модельный пример 2 – биологическая очистка сточных вод (процесс активированного отстоя)
- •2.5. Заключение
- •3. Описание и моделирование систем
- •3.1.2. Масштаб времени динамических моделей
- •3. 1.3. Моделирование динамических систем
- •3.1.4. Моделирование дискретных событий
- •3.2. Основы моделирования динамических систем
- •3.2.1. Механические системы
- •3.2.2. Электромагнитные цепи
- •Пример 3.4
- •7.4. Функциональные карты
- •7.4.1. Синтаксис функциональных карт
- •4 2. Реализация функциональных карт
- •7.4.3. Применение функциональных карт в промышленном управлении
- •7.5. Заключение
- •10.6. Методы программирования в реальном времени
- •10.6.1. Что такое программа реального времени?
- •10.6.2. Среда программирования
- •10.6.3. Структура программы реального времени
- •10.6.4. Обработка прерываний и исключений
- •10.6.5. Программирование операций ожидания
- •10.6.6. Внутренние подпрограммы операционной системы
- •10.6.7. Приоритеты процессов и производительность системы
- •10.7. Языки программирования и операционные системы реального времени
- •10.7.1. Требования к языкам и операционным системам реального времени
10.6.3. Структура программы реального времени
Разработка программы реального времени начинается с анализа и описания зада чи. Функции системы делятся на простые части, с каждой из которых связывается программный модуль.
Например, задачи для управления движением манипулятора робота (Ра3' дел 2.2.3) можно организовать следующим образом:
считать с диска описание траекторий;
рассчитать следующее положение манипулятора (опорное значение);
считать с помощью датчиков текущее положение;
вычислить необходимый сигнал управления;
выполнить управляющее действие;
проверить, что опорное значение и текущее положение совпадают в пределах заданной точности;
получить данные от оператора;
остановить робота в случае нештатной ситуации (например сигнал прерывания от аварийной кнопки).
Другой пример приведен в разделе 2.1. Пресс для производства пластмассовых изделий контролируется двумя программами, управляемыми по прерыванию. При анализе стало ясно, что решение, основанное на применении только одной программы, неприемлемо.
Принципиальной особенностью программ реального времени является постоянная готовность и отсутствие условий нормального, а не аварийного завершения. Если программа не исполняется и не обрабатывает данные, она остается в режиме ожидания прерывания/события или истечения некоторого интервала времени. Программы реального времени — это последовательный код, исполняющийся в бесконечном цикле. В каком-то месте программы есть оператор, приостанавливающий исполнение до наступления внешнего события или истечения интервала времени. Обычно программа структурируется таким образом, что оператор end никогда не достигается
while true do (* бесконечный цикл *) begin (* процедура обработки *)
wait event at #2,28 (* внешнее прерывание *)
(* код обработки *)
end; (* процедура обработки *) end. (* выход из программы; никогда не достигается *)
При разработке каждого программного модуля должны быть четко выделены области, в которых происходит обращение к защищенным ресурсам, — критические секции. Вход и выход из этих областей координируется каким-либо методом синхронизации или межпрограммных коммуникаций, например с помощью семафоров.
В общем случае, если процесс находится в критической секции, можно считать, что данные, с которыми он работает, не изменяются каким-либо другим процессом. Прерывание исполнения процесса не должно оказывать влияния на защищенные ресурсы. Это снижает риск системных ошибок.
Аналогичные предосторожности необходимо соблюдать и для потоков, порождаемых как дочерние процессы главного процесса. Разные потоки могут использовать общие переменные породившего их процесса, и поэтому программист должен решить, защищать эти переменные или нет.
Для гарантии живучести программы нештатные ситуации, которые могут блокироваать или аварийно завершить процесс, должны своевременно распознаваться и исправляться — если это возможно — в рамках самой программы. В системах реального времени различные процессы могут обращаться к общим подпрограммам. При простейшем решении эти подпрограммы связываются с соответствующими модулями после компиляции. При этом в памяти хранится несколько копий одной подпрограммы.
При другом подходе в память загружается лишь одна копия подпрограммы доступ к ней возможен из разных программ. Такие подпрограммы должны быть повторно входимыми — реентерабельными (reentrant), т. е. допускать многократные вызовы и приостановку исполнения, которые не влияют друг на друга. Эти преград мы должны использовать только регистры процессора или память вызывающих про цессов, т. е. не иметь локальных переменных. В результате реентерабельный модуль разделяемый несколькими процессами, можно прервать в любое время и продолжить с другой точки программы, поскольку он работает со стеком вызвавшего его процесса. Таким образом, реентерабельная процедура может оказаться одновременно в контексте нескольких различных процессов.
Эффективность исполнения является одним из наиболее важных параметров систем реального времени. Процессы должны выполняться быстро, и часто приходится искать компромисс между ясностью и структурированностью программы и ее быстродействием. Жизненный опыт показывает, что если для достижения цели нужно чем-то пожертвовать, то это обычно делается. Не всегда возникает противоречие между структурностью и эффективностью, но если первое должно быть принесено в жертву второму, необходимо полностью документировать все принятые решения, иначе существенно осложняется дальнейшее сопровождение программы.