Главная Пресс-центр Статьи и публикации Linux реального времени, "Открытые системы", N 9, 1999

Linux реального времени, "Открытые системы", N 9, 1999

Черемисин А. Е., Кобызев О. ЗАО «РТСофт», Москва

До недавнего времени для решения задач автоматизации в основном использовались операционные системы (ОС) реального времени (РВ). Это компактные системы, основанные на микроядерной архитектуре, такие так VxWorks, OS-9, PSOS, QNX, LynxOS. Эти системы обладают быстрым временем реакции на события и прерывания, компактностью кода, хорошей встраиваемостью и другими преимуществами, характерными для операционных систем с микроядерной архитектурой. В тоже время данный класс ОС содержит в себе и ряд спорных недостатков. Наиболее существенный из них тот, что практически в каждой ОС данного класса используется свой API-интерфейс для доступа к ядру системы и устройствам ввода/вывода. И хотя все производители ОС РВ объявляют о поддержке стандартов POSIX, полной POSIX-реализации нет ни в одной из систем. Другими словами, разработчик часто должен полностью переучиваться при переходе с одной операционной системы реального времени на другую, что бывает вызвано, например, сменой оборудования и часто приводит к большим затратам на обучение.

Далеко не все ОС РВ дешевы ведь надо платить за среду разработки, дополнительное программное обеспечение (ПО), драйверы и каждую лицензию в отдельности, что часто выливается в круглую сумму. Конечно, без ОС РВ пока нельзя обойтись во многих применениях, и они оправдывают себя в высоко технологичных проектах (тренажеры, уникальное оборудование) или при массовом количестве поставок (сотовые телефоны, анализаторы). В то же время существуют задачи, для решения которых требуется поддержка реального времени (РВ), но при этом затраты на разработку в таких проектах никогда не окупятся.

Куда пойти? Куда податься?

Мечта любого разработчика иметь систему на все случаи. Чтобы и управляла, и печатала, и … Но многоцелевые ОС, такие как WindowsNT и UNIX, не предназначены для задача реального времени и часто с ними не справляются.

Приведём типичный пример. Программист перенес свою программу из DOS в UNIX. Программа должна сохранять информацию, снятую с видеокамеры, на диске и управлять поведением камеры. Под DOS все шло гладко, но при переходе на UNIX появились задержки в передаче управляющих сигналов на камеру. После анализа ситуации выяснилось, что задачи пользователя простаивают из-за процесса «sync», который синхронизирует кеш файловой системы с диском. Отключение свопинга и установка наивысших приоритетов результатов не дала.

Так как же быть разработчику? Закупать ОС РВ? Или всё же есть способ добиться предсказуемости и компактности от традиционных ОС?

Смесь бульдога с носорогом

В настоящее время происходит слияние OC многоцелевого назначения и ОСРВ. На программном рынке начали появляться продукты поддержки реального времени, встроенные в привычные операционные системы. Этот класс продуктов заметно выгоднее для пользователя и программиста, т.к. сочетает в себе привычный интерфейс, средства разработки и API-интерфейс реального времени. Пока еще нельзя сказать, что эти разработки полностью заменят собой традиционные системы реального времени. У традиционных ОСРВ есть большое преимущество встраиваемость и компактность. Но и на этом рынке происходят изменения: фирма Microsoft выпустила продукт NTE (WindowsNT Embedded), при использовании которого можно ужать WindowsNT до 8-10 Мбайт. Под эту ОС есть и продукты реального времени, такие как RTX. А что же UNIX? Традиционно в приложениях многих ОСРВ используются подмножества API-интерфейсов UNIX, что сближает эти ОС с UNIX. Существуют также полнофункциональные ОС UNIX реального времени, например HP-UX.

Это сладкое слово Linux

