- •2. Ядра и операционные системы реального времени
- •2.1. Задачи, процессы, потоки
- •2.2. Основные свойства задач
- •2.3. Планирование задач
- •2.4. Синхронизация задач
- •2.5. Тестирование
- •2.6. Можно ли обойтись без ОС РВ?
- •3. Обзор некоторых операционных систем реального времени
- •3.1. Linux реального времени
- •3.2. Операционные системы реального времени и Windows
- •3.3. Операционная система QNX
- •3.4. Проект Neutrino
- •4.1. Организация промышленных систем
- •4.2. Аппаратная архитектура
- •4.3. Стандарты шин
- •4.4. Технологии VME и PCI
- •4.5. Мезонинные технологии
- •4.6. Полевые системы
- •4.7. Программное обеспечение промышленных систем
- •4.8. Управление производством
- •Часть 2. ПРОЕКТИРОВАНИЕ СРВ
- •5. UML проектирование систем реального времени
- •5.1. Объектно-ориентированные методы и UML
- •5.2. Метод и нотация
- •5.3. Системы и приложения реального времени
- •6. Обзор нотации UML
- •6.1. Диаграммы UML
- •6.2. Диаграммы прецедентов
- •6.3. Нотация UML для классов и объектов
- •6.4. Диаграммы классов
- •6.5. Диаграммы взаимодействия
- •6.6. Диаграммы состояний
- •6.7. Пакеты
- •6.8. Диаграммы параллельной кооперации
- •6.9. Диаграммы развертывания
- •6.10. Механизмы расширения UML
- •7.1. Среды для параллельной обработки
- •7.2. Поддержка исполнения в мультипрограммной и мультипроцессорной средах
- •7.3. Планирование задач
- •7.4. Вопросы ввода/вывода в операционной системе
- •7.6. Технология World Wide Web
- •7.7. Сервисы распределенных операционных систем
- •7.8. ПО промежуточного слоя
- •7.9. Стандарт CORBA
- •7.10. Другие компонентные технологии
- •7.11. Системы обработки транзакций
- •8. Разбиение на задачи
- •8.1. Вопросы разбиения на параллельные задачи
- •8.2. Категории критериев разбиения на задачи
- •8.3. Критерии выделения задач ввода/вывода
- •8.4. Критерии выделения внутренних задач
- •8.5. Критерии назначения приоритетов задачам
- •8.6. Критерии группировки задач
- •8.7. Пересмотр проекта путем инверсии задач
- •8.8. Разработка архитектуры задач
- •8.9. Коммуникации между задачами и синхронизация
- •8.10. Спецификация поведения задачи
- •9. Проектирование классов
- •9.1. Проектирование классов, скрывающих информацию
- •9.2. Проектирование операций классов
- •9.3. Классы абстрагирования данных
- •9.4. Классы интерфейса устройства
- •9.5. Классы, зависящие от состояния
- •9.6. Классы, скрывающие алгоритмы
- •9.7. Классы интерфейса пользователя
- •9.10. Внутренние программные классы
- •9.11. Применение наследования при проектировании
- •9.12. Примеры наследования
- •9.13. Спецификация интерфейса класса
- •10. Детальное проектирование ПО
- •10.1. Проектирование составных задач
- •10.2. Синхронизация доступа к классам
- •10.4. Логика упорядочения событий
- •11.1. Теория планирования в реальном времени
- •11.2. Развитие теории планирования в реальном времени
- •11.5. Пример анализа производительности с помощью анализа последовательности событий
- •11.6. Пример анализа производительности с применением теории планирования в реальном времени
- •11.8. Пересмотр проекта
- •11.9. Оценка и измерение параметров производительности
- •12. ЗАКЛЮЧЕНИЕ
- •СПИСОК ЛИТЕРАТУРЫ
СИСТЕМЫ РЕАЛЬНОГО ВРЕМЕНИ |
29 |
батарейной поддержкой и многофункциональный таймер (а то и не- сколько) с разрешением до единиц микросекунд.
Как правило, в ОС РВ задается эталонный интервал (квант) вре- мени, который иногда называют тиком (Tick) и который используется в качестве базовой единицы измерения времени. Размерность этой единицы для разных ОС РВ может быть разной, как, впрочем, раз- ными могут быть набор функций и механизмы взаимодействия с тай- мером. Функции по работе с таймером используют для приостановки выполнения задачи на какое-то время, для запуска задачи в опреде- ленное время, для относительной синхронизации нескольких задач по времени и т.п. Если в программе для ОС РВ вы увидите операнд delay (50), то, скорее всего, это обозначает, что в этом месте задача должна прерваться (блокироваться), а через 50 мс возобновить свое выполне- ние, а точнее, перейти в состояние готовности. Все это время процес- сор не простаивает, а решает другие задачи, если таковые имеются. Множество задач одновременно могут запросить сервис таймера, по- этому если для каждого такого запроса используется элемент в таб- лице временных интервалов, то накладные расходы системы по обра-
ботке прерываний от аппаратного таймера растут пропорционально размерности этой таблицы и могут стать недопустимыми. Для реше-
ния этой проблемы можно вместо таблицы использовать связный список и алгоритм так называемого дифференциального таймера, ко- гда во время каждого тика уменьшается только один счетчик интер- вала времени.
Для точной синхронизации таймера вычислительной системы с астрономическим временем могут применяться специальные часы с подстройкой по радиосигналам точного времени или навигационные приемники GPS, которые позволяют воспользоваться атомными ча- сами на борту орбитальных космических аппаратов, запущенных по программе Navstar.
2.5. Тестирование
Прежде чем устанавливать вашу систему реального времени на нe менее реальном объекте, рекомендуется проверить ее работоспо- собность с помощью интенсивных тестов. Это особенно важно для сложных динамических систем. Во время такого тестирования жела- тельно смоделировать наиболее неприятные и «тяжелые» режимы ра- боты, аварийные ситуации и т.п. При умозрительном анализе про-
www.pdffactory.com
СИСТЕМЫ РЕАЛЬНОГО ВРЕМЕНИ |
30 |
стых систем следует осторожно относиться к рекламной информации разработчиков ОС РВ, которые из коммерческих соображений пока- зывают, как правило, параметры для «лучшего случая». Например, если речь идет о максимальном времени обработки прерывания, не- обходимо в первую очередь понять, а что, собственно, подразумева- ется под этим временем:
а) время от возникновения запроса на прерывание до передачи управления по вектору прерывания;
б) или включая время сохранения контекста текущей задачи и передачи управления подпрограмме обработки прерывания;
в) или дополнительно к этому еще и время до завершения под-
программы обработки прерывания и передачи сообщения связанной с прерыванием задаче;
г) или дополнительно к этому время до момента, когда эта зада- ча наконец получит управление (в предположении, что она является наиболее приоритетной) и начнет реальную обработку события.
Безотносительно к тому, какой вариант рассматривается, необ- ходимо помнить, что если наряду с разработанными вами програм- мами используется программное обеспечение третьих фирм, вы не застрахованы от того, что там не встретятся участки кода, где преры- вания запрещены;
1)практически любая ОС РВ имеет в своих недрах участки та- кого кода. Нам остается только надеяться, что разработчики ОС ста- рались делать их как можно меньше;
2)всё ядро ОС РВ или его участки могут быть «невытесняемы-
ми»;
3) интеллектуальные контроллеры ввода/вывода типа SCSI мо- гут инициировать в системе различные служебные операции, которые способны отразиться на ее характеристиках;
4) многое зависит от применяемой системы кэширования. По- этому, если ваше событие произошло в «неподходящее» время, ре- альные показатели быстродействия могут сильно отличаться от рек- ламируемых.
2.6. Можно ли обойтись без ОС РВ?
Как любую вычислительную систему можно создать только из элементов 2И-НЕ, так и все что может делать ОС РВ, реализуемо и
www.pdffactory.com
СИСТЕМЫ РЕАЛЬНОГО ВРЕМЕНИ |
31 |
без нее. Тем не менее, все-таки попробуем разобраться, когда ОС РВ реально нужна, а когда нет.
Предположим, нам надо не реже 10 раз в секунду опросить три переключателя и в зависимости от их положения включить или вы- ключить соответствующий насос. Программа может выглядеть сле- дующим образом:
void main (void)
{
int i; for(;;)
{
for (i=0; i<3; i++)
{
if (switch_was_changed(i)) change_Pump(i);
}
}
}
Заметим, что никаких проверок по времени не производится, так как даже самые медленные процессоры могут сканировать переклю- чатели чаще 10 раз в секунду. Программа адекватна поставленной за- даче.
Если требуется опрашивать переключатели ровно 10 раз в се- кунду, программа может быть изменена:
for(;;)
{
if(100msec_passed)
{
for (i=0;i<3;i++)
{
if (switch_was_changed(i) change_Pump(i);
}
100msec_passed=0;
}
www.pdffactory.com
СИСТЕМЫ РЕАЛЬНОГО ВРЕМЕНИ |
32 |
}
Глобальная переменная 100msec_passed устанавливается в «1» каждые 100мс с помощью подпрограммы обработки прерываний от таймера. Теперь допустим, что нам дополнительно нужно каждые 200 мс измерять давление и открывать вентиль, если давление больше 20 атм. Если при открытом вентиле деление падает ниже 15 атм, вентиль необходимо закрыть. Для выполнения этой задачи в тело цикла мо- жет быть добавлен следующий фрагмент:
if (200msec_passed)
{
switch (valve.status)
{
case CLOSED:
if (pressure_value()>20)
{
open_valve(); valve_status=OPEN;
}
case OPEN: if(pressure_value()<15)
{
close_valve(); valve_status=CLOSED;
}
}
200msec_passed-0;
}
Глобальная переменная 200msec_passed устанавливается в 1 ка- ждые 200 мс. Так как тело цикла for (;;) стало большим, удобно выне- сти функции в отдельные подпрограммы и переписать основную про- грамму следующим образом:
for(;;)
{
process_pump_switches();
www.pdffactory.com
СИСТЕМЫ РЕАЛЬНОГО ВРЕМЕНИ |
33 |
process_pressure_regulation();
}
По мере того как добавляются новые «задачи», их можно оформлять отдельными подпрограммами и включать соответствую- щие вызовы в тело главной программы. Однако по мере добавления новых функций время выполнения основного цикла увеличивается, в результате чего может наступить момент, когда требование о скани- ровании переключателей 10 раз в секунду перестанет выполняться.
Давайте еще немного усложним задачу. Пусть система должна отображать тренды на основе пакетов данных, получаемых через бы- стродействующий последовательный порт. В этом случае основная
программа может выглядеть как
for(;;)
{
process_pump_switches(); process_pressure_regulation(); show_trend();
}
Если функция show_trend вызывается с запаздыванием, то пакет данных может быть потерян. Решением этой проблемы может быть вынос коммуникационных функций из show_trend и организация оче- реди, куда при обработке прерываний последовательного порта по-
мещается очередной заполненный пакет для последующей обработки с помощью show_trend.
Приведенный здесь пример иллюстрирует циклический (round) механизм выполнения задач, вполне подходящий для многих приме- нений. Однако этот же пример показывает, что по мере роста числа и сложности функций, которые необходимо выполнять, наличие стан- дартных средств организации параллельного выполнения задач, рабо- ты с таймером, межзадачного обмена информацией и т. п. могут су- щественно повысить производительность программистов и умень- шить число ошибок. Именно здесь могут проявить свои положитель- ные стороны ядра и операционные системы реального времени, как раз такие средства и предлагающие.
www.pdffactory.com
СИСТЕМЫ РЕАЛЬНОГО ВРЕМЕНИ |
34 |
В общем случае решение о применении какого-либо коммерче- ского ПО реального времени зависит от множества факторов. В том числе и от таких, как время, отпущенное на разработку, наличие и квалификация специалистов, объемы финансирования проекта и т. п.
www.pdffactory.com