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

Что встроено?

Встраиваемая система определяется как «компьютерная система со специальной функцией в более крупной механической или электрической системе, часто с вычислительными ограничениями в реальном времени». Но что отличает встроенные системы от других «компьютерных систем», так это не столько контекст, в котором они работают, сколько связанные с этим ограничения. Это:

  • Ограниченные ресурсы (низкая производительность ПЗУ, ОЗУ и ЦП)
  • Высокая надежность

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

Аппаратные улучшения

SoC

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

Подобные изменения произошли и с другими типами встраиваемых систем. ИС, которая включает в себя множество функций, называется SoC (System on Chip). Типичными примерами SoC являются nRF51 (BLE + MCU на одном ядре), CC2640 (BLE + отдельный MCU), CC3200 (Wi-Fi + отдельный MCU).

Такая консолидация приводит к двум вещам:

  • Меньше аппаратного обеспечения для встроенных систем разрабатывается собственными силами.
  • Программное обеспечение и общая сложность системы значительно снижены

Представление

Встроенные системы, являющиеся частью всей индустрии аппаратного обеспечения, демонстрируют стабильный рост производительности полупроводниковых микросхем. Распространение 32-битных микроконтроллеров было частью этой тенденции. Менее заметной, но, возможно, более важной частью этого стал переход с ядра 8051 на ARM Cortex-M.

8051

8051, разработанный Intel в 80-х годах, был популярным выбором для производителей микроконтроллеров, которые использовали его в качестве основы для создания своих собственных оптимизированных версий. Это означало, что в отрасли было множество ядер со вкусом 8051 и не было стандартизации между производителями.

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

Кортекс-М

Cortex-M не был первым 32-битным ядром на рынке встраиваемых систем, но с годами он становится все более и более популярным среди производителей микроконтроллеров, большинство из которых теперь предлагают по крайней мере одно семейство продуктов с его поддержкой. со старыми 8-битными и проприетарными 32-битными версиями.

Консолидация отрасли вокруг Cortex-M важна по нескольким причинам:

  • Повторное использование кремниевой конструкции снижает затраты на микроконтроллеры
  • Возможность использовать более широкий набор программных инструментальных средств

Инструменты разработки программного обеспечения

Цепочки инструментов

Как упоминалось ранее, в течение долгого времени большинство встраиваемых систем основывалось на 8-битных микроконтроллерах с проприетарными ядрами, многие из которых поддерживали только инструменты IAR / Keil или, в худшем случае, поставляемые производителем. А поскольку производители являются основными производителями аппаратного обеспечения, качество этих инструментов было ниже уровня, принятого в мире программного обеспечения. В частности, проблема с этими инструментами заключалась в том, что они были с закрытым исходным кодом, ориентированы на окна, в значительной степени основывались на графическом интерфейсе пользователя и были очень дорогими (›5 тысяч долларов за годовую лицензию).

Все изменилось с появлением ARM. Хотя они предоставляют свой собственный набор инструментов для серии Cortex-M, существует множество бесплатных опций, наиболее популярные из которых основаны на GCC.

Помимо инструментальных средств

Возможно, самое заметное, что случилось с индустрией, - это Arduino, которая послужила как точкой входа для новичков в этой области, так и полезным инструментом для создания прототипов.

Начавшись как набор инструментов (avr-gcc + IDE) для 8-битного AVR и базовая плата для разработки с миссией, позволяющей не-инженерам создавать цифровые проекты, он превратился в обширную экосистему, вдохновляющую многих Другие для создания подобных, совместимых или несовместимых , и целая индустрия вокруг любительской электроники.

LLVM

Ортогональная тенденции с ARM, еще одна технология, которая может принести современные методы разработки программного обеспечения во встраиваемый мир, - это LLVM.

LLVM не зависит от инфраструктуры компилятора в выборе языка и цели. На высоком уровне LLVM и типичная цепочка инструментов C имеют похожий алгоритм компиляции:

Исходный код → Внутреннее представление → Двоичный

Разница заключается в выборе внутреннего языка представления: GCC использует ассемблер, который по своей сути зависит от платформы, а LLVM использует более абстрактный язык (LLVM IR). И это огромное дело, потому что это делает инструментальную цепочку намного более модульной и позволяет комбинировать различные внешние и внутренние интерфейсы (по крайней мере, теоретически).

При стандартном подходе перенос N языков на M целей означал бы написание N * M компиляторов и ассемблеров, поскольку они не взаимозаменяемы между языками и целями. С LLVM вам нужно будет написать N внешних интерфейсов и M внутренних интерфейсов, что примерно равно N + M инструментальных цепочек.

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

Языки

C

C - это lingua franca встроенных систем по одной причине - он очень хорошо подходит для предметной области. Это:

  • Скомпилированный и статически типизированный
  • Высокая производительность
  • Гибкость (C позволяет делать опасные, но необходимые вещи, такие как прямой доступ к памяти, который необходим для управления периферией)
  • Без GC (следовательно, детерминированный, что важно для систем реального времени, каковыми являются многие встроенные системы)

Эти внутренние особенности языка привели к его первоначальной популярности, что привело к тому, что все компиляторы для MCU были написаны для C, а это означало, что эксперименты с другими языками означали бы написание собственного компилятора для него - очень высокий барьер для входа.

А поскольку все просто используют C, поставщики кремний также поставляют на нем свои периферийные библиотеки - еще один барьер, хотя и не такой высокий, как предыдущий.

Другие

Было много попыток использовать другие языки, такие как Python, JavaScript и даже Haskell, во встраиваемых системах, но ни один из них не получил широкого распространения, поскольку их модель выполнения не соответствует системам с ограниченными ресурсами так же, как C.

Ржавчина

Rust - новый (стабильный по состоянию на весну 2015 года) язык системного программирования с открытым исходным кодом, поддерживаемый Mozilla.

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

(RT)OS

Постоянные игроки

Существует примерно столько же операционных систем реального времени (RTOS) для встраиваемых систем, сколько людей хотели написать одну (более сотни), но самыми популярными являются FreeRTOS и µC / OS-II. ». Большинство из них эквивалентны по набору функций и предоставляют такие вещи, как:

  • Планировщик
  • Периферийный контроль
  • Файловая система
  • Программные таймеры
  • Мьютексы и семафоры
  • Сообщение передается

Эти функции полезны не только для систем с ограничениями в реальном времени, но и повышают продуктивность разработчиков для большинства задач средней и высокой сложности, поэтому они используются в 69% [1] встроенных систем.

Новые игроки

Брилло

Brillo - это операционная система Google для Интернета вещей. Он построен на Android и использует Weave в качестве протокола связи высокого уровня. Пока что доступно не так много подробностей, но, судя по всему, он не выглядит прямым конкурентом устоявшимся игрокам, а скорее представляет собой специальный инструмент Google для создания встроенных устройств.

Зефир

Зефир произошел от коммерческой ОСРВ - Ракета от Wind River (популярной ОСРВ для топовых встраиваемых систем VxWorks). Проект имеет открытый исходный код и сейчас находится под эгидой Linux Foundation.

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

Linux

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

Вывод

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

Следите за обновлениями, чтобы узнать больше о некоторых темах, упомянутых в этой статье.

[1]: Исследование рынка встраиваемых систем UBM, 2014 г.