Бурный рост популярности Linux побуждает разработчиков и программистов присмотреться поближе к этой операционной системе. У Linux есть много достоинств. Это открытость кода, большое количество сопутствующего программного обеспечения, в основном пока ориентированного на серверные применения, доступность неплохой документации на API-интерфейс и ядро системы, работа на различных классах процессоров. В данный момент эта система способна к стабильной работе, а открытость ее кода и архитектуры вместе с растущей популярностью заставляет переносить свои наработки в Linux многих китов компьютерного мира. Стоит назвать фирмы SGI, IBM, Intel, Motorola. Последняя активно работает в своей традиционной сфере встраиваемых систем и продвигает на рынок продукт LinuxEmbedded. Linux прекрасно подходит для встроенных применений появились поставщики, предлагающие усеченные варианты этой ОС, которые занимают порядка 1-2 Мбайт на жестком носителе. Примером может служить проект LRP (Linux Router Project).

Для задач реального времени сообщество разработчиков ОС активно применяет расширения реального времени для Linux RTLinux, KURT и UTIME. Эти продукты позволяют получить устойчивую среду реального времени в рамках данной ОС.

KURT (KU Real Time Linux) относится к системам мягкого реального времени. А RTLinux представляет системы жесткого реального времени. Linux-расширение UTIME позволяет добиться увеличения частоты системных часов, что приводит к более быстрому переключению контекста задач. UTIME входит также составной частью в KURT.

Рассмотрим данные продукты подробнее.

KURT система мягкого реального времени

Этот проект основан на минимальных изменениях ядра Linux и предоставляет разработчику два режима работы нормальный (normal mode) и реального времени (real-time mode). В любой момент времени процесс, использующий библиотеку интерфейсов API KURT, может переключаться между этими двумя режимами, которые позволяют процессу работать как в режиме РВ (real-time mode), так и в нормальном режиме ядра Linux. Программный пакет KURT выполнен в виде отдельного системного модуля Linux RTMod, который становится дополнительным планировщиком РВ. Планировщик РВ доступен в нескольких вариантах и может тактироваться от любого таймера в системе или от прерываний стандартного параллельного порта. Так как все процессы работают в общем пространстве процессов Linux, программист использует в своих программах стандартные API-интерфейсы Linux и может переключаться из одного режима в другой по событиям или в нужном месте программы с применением API-интерфейсов KURT. При переключении в режим РВ все процессы в системе засыпают до момента освобождения ветви процесса РВ. Это довольно удобно при реализации задач с большим количеством вычислений, требующих по своей сути механизмов РВ. Примером может служить подмножество задач обработки аудио-видео информации.

Стандартно планировщик RTMod тактируется от системного таймера, и переключение контекста задач РВ (time slice) равно 10 мс. Используя KURT совместно с UTIME можно довести время контекстного переключения задач до 1 мс. Прерывания обрабатываются стандартным для Linux образом, т.е. используется механизм драйверов.

API-интерфейс KURT делится на две части прикладную и системную. Прикладная часть позволяет программисту управлять поведением своих процессов, а системный API-интерфейс KURT предназначен для манипулирования пользовательскими процессами и написания собственных планировщиков.

Прикладная часть API KURT состоит всего из 4 функций.


set_rtparams позволяет добавить процесс в ядро с маской SCHED_KURT. Только процессы, чья политика в планировщике установлена как SCHED_KURT, будут иметь возможность работать в режиме реального времени.

get_num_rtprocs получает идентификатор rt_id процесса из планировщика РВ RTMod;

rt_suspend позволяет приостановить планировщик РВ;

get_rt_stats получает статус процесса из таблицы планировщика процессов РВ.

Простота использования KURT позволяет с максимальным комфортом программировать задачи, требующие как РВ, так и всего многообразия API-интерфейса Unix. Использование мягкого реального времени часто подходит для реализации мультимедийных задач и при обработке разного рода потоков информации, где критично время выполнения вычислений. Совершенно другой подход применен при реализации в Linux жесткого реального времени.

RTLinux система жёсткого реального времени

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

RTLinux операционная система, в которой маленькое ядро реального времени сосуществует с POSIX-ядром Linux.

