Python в операционной системе реального времени (RTOS)

StackOverflow https://stackoverflow.com/questions/1402933

Вопрос

Я планирую реализовать небольшую систему сбора данных на платформе RTOS.(Либо в системе QNX, либо в системе RT-Linux.)

Насколько мне известно, эти работы выполняются с использованием C/C++, чтобы максимально эффективно использовать возможности системы.Однако мне любопытно узнать и хочу узнать мнение некоторых опытных людей, прежде чем я слепо примусь за кодирование, будет ли осуществимо и разумнее писать все на Python (от низкоуровневого интерфейса инструментов до блестящего графического пользовательского интерфейса).Если нет, смешивайте критичные по времени части проекта с «C» или записывайте все на C, даже не добавляя ни строчки кода Python.

Или, по крайней мере, обернуть код C с помощью Python, чтобы обеспечить более легкий доступ к системе.

В каком направлении вы бы мне посоветовали работать?Я был бы рад, если бы вы указали несколько похожих случаев проектирования и дополнительную литературу.

Спасибо

ПРИМЕЧАНИЕ 1: Причина акцента на QNX заключается в том, что у нас уже есть система сбора данных на базе QNX 4.25 (М300) для наших экспериментов по измерению атмосферы.Это запатентованная система, и мы не можем получить доступ к ее внутренностям.Дальнейшее рассмотрение QNX может быть для нас полезным, поскольку версия 6.4 имеет бесплатную академическую лицензию, поставляется с Python 2.5 и последней версией GCC.Я никогда не тестировал систему RT-Linux, не знаю, насколько она сравнима с QNX с точки зрения стабильности и эффективности, но я знаю, что все члены среды обитания Python и инструменты, не относящиеся к Python (например, Google Earth), что новая система может быть разработан для работы в большинстве случаев «из коробки».

Это было полезно?

Решение

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

Затем, когда поступают данные , вам нужно немедленно записать событие или ответить на него, а затем он возвращается к ожидающей игре. Как правило, это наиболее критичная по времени часть системы сбора данных. По этой причине я бы обычно сказал, что придерживайтесь C для частей ввода / вывода сбора данных, но нет особых причин не использовать Python на не критичных ко времени частях .

Если у вас достаточно слабые требования - возможно, нужна точность в миллисекундах, - это добавляет вес к выполнению всего в Python. Что касается времени разработки, если вы уже знакомы с Python, вы, вероятно, получили бы готовый продукт значительно раньше, если бы вы все делали на Python и выполняли рефакторинг только тогда, когда появляются узкие места. Выполнение основной части вашей работы в Python также облегчит тщательное тестирование кода, и, как правило, будет меньше строк кода и, следовательно, меньше места для ошибок.

Если вам нужно специально выполнить несколько задач (а не несколько потоков ), Stackless Python также может быть полезным. Это похоже на многопоточность, но потоки (или тасклеты в жаргоне Stackless) - это не потоки уровня ОС, а уровень Python / приложения, поэтому издержки переключения между тасклетами значительно уменьшено. Вы можете настроить Stackless на многозадачность совместно или превентивно. Самым большим недостатком является то, что блокировка ввода-вывода обычно блокирует весь набор тасклетов. В любом случае, учитывая, что QNX уже является системой реального времени, трудно предположить, стоит ли использовать Stackless.

Моим голосом было бы выбрать максимально возможный путь Python - я считаю его низкой стоимостью и высокой выгодой. Если и когда вам нужно переписать на C, у вас уже будет рабочий код для запуска.

Другие советы

