Использование Haskell для значительных систем реального времени: как (если?)?


Мне было любопытно понять, можно ли применить силу Haskell к встроенному миру реального времени, и в googling нашли Атом пакета. Я бы предположил, что в сложном случае код может иметь все классические ошибки C - сбои, повреждения памяти и т. д., которые затем нужно будет проследить до исходного кода Haskell, который причинить им. Итак, это первая часть вопроса: "Если у вас был опыт работы с атомом, как вы справлялись с задачей отладка низкоуровневых ошибок в скомпилированном коде C и их исправление в исходном коде Haskell ?"

Я искал еще несколько примеров для атома, этот блог упоминает полученный код C 22KLOC (и, очевидно, нет кода:),включен пример это игрушка. этой и этой ссылки имеют немного более практичный код, но на этом все заканчивается. И причина, по которой я поставил "значительный" в этом вопросе, мне очень интересно, если бы вы могли поделитесь своим опытом работы с сгенерированным кодом C в диапазоне 300KLOC+.

поскольку я новичок Haskell, очевидно, могут быть и другие способы, которые я не нашел из-за моих неизвестных неизвестных, поэтому любые другие указатели для самообразования в этой области будут высоко оценены - и это вторая часть вопроса - "каковы будут некоторые другие практические методы (Если) разработки в реальном времени в Haskell?". Если многоядерный также находится на картинке, это дополнительный плюс : -)

(об использовании самого Haskell для этой цели: из того, что я читал в этот блог, сбор мусора и лень в Haskell делает его довольно недетерминированным планированием, но, возможно, за два года что-то изменилось. реальный мир программирования Хаскелл вопрос на SO был самым близким, что я мог найти к этой теме)

Примечание: "Реальное время" выше будет ближе к "жесткому Реальному времени" - мне любопытно, если это так можно гарантировать, что время паузы, когда основная задача не выполняется, составляет менее 0,5 мс.

5 54

5 ответов:

в Galois мы используем Haskell для двух вещей:

  • мягкого реального времени (слои-устройства, сети), где 1-5 МС время отклика являются правдоподобными. GHC генерирует быстрый код и имеет большую поддержку для настройки GC и планировщика, чтобы получить правильные тайминги.
  • для истинных систем реального времени EDSLs используются для генерации кода для других языков, которые обеспечивают более сильные гарантии синхронизации. Например, Криптол, Атом и второй пилот.

Так что будьте осторожны, чтобы отличить EDSL (второй пилот или атом) с языка хоста (Haskell).


некоторые примеры критических систем, а в некоторых случаях и систем реального времени, написанных или созданных из Haskell, созданных Галуа.

EDSLs

системы

  • HaLVM -- легкий микроядро для встроенных и мобильных приложений
  • TSE -- междоменное (уровень безопасности) сетевое устройство

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

существует здоровый интерес к использованию Haskell или чего-то Haskell-подобного для компиляции до чего-то очень эффективного; например, Bluespec компилируется в оборудовании.

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

Андрей,

Да, это может быть сложно отлаживать проблемы через сгенерированный код обратно в исходный источник. Одна вещь, которую предоставляет Atom, - это средство для зондирования внутренних выражений, а затем оставляет, если до пользователя, как обрабатывать эти зонды. Для испытания корабля, мы строим передатчик (в атоме) и пропускаем зонды вне над шиной ЧОНСЕРВНОЙ БАНКЫ. Затем мы можем захватить эти данные, сформировать их, а затем просмотреть их с помощью таких инструментов, как GTKWave, либо в пост-обработке, либо в реальном времени. Для программного обеспечения моделирование, зонды обрабатываются по-разному. Вместо того, чтобы получать данные зонда из протокола CAN, крючки сделаны в код C, чтобы поднять значения зонда напрямую. Затем значения зонда используются в структуре модульного тестирования (распределенной с помощью Atom) для определения того, проходит ли тест или нет, и для расчета покрытия моделирования.

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

запись в Atom-это не совсем программирование в Haskell, так как Haskell здесь можно рассматривать как чисто препроцессор для фактической программы, которую вы пишете.

Я думаю, что Хаскелл -высокий препроцессор, и использование DSEL, как Atom, вероятно, отличный способ создать значительный жесткие системы реального времени, но я не знаю, подходит ли Atom для счета или нет. Если это не так, я уверен, что это возможно (и я призываю всех, кто это делает!) для реализации DSEL, что делает.

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

я дурачился с атомом. Это довольно круто, но я думаю, что это лучше для небольших систем. Да, он работает в грузовиках и автобусах и реализует реальные, критические приложения, но это не означает, что эти приложения обязательно большие или сложные. Это действительно для жестких приложений в реальном времени и идет на многое, чтобы каждая операция занимала точно такое же количество времени. Например, вместо оператора if/else, который выполняет одну из двух веток кода может отличаться по времени выполнения, он имеет оператор "mux", который всегда выполняет обе ветви перед условным выбором одного из двух вычисленных значений (поэтому общее время выполнения одинаково, какое бы значение ни было выбрано). Он не имеет какой-либо значимой системы типов, кроме встроенных типов (сопоставимых с C), которые применяются через значения GADT, передаваемые через монаду атома. Автор работает над инструментом статической проверки, который анализирует выходной код C, что довольно круто (он использует решатель SMT), но я думаю, что Atom выиграет от большего количества функций и проверок исходного уровня. Даже в моем игрушечном приложении (LED flashlight controller) я сделал ряд ошибок новичков, которые кто-то более опытный с пакетом мог бы избежать, но это привело к ошибочному выходному коду, который я бы предпочел поймать компилятором, а не через тестирование. С другой стороны, он все еще находится в версии 0.1.что-то такое улучшение, несомненно, грядет.