This article includes a list of general references, but it lacks sufficient corresponding inline citations. (June 2009) |
Оригинальный автор(ы) | Виктор Йодайкен, Михаил Барабанов |
---|---|
Разработчик(и) | FSMLabs, Системы Wind River |
Написано в | С |
Операционная система | Линукс |
Доступно в | Английский |
Тип | Ядро |
Лицензия | GPL2 |
RTLinux — это микроядро операционной системы реального времени (RTOS) с жестким режимом реального времени , которая запускает всю операционную систему Linux как полностью вытесняющий процесс. Свойство жесткого реального времени позволяет управлять роботами, системами сбора данных, производственными предприятиями и другими чувствительными ко времени инструментами и машинами из приложений RTLinux. Конструкция запатентована. [1] Несмотря на похожее название, она не связана с проектом Real-Time Linux от Linux Foundation . [2]
RTLinux был разработан Виктором Йодайкеном, Майклом Барабановым, Кортом Дуганом и другими в Институте горного дела и технологий Нью-Мексико , а затем как коммерческий продукт в FSMLabs. Wind River Systems приобрела встроенную технологию FSMLabs в феврале 2007 года и сделала версию доступной как Wind River Real-Time Core для Wind River Linux . По состоянию на август 2011 года Wind River прекратила линейку продуктов Wind River Real-Time Core, фактически прекратив коммерческую поддержку продукта RTLinux.
Основная цель разработки RTLinux [3] заключалась в том, чтобы добавить возможности жесткого реального времени к обычной операционной системе, чтобы облегчить разработку сложных программ управления с обеими возможностями. [4] [5] Например, можно было бы разработать контроллер двигателя в реальном времени, который использовал бы обычную базу данных и экспортировал бы веб-интерфейс оператора. Вместо того, чтобы пытаться создать единую операционную систему, которая могла бы поддерживать возможности реального времени и нереального времени, RTLinux был разработан для совместного использования вычислительного устройства между операционной системой реального времени и нереального времени, так что (1) операционная система реального времени никогда не могла бы быть заблокирована от выполнения нереальной операционной системой и (2) компоненты, работающие в двух разных средах, могли бы легко обмениваться данными. Как следует из названия, RTLinux изначально был разработан для использования Linux в качестве нереальной системы [6], но в конечном итоге он эволюционировал так, что ядро реального времени RTCore могло работать как с Linux, так и с Berkeley Software Distribution (BSD) Unix .
Multi-Environment Real-Time (MERT) был первым примером операционной системы реального времени, сосуществующей с системой Unix. MERT опирался на традиционные методы виртуализации: ядро реального времени было хостовой операционной системой (или гипервизором ), а Bell Systems Unix был гостем . RTLinux был попыткой обновить концепцию MERT для эпохи ПК и массового оборудования. Это была также попытка преодолеть ограничения производительности MERT, в частности накладные расходы, вызванные виртуализацией.
Вместо того, чтобы инкапсулировать гостевую ОС в виртуальную машину, RTLinux виртуализировал только управление гостевыми прерываниями. Этот метод позволял ядру реального времени преобразовывать гостевую операционную систему в систему, которая была полностью вытесняемой, но все еще могла напрямую управлять, например, устройствами хранения данных. В частности, стандартные драйверы для гостя работали без изменения исходного кода, хотя их нужно было перекомпилировать для использования «хуков» виртуализации. См. также паравиртуализация . Канал Unix был адаптирован для обеспечения возможности взаимодействия программ реального и нереального времени, хотя были также добавлены другие методы, такие как общая память.
С точки зрения программиста, RTLinux изначально выглядел как небольшая потоковая среда для задач реального времени плюс стандартная среда Linux для всего остального. Операционная система реального времени была реализована как загружаемый модуль ядра , который начинался с виртуализации управления гостевыми прерываниями, а затем запускал планировщик реального времени. Задачам назначались статические приоритеты, и планирование изначально было чисто приоритетным. Гостевая операционная система была включена как задача с самым низким приоритетом и по сути выступала в качестве задачи бездействия для системы реального времени. Задачи реального времени выполнялись в режиме ядра. Более поздняя разработка RTLinux приняла интерфейс прикладного программирования ( API ) потоков Portable Operating System Interface ( POSIX ), а затем разрешила создание потоков в пользовательском режиме с потоками реального времени, работающими внутри гостевых процессов. В многопроцессорных средах потоки были привязаны к ядрам процессора, и можно было предотвратить запуск гостевого потока на назначенном ядре (фактически резервируя ядра только для обработки в реальном времени).
RTLinux предоставляет возможность запускать специальные задачи реального времени и обработчики прерываний на той же машине, что и стандартный Linux. Эти задачи и обработчики выполняются, когда им нужно выполниться, независимо от того, что делает Linux. Наихудшее время между моментом обнаружения аппаратного прерывания процессором и моментом начала выполнения обработчика прерываний составляет менее 15 микросекунд на RTLinux, работающем на универсальном x86 (около 2000 г.). Периодическая задача RTLinux выполняется в течение 35 микросекунд от запланированного времени на том же оборудовании. Эти времена ограничены оборудованием, и по мере улучшения оборудования RTLinux также будет улучшаться. Стандартный Linux имеет превосходную среднюю производительность и может даже обеспечить точность планирования на уровне миллисекунд для задач, использующих возможности мягкого реального времени POSIX. Однако стандартный Linux не предназначен для обеспечения точности менее миллисекунды и надежных гарантий синхронизации. RTLinux был основан на легкой виртуальной машине, где «гостевой» Linux был предоставлен виртуализированный контроллер прерываний и таймер, а все остальное аппаратное обеспечение было доступно напрямую. С точки зрения «хоста» реального времени ядро Linux представляет собой поток. Прерывания, необходимые для детерминированной обработки, обрабатываются ядром реального времени, в то время как другие прерывания перенаправляются в Linux, который работает с более низким приоритетом, чем потоки реального времени. Драйверы Linux обрабатывают почти все операции ввода-вывода . Каналы «первым пришел — первым вышел» ( FIFO ) или разделяемая память могут использоваться для обмена данными между операционной системой и RTLinux.
Основная цель проектирования RTLinux заключается в том, что система должна быть прозрачной, модульной и расширяемой [ требуется цитата ] . Прозрачность означает, что нет неоткрываемых черных ящиков, а стоимость любой операции должна быть определяемой. Модульность означает, что можно исключить функциональность и расходы на эту функциональность, если она не нужна. А расширяемость означает, что программисты должны иметь возможность добавлять модули и настраивать систему под свои требования. Базовая система RTLinux поддерживает высокоскоростную обработку прерываний и не более того. Она имеет простой приоритетный планировщик, который можно легко заменить планировщиками, более подходящими для нужд какого-то конкретного приложения. При разработке RTLinux он был разработан так, чтобы максимально использовать преимущество, которое мы получаем от наличия Linux и его мощных возможностей.
RTLinux структурирован как небольшой компонент ядра и набор дополнительных компонентов. Компонент ядра позволяет устанавливать обработчики прерываний с очень низкой задержкой, которые не могут быть задержаны или вытеснены самим Linux, а также некоторые низкоуровневые процедуры синхронизации и управления прерываниями. Этот компонент ядра был расширен для поддержки SMP и в то же время упрощен путем удаления некоторых функций, которые могут быть предоставлены вне ядра.
Большинство функций RTLinux находятся в наборе загружаемых модулей ядра, которые предоставляют дополнительные службы и уровни абстракции. Эти модули включают:
Задачи реального времени RTLinux реализуются как модули ядра, аналогичные типу модулей, которые Linux использует для драйверов, файловых систем и т. д. Задачи реального времени имеют прямой доступ к оборудованию и не используют виртуальную память. При инициализации задача реального времени (модуль) информирует ядро RTLinux о своем крайнем сроке, периоде и ограничениях по времени выпуска.
RT-Linux реализует POSIX API для манипуляции потоком. Поток создается путем вызова pthread_create
функции. Третий параметр — pthread_create
это функция, которая содержит код, выполняемый потоком.
Необходимо установить приоритеты потоков в RTLinux. Потоки с более высокими приоритетами могут вытеснять потоки с более низкими приоритетами. Например, у нас может быть поток, управляющий шаговым двигателем. Чтобы двигатель двигался плавно, необходимо запускать этот поток через строго регулярные интервалы. Это можно гарантировать, назначив этому потоку высокий приоритет. Пример threads2.c устанавливает различные приоритеты потоков. Установка приоритета потоков выполняется с помощью кода, показанного ниже:
int init_module ( void ) { pthread_attr_t attr ; struct sched_param param ; pthread_attr_init ( & attr ); param . sched_priority = 1 ; pthread_attr_setschedparam ( & attr , & param ); pthread_create ( & t1 , & attr , & thread_code , "это поток 1" ); rtl_printf ( "Поток 1 запущен \n " ); /* ... */ }
Вывод программы следующий.
Тема 1 начатаТема 2 начатаТема 3 начатаСообщение: это тема 1Сообщение: это тема 2Сообщение: это тема 2Сообщение: это тема 2Сообщение: это тема 1Сообщение: это тема 1Сообщение: это тема 3Сообщение: это тема 3Сообщение: это тема 3
Поток 2 имеет наивысший приоритет, а поток 3 — самый низкий. Первое сообщение печатается потоком 1 со средним приоритетом, поскольку он запускается незадолго до потока 2.