Я создал несколько систем мягкого реального времени (RT) полностью на Python с временем первичного цикла от 1 мс до 1 секунды.За время работы я усвоил несколько основных стратегий и тактик:

  1. Используйте многопоточность/многопроцессорность только чтобы разгрузить работу, не связанную с RT, из основного потока, где очереди между потоками приемлемы и возможна совместная обработка потоков (никаких вытесняющих потоков!).

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

  3. Используйте модули C, когда это возможно.С C дела (обычно) идут быстрее!Но в основном, если вам не нужно писать самостоятельно:Оставайтесь на Python, если альтернативы действительно нет.Оптимизация производительности модуля C — это PITA, особенно когда перевод через интерфейс Python-C становится самой дорогой частью кода.

  4. Используйте ускорители Python для ускорения вашего кода.Мой первый проект RT Python получил большую пользу от Psyco (да, я этим уже давно занимаюсь).Одной из причин, по которой я сегодня остаюсь с Python 2.x, является PyPy:Вещи всегда идите быстрее с LLVM!

  5. Не бойтесь ждать, когда необходим критический момент.Используйте time.sleep(), чтобы «подкрасться» к нужному времени, а затем дождитесь занятости в течение последних 1–10 мс.Мне удалось добиться повторяемости результатов с автосинхронизацией порядка 10 микросекунд.Убедитесь, что ваша задача Python выполняется с максимальным приоритетом ОС.

  6. Тупой РОК!Если вы занимаетесь «живой» аналитикой или массой статистики, есть НЕТ способ выполнить больше работы быстрее и с меньшими затратами (меньше кода, меньше ошибок), чем при использовании Numpy.Ни на каком другом известном мне языке, включая C/C++.Если большая часть вашего кода состоит из вызовов Numpy, вы будете работать очень и очень быстро.Я не могу дождаться завершения порта Numpy на PyPy!

  7. Помните, как и когда Python выполняет сбор мусора.Контролируйте использование памяти и при необходимости принудительно выполняйте сборку мусора.Обязательно явно отключите сборщик мусора во время критичных по времени операций.Все мои системы RT Python работают непрерывно, а Python любит перегружать память.Тщательное программирование может исключить почти все динамическое распределение памяти, и в этом случае вы можете полностью отключить GC!

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

  9. Я упоминал об использовании PyPy?Ну, об этом стоит упомянуть дважды.

Есть много других преимуществ использования Python для разработки RT.Например, даже если вы совершенно уверены, что вашим целевым языком не может быть Python, разработка и отладка прототипа на Python может принести огромную пользу, а затем использовать его как шаблон и инструмент тестирования для окончательной системы.Я использовал Python для создания быстрых прототипов «сложных частей» системы в течение многих лет, а также для создания быстрых и грязных тестовых графических интерфейсов.Так появилась моя первая система RT Python:Прототип (+Psyco) работал достаточно быстро даже при запущенном тестовом графическом интерфейсе!

-БобС

Редактировать:Забыл упомянуть о кроссплатформенных преимуществах:Мой код работает практически везде: а) без перекомпиляции (или зависимостей от компилятора или необходимости в кросс-компиляторах) и б) почти без кода, зависящего от платформы (в основном для разных вещей, таких как обработка файлов и последовательный ввод-вывод).Я могу разрабатывать на Win7-x86 и развертывать на Linux-ARM (или любой другой POSIX-операционной системе, в которой сейчас есть Python).PyPy на данный момент в основном представляет собой x86, но порт ARM развивается невероятными темпами.

Обычно причина, по которой не используется язык высокого уровня в контексте реального времени, заключается в неопределенности - когда вы запускаете процедуру один раз, это может занять 100 мкс; в следующий раз, когда вы запустите ту же самую процедуру, он может решить расширить хеш-таблицу, вызвав malloc, а затем malloc запрашивает у ядра больше памяти, что может сделать что угодно: от мгновенного возврата до возврата через миллисекунды и до возвращения секунд . позже к ошибкам, ни один из которых не является очевидным (или контролируемым) из кода. Принимая во внимание, что теоретически, если вы пишете на C (или даже ниже), вы можете доказать, что ваши критические пути будут всегда (за исключением удара метеорита) запускается в X раз.

Наша команда проделала некоторую работу по объединению нескольких языков в QNX и добилась большого успеха с этим подходом. Использование python может оказать большое влияние на производительность, а такие инструменты, как SWIG и ctypes, действительно упрощают оптимизацию кода и объединить функции из разных языков.

Однако, если вы пишете что-то критичное по времени, это почти наверняка должно быть написано на c. Это означает, что вы избежите неявных затрат на интерпретируемый язык, такой как GIL ( Глобальная блокировка интерпретатора ) и конкуренция по многим небольшим выделениям памяти. Обе эти вещи могут оказать большое влияние на работу вашего приложения.

Кроме того, python в QNX, как правило, не на 100% совместим с другими дистрибутивами (т.е. / иногда отсутствуют модули).

Одно важное замечание: Python для QNX обычно доступен только для x86.

Я уверен, что вы можете скомпилировать его для ppc и других архитектур, но это не сработает "из коробки".

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top