| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > *NIX системы: Общие вопросы > приложение реального времени |
| Автор: boolean34 17.4.2012, 08:15 |
| мне нужно написать программный комплекс, работающий в режиме реального времени под управлением ОС Linux (расширение ядра). Язык С++. помогите определиться с инструментарием разработки, программной платформой + ссылки на литературу |
| Автор: baldina 17.4.2012, 08:50 |
| тема слишком общая, надо требования точнее сформулировать. http://www.ibm.com/developerworks/ru/library/l-real-time-linux/ http://citforum.ru/operating_systems/articles/linuxrt.shtml поможет в формулировках |
| Автор: boolean34 17.4.2012, 12:59 |
| спасибо за ссылки. вот беру ядро версии 3.0 скачиваю, что мне к нему прикрутить нужно, чтобы в итоге я имел пользовательский интерфейс, посредством которого я установлю среду разработки и начну реализовывать свои алгоритмы? возможно ли применение готовых ОС (убунту и тп)? |
| Автор: 500mhz 17.4.2012, 14:31 |
| все проще ставите дебиан + http://packages.debian.org/sid/rtai |
| Автор: boolean34 17.4.2012, 15:10 |
| спасибо, посмотрю |
| Автор: boolean34 18.4.2012, 10:11 |
| кто знает, у кого опыт подскажите пожалуйста: могу я быть уверенным, что затратив время на установку настройку и тд ОС Debian с патчем для реального времени получу желаемое: 1) операционную систему с откликом на прерывание порядка десятка микросекунд; 2) удобную IDE под С++ и библиотеки для создания прикладного приложения с развитым графическим интерфейсом; 3) отсутсвие проблем с коммутацией COM портов (стандарты RS 422/485) ?? |
| Автор: baldina 18.4.2012, 12:03 |
| за это время уже можно было установить и самому понять RT не дает временных гарантий в общем случае, т.к. это зависит от параметров аппаратуры. RT система имеет бОльшие накладные расходы, что требует более производительной системы. есть любом дистрибутиве; могут быть установлены отдельно поверх любого дистрибутива. понятие удобства относительно. не очень понятно что подразумевается под проблемами коммутации |
| Автор: 500mhz 18.4.2012, 13:29 |
| Давайте начнем с того что в системе где более 1 активного процесса - реалтайм понятие условное ) Скорее всего ТС имеет ввиду тайминг процесса под некую аппаратуру. То есть наш процесс должен успевать сделать что то в строго отведенный временной интервал. Несколько лет назад в одной конторе мы занимались такой проблемой, был аппарат (станочек лазерной маркировки). И там нужен был реалтайм по ряду причин, удешевление аппаратной части станка, использование памяти и cpu компьютера для управления станком итд. В результате было реализовано на мсдос ))) через com и lpt порты передавались данные и команды. |
| Автор: boolean34 19.4.2012, 08:51 |
| да да, мне от аппаратуры обработки сигнала приходит пакет с данными каждые 2(примерно) милисекунды. хочется более-менее строго оценить вероятность, что если поток в программе, который отвечает за прием, получит команду принимать, то все "обычные" дела отходят в сторону и выполняется критичная задача. ?? и как лучше построить структуру программы: один процесс-много потоков, либо много процессов, каждый из которых соответствует определенному функциональному модулю ?? |
| Автор: boolean34 19.4.2012, 11:43 | ||||
ну имеется в виду, что принять пакет с данными надо по-любому, а их последующая обработка может выполняться "не спеша"
имеется в виду, что модуль, который отвечает за прием сделать отдельным процессом с приоритетом №1 (задача реального времени); остальные модули( модуль отрисовки, модуль интерфейса, модуль вычислений) также запускаем в виде процессов, соотв. образом координируя их взаимодействие (обмен данными), но уже с обычным приоритетом либо: все сделать в виде одного процесса (один exe-шник), а уже внутри него несколько потоков. ?? |
| Автор: baldina 19.4.2012, 13:24 |
| если я все правильно понял, здесь две задачи: сбор данных и их обработка (визуализация) имхо есть смысл разделить их на два приложения. хотя бы для того, что бы надежность сбора данных не зависела от всего остального. т.к. предполагается, что обработка будет происходить не спеша, данные где-то нужно хранить. Видимо на диске (в БД). Скорость записи данных в среднем должна быть выше скорости поступления данных. Возможно несколько последовательных пакетов данных можно объединить в один, это позволит снизить нагрузку на подсистему сохранения. А последующая обработка типа визуализации может производиться независимо, уже читая сохраненные данные. удобно рассмотреть это на модели учета сетевого трафика: есть небольшой, легкий процесс, который реагирует на каждый сетевой пакет. Он производит начальную классификацию и суммирует однотипные пакеты. периодически (например 1 раз в сек) данные сбрасываются в БД. подсистема (приложение) отображения отчетов обращается к БД. подсистема отображения текущего трафика может обращаться к первому процессу (например, тоже каждую секунду). для этого первый процесс должен обеспечивать какую-то реализацию IPC, например использовать разделяемую память. |
| Автор: 500mhz 19.4.2012, 13:34 |
| boolean34 В любой "мультитаскинг" ОС время делиться на всех так как она якобы многозадачная, в мсдос все проще,запустил я свой ехешник и он "захапал" все процессорное время ,естественно за исключением всяких там прерываний и их обработчиков , к примеру ну там таймер или драйвер русской раскладки. И то все это можно тупо отключить и "хапать" 99,9% тайминга. Добавлено через 1 минуту и 27 секунд И еще вопрос, обмен данными между РС и железякой как сделан? По сети или по всяким там сом портам? |
| Автор: boolean34 19.4.2012, 14:22 | ||
| baldina хорошо, буду читать литературу
через RS 485 , либо похожие промышленные стандарты (232-ой, и тп) |
| Автор: 500mhz 19.4.2012, 14:33 | ||
в портах есть такое поняте как http://ru.wikipedia.org/wiki/16550_UART так что дофига что в вашем случае завязано на железо которое будет в РС |
| Автор: boolean34 20.4.2012, 08:44 |
| спасибо всем большое! пойду разбираться и делать |
| Автор: rsm 20.4.2012, 19:15 | ||||||||||||||
| 2boolean34: эх, давно ж не брал я в руки шашку! Итак, для начала краткое лирическое отступление. Следует сразу же сказать, что получить по-настоящему жёсткое реальное время с применением GNU/Linux на платформе х86 возможным не представляется. Поэтому если задача стоит именно такая, лучше сразу приступить к рассмотрению платных проприетарных решений. Мне, как соратнику Столлмана, больно и обидно говорить такое, но против фактов не попрёшь - из свободного и/или бесплатного ПО выбирать нечего. Продолжим.
Сразу же проведём черту относительно того, что разрабатывается - модуль ядра или прикладная программа? Ибо разница принципиальная!
Опять же, смотря что разрабатывается. Для прикладной программы, работающей в режиме мягкого псевдо-реального времени, можно обойтись малой кровью, взяв стандартные http://www.kernel.org/pub/linux/kernel/projects/rt/ и предельно "заточив" ядро под железо. Как именно - см. ниже. Если предполагается модуль ядра, то стоит присмотреться к RTAI - это набор из патчей ядра и библиотек прикладного уровня. Прелесть RTAI в том, что в неё входит набор драйверов реального времени для стандартных девайсов, например для RS-232 и некоторых сетевых карт. Драйвер пишется с использованием интерфейсов, предоставляемых RTAI. Ещё есть xenomai, но про него ничего толкового сказать не могу, ибо не юзал. Да, возможно. Как показывает практика, лучше всего использовать дистрибутивы, предоставляющих минимальный набор ПО - меньше придётся прилагать усилий, чтобы выпилить лишнее и создать из них ОС реального времени. Лично я собирал машинки в основном на базе Slackware.
Исходя из практического опыта, получить такое время отклика при заданных условиях (GNU/Linux, x86) не реально. В силу причин как аппаратных, так и программных. К примеру, один только лишь RS-232 даёт время отклика порядка 5 мкс - и это из режима реального времени работы процессора и с запретом прерываний, т.е. когда программа выполняется полностью монопольно.
Можно выбирать что нравится, но разработка должна вестись, разумеется, на отдельной машине. На машине с ОС РВ не должно быть ничего лишнего (см. ниже).
С ними проблем не возникает, даже с самыми дешёвыми контроллерами.
Зависит от настроек - если всё сделать правильно, то программа берёт процессор в практически монопольное использование.
Очень сильно зависит от задачи. В любом случае не стоит забывать, что самыми тормозными местами становятся контроллеры ввода/вывода - сколько бы ни было ядер, потоков и процессов, единственная сетевая карта или контроллер RS-485 всё равно не смогут разделиться чтобы хватило на всех. Поэтому расклад примерно такой. Предположим, что у нас резервированная система, работающая по Ethernet, сиречь две сетевых карты в системе, по одной на канал. В таком случае можно либо запустить два экземпляра программы, отдав каждому по карте - если взаимодействия между каналами не предполагается. Если же требуется переключаться с канала на канал, лучше запустить один экземпляр программы и уже в нём - два потока, по одному на каждую сетевую карту. А теперь в общем и целом. Дальнейший текст будет наполнен любовью и обожанием к х86 и режиму РВ, выпившему немало крови и укоротившему жизнь на многие месяцы Источник первый - аппаратное обеспечение. Архитектура х86 - худшая вещь, какую только можно придумать для РВ! Ибо в ней есть такие великолепнейшие грабли, как http://en.wikipedia.org/wiki/System_Management_Mode, накорню зарубающий саму суть реального времени. Вкраце: что бы ни было запущено на машине, она в любой момент может на некоторое время "уснуть" по возбуждению SMI, и ни одна запущенная программа (включая ядро) этого даже не заметит. Выпилить SMM полностью или замаскировать SMI нельзя, можно только сильно заточить железо, отключив всё, потенциально генерирующее SMI. Список будет достаточно обширным: - все системы управления питанием: ACPI, динамическое управление частотой процессора, управление кулерами и т.п.; - все виды многоядерности (hyper-threading и пр); - все неиспользуемые устройства; - USB; Далее, другой крайне неприятный баг - нестабильность системного таймера, т.е. нестабильность хода времени. Причём конкретное значение нелинейно и меняется от машины к машине. Чтобы обеспечить действительно надёжный ход времени, требуется: - использовать железо, поддерживающее HPET (и, естественно, не забыть включить его поддержку в ядре); - корректировать время по внешнему сигналу, подаваемому с генератора; Например, подаём на один из сигнальных входов RS-232 прямоугольный сигнал частотой 10 Гц. В программе отлавливаем изменение состояния сигнала и соответственно подтягиваем ход времени внутри программы, которое считается RT-таймером. И не следует забывать, что внешние сигналы тоже могут пропадать. Следовательно, нужно грамотно проектировать алгоритм расчёта времени. Источник второй - ПО. GNU/Linux изначально планировался как система для десктопов, для обычных людей, и достиг в этом немалых успехов. Однако для РВ он подходит слабо. Поэтому чтобы получить сколь-нибудь приемлемый результат, требуется: - сразу же забыть о любой графике, даже о framebuffer: можно лепить гномокеды и кедогномы сколько угодно и куда угодно, но только не на машину РВ; - убрать абсолютно все фоновые процессы кроме критически необходимых: именно поэтому я брал за основу Slackware, т.к. не в её привычках тащить с собой гору ненужного барахла и втихаря запускать чего вздумается в любых количествах, что обожают делать все т.н. user-friendly дистры; - сразу же забыть о свопинге: в системах РВ свопинг не должен использоваться ни при каких условиях, никогда и нигде. свопинг следует выпилить из ядра и принудительно запретить из запускаемой программы; - включить в ядре: вытесняющую многозадачность РВ (решается RT-патчами или RTAI), планировщик ввода/вывода поставить по-умолчанию на FIFO, установить системный таймер на максимальную частоту (1000 Гц или выше); - выпилить из ядра абсолютно всё железо, которое отсутствует на данной конкретной машине или отключено в соответствии с приведёнными выше рекомендациями по настройке железа; - выпилить из ядра абсолютно все не нужные и не используемые подсистемы - к примеру, http://en.wikipedia.org/wiki/Symmetric_multiprocessing, гору файловых систем, фаервол и т.д. и т.п.; - драйверы устройств в виде модулей ядра можно оставить только если важен порядок их инициализации - к примеру, сначала запускается контроллер RS-232, потом первая сетевая карта, потом вторая. для всех остальных нужных устройств драйверы лучше встроить внутрь ядра; В целом, политика настройки железа, ПО и ядра должна быть следующая - отключить, запретить и по возможности выпилить абсолютно всё лишнее. Никаких "заделов на будущее", "если вдруг чего" и т.п.! Один раз установленный и отстроенный дистрибутив можно спокойно клонировать с машины на машину, по необходимости добавляя или удаляя нужные мелочи. Однако ядро всегда должно затачиваться под конкретную машину, конкретное железо, которое на ней установлено. Получилось несколько сумбурно и, естественно, не в полном объёме. Однако, надеюсь, не без пользы |
| Автор: boolean34 23.4.2012, 05:25 |
| спасибо большое за ценные советы! |
| Автор: 500mhz 23.4.2012, 09:24 |
| А еше есть RTOS QNX ))) |
| Автор: rsm 23.4.2012, 20:31 |
Есть, и неплохо работает. Но у неё есть две очень злокозненные особенности: а) QNX соответствует POSIX только частично: простой перенос исходников либо не компилится вообще, либо компилится прекрасно, но работает совсем иначе; б) разработка под QNX это как жизнь в Австралии: практически все системные вызовы асинхронны, с точностью до наоборот относительно GNU/Linux; Обе особенности вполне логичны, закономерны и объяснимы, если вспомнить, что QNX это ОС действительно РВ. Однако к ним требуется привыкнуть, всецело проникнуться ими и начать проектировать программы по иным принципам. |