Принципы применения Linux в качестве операционной системы реального времени

Принципы применения Linux в качестве операционной системы реального времени

Мороз О.В., Попов С.Н.

Московский государственный институт электроники и математики Кафедра ««Информационные технологии и автоматизированные системы»

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

Использование ОС Linux в качестве ОС реального времени имеет ряд

т-ч и

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

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

Типичное приложение состоит из двух частей - задачи реального времени, непосредственно работающей с аппаратурой и обыкновенной задачи Linux, которая выполняет остальные операции, такие как сохранение данных на диск, пересылка их по сети, работа с пользователем (GUI) и т.д. Задачи реального времени запускаются в адресном пространстве ядра и с привилегиями ядра и могут быть реализованы, например, при помощи модулей Linux. Рассмотрим варианты реализации указанных подходов.

1. KURT

Это расширение «мягкого» реального времени для ядра Linux. Этот проект основан на минимальных изменениях 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 мс [1]. Прерывания обрабатываются стандартным для Linux образом, то есть используется механизм драйверов.

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

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

2. RTLinux

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

Linux не может выполнять следующие операции:

[1] блокировать аппаратные прерывания;

[2] предохранять себя от вытеснения другой задачей.

Ключ к реализации данной системы — эмулирующий систему управления прерываниями драйвер, к которому обращается Linux при попытке блокировать прерывания. В этом случае драйвер перехватывает запрос, сохраняет его и возвращает управление Linux.

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

ожидания (pending). Если Linux потребовал разрешить прерывания, то прерывания, которые находятся в состоянии ожидания, эмулируются.

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

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

1. разделяемые области памяти;

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

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

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

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

1. Приложения реального времени выполняются в пространстве ядра, следовательно они могут переписать часть памяти ядра и сломать систему

2. Взаимодействие между RT-подсистемой и Linux может быть только нереалтаймовым

3. Ядро Linux выполняется в фоне, следовательно, задачи Linux могут испытывать большие задержки

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

3. ART-Linux

Advanced Real-Time Linux (ART-Linux) это Linux ядро жесткого реального времени разработанное для использования в робототехнике. Режим реального времени доступен прямо из пользовательского уровня исполнения и не требует специальных драйверов. Минимальный период исполнения задачи составляет всего 10 микросекунд.

ART-Linux расширяет Linux включая в него планировщик жесткого реального времени основанный на наследовании приоритетов. Характеристики ART-Linux:

1. Диспетчер задач жесткого реального времени

2. Защита памяти для задач реального времени

3. Задачи реального времени могут сосуществовать одновременно с обычными задачами.

4. Несколько уровней наследования приоритетов

5. Бинарная совместимость для приложений

6. Совместимость с драйверами устройств

• Планирование задач основанное на статичных приоритетах

• Части ядра не имеющие приоритета реального времени исполняются с наименьшим приоритетом

• Эмуляция обработки прерываний ядром реального времени

• Межпроцессное взоимодействие основанное на RT-FIFO

При создании системы использовались следующие методы для добавления реального времени в ядро.

• Обработчик прерываний реализованный как периодическая задача.

• Задачи не реального времени наследуют приоритеты от процессов-предков

• Управление аппаратными прерываниями эмулируется использованием блокировок реального времени.

• Синхронизация процессов осуществляется эмулироваением блокировок реального времени

4. RT-Preempt

Стандартное ядро Linux отвечает только требованиям мягкого реального времени: оно предоставляет основные операции POSIX управления временем исполнения для пользовательского уровня но не гарантирует выполнения за жестко фиксированное время. С патчем RT-Preempt и таймером с поддержкой высокой точности, ядро получило возможность работать в режиме жесткого реального времени. RT-Preempt способен работать на x86, x86_64, ARM, MIPS, and Power архитектурах [2].

Патч RT-Preempt поднял большой интерес во всей индустрии ОСРВ. Его понятный и простой дизайн и направленность на интеграцию в основную ветку ядра делает его интересным для приложений требующих жесткого реального времени от аудиообработки до задач управления промышленными процессами. Патч RT-Preempt превращает ядро Linux в полностью вытесняемое ядро при помощи:

• Создание внутриядерных блокировок (используя спинлоки) вытесняемыми через переопределенные мьютексы реального времени:

• Критические секции защищенные spinlock_t и rwlock_t вытесняемы. Создание невытесняемых секций в ядре также доступно с использованием aw_spinlock_t

• Реализация механизма наследования приоритетов для внутриядерных блокировок и семафоров.

• Преобразование обработчиков прерываний в вытесняемые потоки ядра: патч RT-Preempt выполняет исполнение обработчиков прерываний в контексте потока ядра, и представляет их при помощи task_struct как и большинство процессов пользовательского уровня.

• Преобразования старого API таймера в отдельные подсистемы для таймеров высокой точности которые также используются для POSIX таймеров пользовательского пространства.

Плюсами RT-Preemp является то что в общем случае нет необходимости перекомпилировать приложения для исполнения их в режиме реального времени,

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

Для написания программы реального времени необходимо с детерменированным поведением по времени необходимо:

• Установить диспетчеризацию реального времени и необходимые приоритеты

• Заблокировать память для того, чтобы ошибки страниц виртуальной памяти не повлияли на детерминированное поведение системы.

• Настройка стека

• компиляция приложения gcc -o test_rt test_rt.c -lrt

Сделаем краткие выводы. За последние несколько лет были достигнуты определенные успехи в части адаптации ядра Linux для работы в режиме реального времени. Использование в качестве ОС реального времени Linux позволяет использовать мощные средства разработки под Linux, а также упрощает отладку. Также можно использовать драйвера устройств и другие модули стандартного ядра. Таким образом, существенно сокращается время разработки. При использовании вышеописанных проектов не требуется длительной переподготовки программистов. К недостаткам можно отнести небольшой набор архитектур на которых Linux способен работать в качестве ОС реального времени, существенно больший объем необходимой оперативной и внешней памяти.

Список литературы

[1]. Sean B. House, Douglas Niehaus. КиЯТ-Linux Support for Synchronous Fine-Grain Distributed Computations. Department of Electrical Engineering and Computer Science University of Kansas.

[2]. Siro Arthur. Assessment of the Realtime Preemption Patches (RT-Preempt) and

their impact on the general purpose performance of the system. Research Fellow,

Distributed And Embedded Systems Lab