Разработчики RTLinux пошли по тому пути, который предусматривает запуск из ядра реального времени ядра Linux как задачи с наименьшим приоритетом. В RTLinux все прерывания обрабатываются ядром реального времени и в случае отсутствия обработчика реального времени передаются ядру Linux. Фактически ядро Linux является простаивающей (idle) задачей ОСРВ, запускаемой только в том случае, если никакая задача РВ не исполняется. При этом на Linux-задачу накладываются некоторые ограничения, которые, впрочем, прозрачны для программиста. Linux не может выполнять следующие операции: блокировать аппаратные прерывания, предохранять себя от вытеснения другой задачей. Ключ к реализации данной системы эмулирующий систему управления прерываниями драйвер, к которому обращается Linux при попытке блокировать прерывания. В этом случае драйвер перехватывает запрос, сохраняет его и возвращает управление ядру Linux.

Все аппаратные прерывания перехватываются ядром ОСРВ. Когда происходит прерывание, ядро RTLinux решает, что делать. Если это прерывание должно быть обработано обработчиком реального времени, то ядро вызывает соответствующий обработчик. В противном случае или если обработчик РВ говорит, что хочет разделять это прерывание с Linux, обработчику присваивается состояние ожидания (pending). Если Linux потребовал разрешить прерывания, то прерывания, которые находятся в состоянии pending, эмулируются.

Ядро RTLinux спроектировано таким образом, что ядро РВ никогда не нуждается в ожидании освбождения ресурса, занятого Linux-процессом (рис.1).

Для обмена данными между ОСРВ и Linux предусмотрены следующие срeдства:

разделяемые области памяти;
псевдоустройства, которые предоставляют возможность обмена данными с приложениями реального времени.

Ключевой принцип построения RTLinux как можно больше использовать Linux и как можно меньше RTLinux. Действительно, Linux заботится об инициализации системы и устройств, а так же о динамическом выделении ресурсов. На RTLinux ложится только планирование задач РВ и обработка прерываний. Процессы РВ реализованы в виде загружаемых модулей Linux для простоты запуска в контексте ядра, сохранения модульности и расширяемости системы.

Приложение реального времени с RTLinux, как правило, состоит из двух независимых частей: процесса, исполняемого ядром RTLinux, и обыкновенного Linux-приложения.

Рассмотрим следующий пример приложения реального времени. Мы выполним модуль приложения, который использует ядро реального времени RTLinux в виде загружаемого модуля Linux:

В заголовке модуля определяется структура RT_TASK, которая содержит указатели на структуры данных модуля, а также управляющую информацию.

В нашем случае, для связи между процессами, используются очереди сообщений FIFO (рис.2).

Модуль реального времени читает данные из устройства и кладет их в FIFO-очередь, откуда потом их забирает обыкновенное приложение Linux.

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

Такой модульный подход к написанию приложений присущ многим расширениям РВ для многоцелевых систем, где задача реального времени работает независимо от ОС. Разработчики уже приняли схему, по которой критичные по реакции задачи программируются с помощью API-интерфейсов, предусмотренных расширением реального времени, а все функции сервиса и интерфейса с пользователем возлагается на мощь операционной системы. Логично заключить, что при использовании данного подхода программисту нужно изучить только API-интерфейс РВ.

На наш взгляд, оба подхода в реализации механизмов реального времени, заложенные в KURT и RTLinux, применимы для большинства задач РВ. Правда до последнего времени проект KURT находился в подвешенном состоянии и почти год не развивался, что ставило команду инициаторов RTLinux в положение лидеров этого направления. Однако совсем недавно вышла новая версия KURT 2.0 для Linux-ядер 2.2.5, 2.2.9, 2.2.13.

Заключение

Многие разработчики приняли Linux и внедряют его в своих коммерческих проектах как основную ОС для серверов приложений, но при создании вертикальных проектов до сих пор на нижнем уровне применялись, как правило, ОС реального времени. Ситуация может существенно измениться при использовании расширений РВ для этой ОС. Теперь не надо тратить средства на изучение и покупку ОСРВ. Весь проект можно реализовать в рамках одной системы и без особых трудовых затрат.

Ресурсы:

http://hegel.ittc.ukans.edu/projects/kurt

http://luz.cs.nmt.edu/~rtlinux

15.04.2014