Embox — ОС РВ позволяющая запускать Linux ПО на микроконтроллерах (Антон Бондарев, OSSDEVCONF-2019)
Материал из 0x1.tv
- Докладчик
- Антон Бондарев
Доклад посвящен опыту проекта Embox по использованию “тяжелого” прикладного обеспечения, например Qt, на микроконтроллерах. В докладе рассмотрены: преимущества подобного подхода, особенности микроконтроллеров и трудности связанные с использованием данного ПО на них, а также подход проекта Embox позволяющие не только преодолеть данные трудности, но и существенно снизить затраты на их преодоление.
Содержание
Видео
Презентация
Thesis
Введение
На сегодняшний день от систем управления ожидают все более развитой функциональности. Характеристики аппаратуры, в том числе микроконтроллеров значительно выросли, что позволяет должным образом эту функциональность обеспечивать. Но программное обеспечение достаточно сильно отстает. В силу того, что исторически подобное ПО в целях оптимизации писалось под конкретную задачу. А переиспользование кода, которое является движущей силой развития функциональности ПО для универсальных систем, было достаточно ограниченным. С увеличением же функциональных требований к системам управления, уже невозможно создавать всю функциональность с нуля, игнорируя, уже разработанный и отлаженный код обеспечивающий данную функциональность для универсальных систем.
Особенности микроконтроллеров
Но оригинальное десктопное ПО имеет ряд особенностей, которые затрудняют его применение на небольший апаратных системах, в частности микроконтроллерах. Прежде всего это отсутствие в микроконтроллерах блока управления памятью (MMU). В микроконтроллерах используется блок защиты памяти (MPU) который не подразумевает режим трансляции адресов. Соответственно возникают проблемы поскольку десктопное ПО традиционно запускается в отдельном адресном пространстве. Кроме того в десктопном ПО используется системный вызов fork() для создания процесса, являющегося экземпляром какого то прикладного приложения.
Вторым существенным ограничением является сильно меньшее количество ресурсов памяти доступных в системе. Универсальные системы разрабатывались по сути дела в условиях когда память доступная приложению ограничена только разрядностью адресного пространства. Возьмем например 32 разрядную систему, по сути дела приложение может использовать до трех гигабайт (а то и больше) памяти, ведь за даже если в системе нет такого количества физической памяти, с помощью механизма свопа, она может быть доступна, хотя это и значительно снижает производительность. В микроконтроллерах же с одной стороны память находится прямо на кристалле, а с другой стороны ее количество существенно меньше чем в десктопных системах.
Кроме того что в микроконтроллерах существенно меньше памяти, существует четкое разделение по типам памяти. Первое по типу доступа: на только для чтения ROM (read only memory) и на память с произвольным доступом то есть и на чтение и на запись RAM (random access memory). По типу расположения: память доступная прямо на кристалле и память доступная по внешней шине.
Выделение памяти только для чтения, оправданно с точки зрения увеличения производительности. Поскольку гарвардская архитектура применяемая в микроконтроллерах разделяет память для команд и память для данных, доступ происходит по разным шинам и следовательно общая пропускная способность памяти увеличивается. Но поскольку эта память не подразумевает произвольную запись, то загрузить код в эту память, как принято в десктопных приложениях, сложно. Соответственно еще одной важной особенностью десктопных систем является то что они не ориентированы на так называемых XiP (eXecute In Place) метод, а на обычную загрузку всех секций, включая, секцию кода, в основную память.
Опыт Embox
Embox — конфигурируемая ОС РВ позволяющая запускать прикладные приложения и библиотеки разработанные для Linux на микроконтроллерах. Это достигается с помощью нескольких особенностей Embox.
- Первое. Embox использует систему сборки Mybuild с собственным языком описания модулей и системы. Mybuild анализирует зависимости и генерирует различные артефакты, в том числе заголовочные файлы, линкер скрипты и Makefile-ы. Все это позволяет существенно уменьшить количество требуемой памяти и вообще не включать те части которые не используются.
- Второе. Embox поддерживает POSIX. Это собственно позволяет использовать прикладное ПО фактически без изменений.
- Третье. Статическая линковка используется чтобы избежать проблем с единым адресным пространством, уменьшить размер образа и включать только требуемые части. На разных стадиях собираются разные части системы, но окончательно все (ядро, все подсистемы, библиотеки и приложения) линкуется в единый образ. В нем есть вся информация обо всех символах в образе. И хотя в образе может быть много приложений со стандартными точками входа int main(..), но в результирующем образе эти символы будут заменены на другие, хранящие полное имя модуля и символ main .
- Четвертое. Нам пришлось реализовать рантайм для C++, поскольку многие популярные приложения и библиотеки используют плюсы.
- Пятое. Мы в систему сборки добавили возможность использовать
./configure; make; make install
Предварительно скачав откуда-то исходники и наложив необходимые патчи.
Заключение
В результате Embox позволяет достаточно легко осуществить перенос ПО из Linux и запустить его на микроконтроллерах. Причем отладку можно произвести с помощью эмулятора qemu, а затем сконфигурировать образ под конкретную аппаратную платформу, в том числе микроконтроллер, что также существенно упрощает разработку конечной системы.
Применение десктопного ПО на микроконтроллерах дает выигрыш ведь с одной стороны, можно использовать более дешевую, надежную и менее потребляющую аппаратную платформу, а с другой стороны существенно снижаются затраты на разработку функционального ПО.
Примечания и ссылки
Plays:430 Comments:4