Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial Internet of Things >> Встроенный

Запуск приложения Linux на микроконтроллерах STM32

От встроенных систем для интеллектуальных продуктов ожидается все больше и больше функциональности. Этого легко добиться с помощью Linux, который предлагает программное обеспечение для любого случая. Но Linux требует довольно больших аппаратных ресурсов, в первую очередь памяти, поэтому целевая платформа обычно будет довольно дорогой и потреблять большое количество энергии. С другой стороны, современные микроконтроллеры (MCU) имеют много ресурсов, которых достаточно для многих интеллектуальных задач. Используя операционную систему реального времени (RTOS), такую ​​как Embox RTOS, которая позволяет использовать программное обеспечение Linux повсюду, включая микроконтроллеры, разработчикам проще разрабатывать интеллектуальные устройства, которые дешевле и потребляют меньше энергии.

В этой статье мы обсуждаем запуск базового приложения Qt на встроенном MCU, работающем под управлением Embox RTOS. Мы используем две одноядерные платы на базе Cortex-M7 (216 МГц):STM32F746g-Discovery и STM32F769i-Discovery, которые имеют сенсорные экраны с разрешением экрана 480 × 272 и 800 × 480 соответственно.

Некоторое время назад нам удалось запустить стандартный пример Qt «moveblocks» на STM32F746-Discovery [Примечание 1]. Однако мы хотели пойти дальше и запустить пример с тачскрином. Мы выбрали другой стандартный пример - «анимированные». Довольно симпатичный пример, который круто смотрится даже на десктопах. Он интерактивный, поэтому мы можем использовать сенсорный экран, а также выглядит как 3D-анимация.

Мы хотели узнать, может ли микроконтроллер STM32 обеспечить достаточную производительность. Мы не были уверены, хватит ли скорости процессора для того, чтобы эта сцена рендеринга была плавной, поскольку, как мы выяснили, даже обновление экрана для дисплея 800 × 480 - дорогостоящая операция [Примечание 2].

Здание

Прежде всего, давайте создадим наше приложение как часть Embox. Самый простой способ сделать это - создать приложение для QEMU, эмулятора с открытым исходным кодом. Использование QEMU означает, что в этом случае нам не нужно заботиться о потреблении памяти. Это поможет нам убедиться в наличии всех необходимых компонентов. Когда в QEMU были запущены «Animtile», мы легко добавили необходимые компоненты в файлы конфигурации для STM32.

Первый запуск на целевой плате

Мы успешно запустили «Animtile» на нашей целевой плате STM32F746G-Discovery, но мы заметили, что отрисовывается только верхняя половина экрана. Конечно, мы могли бы попытаться решить проблему путем немедленной отладки на плате, но есть более простой способ:сначала мы можем запустить и отладить пример в среде Linux.

Отладка на хосте

Чтобы запустить этот пример и отладить ваше приложение, вам понадобится сама библиотека Qt, а также QVFB, приложение Qt, предоставляющее виртуальный экран. Вы можете собрать QVFB, как описано в официальной документации.

Затем вы можете запустить QVFB с требуемым разрешением экрана (480 × 272 для STM32F746G-Discovery):

   ./qvfb -width 480 -height 272 -nocursor   

Вам также следует построить библиотеку Qt со встроенным профилем, а именно с опцией «-embedded». Эта опция предназначена для запуска Qt без X11 или существующей графической среды, вместо нее будет использоваться QWS (Qt Windowing System). Также мы отключили некоторые другие ненужные опции и модули. В результате получилась следующая конфигурационная строка:

  ./configure -opensource -confirm-license -debug \ -embedded -qt-gfx-qvfb -qvfb \ -no-javascript-jit -no-script -no-scripttools \ -no-qt3support -no -webkit -nomake demos -nomake examples  

Наконец, давайте создадим и запустим «анимированные». Этап сборки обычен для Qt ( qmake; make; ). Вы должны указать QVFB как отображение при запуске приложения:

   ./examples/animation/animatedtiles/animatedtiles -qws -display QVFb:0   

У нас такая же картинка в верхней половине экрана. Мы обнаружили в исходном коде (examples / animation / animatedtiles / main.cpp), что приложение запускается с «view-> show ()», то есть не в полноэкранном режиме. После этого мы полностью убедились, что для отображения приложения использовалась только верхняя половина экрана. Мы немного изменили код «Animtile», добавив опцию «-fullscreen».

Запуск на STM32F746-discovery

Мы создали наше модифицированное приложение в Embox и проверили, что оно успешно работает на QEMU. Но при запуске приложения на целевой плате мы получили ошибку «Недостаточно памяти». Значит, размера кучи в нашем конфиге не хватает для приложения. Мы решили использовать богатые инструменты разработки в Linux, чтобы решить проблему, то есть оценить требуемый размер кучи.

Мы начали наше приложение с valgrind. Valgrind - это инструмент для отладки и профилирования памяти, Massif - профилировщик кучи (это часть Valgrind).

   $ valgrind --tool =massif --massif-out-file =animatedtiles.massif. / examples / animation / animatedtiles / animatedtiles -qws -fullscreen   $ ms_print animatedtiles.massif> animatedtiles.out   

И выяснилось, что приложению требуется размер кучи около 2,7 МБ.

Мы установили размер кучи на 3 МБ в конфигурации Embox и снова запустили нашу демонстрацию. Он успешно работал в полноэкранном режиме.

Запуск на STM32F769I-Discovery.

Мы также хотели попробовать этот пример на аналогичной плате, но с большим дисплеем. В этом примере использовался STM32F769I-Discovery с разрешением экрана 800 × 480. В этом случае требуется почти 1 МБ только для фреймбуфера в 16-битном цветовом режиме (800x480x2 =768000), но на этой плате достаточно (16 МБ) внешней SDRAM. Поэтому нам нужно только оценить размер кучи.

Мы запустили QVFb с новыми разрешениями (800 × 480):

  $. / qvfb -width 800 -height 480 -nocursor & 

И используйте valgrind, как и в прошлый раз:

  $ valgrind --tool =massif --massif-out-file =animatedtiles.massif. / examples / animation / animatedtiles / animatedtiles -qws -fullscreen $ ms_print animatedtiles.massif> animatedtiles.out  

Мы выяснили, что для этого требуется около 6 МБ. Мы установили размер кучи 6 МБ, и на плате STM32F769I успешно запущено «анимированное время».


Рисунок 1:Пример анимированных объектов QT на плате STM32F769I-DISCOVERY в ОС Embox RTOS. (Источник:Embox)

Вы можете увидеть, как это работает, в этом видео (ниже), и вы можете воспроизвести результаты самостоятельно, как описано на нашей вики-странице github.

Примечания:

  1. https://habr.com/ru/company/embox/blog/459730/] (на русском языке, но также доступен сторонний перевод на английский язык:https://sudonull.com/ post / 25508-Porting-Qt-to-STM32-Embox-Blog
  2. https://alexkalmuk.medium.com/a-little-about-graphics-subsystem-internals-on-microcontrollers-d952cfd0966a

Антон Бондарев является основателем Embox RTOS. Антон окончил Санкт-Петербургский электротехнический университет (ЛЭТИ) в 2003 году со степенью магистра электротехники и учился в аспирантуре Санкт-Петербургского государственного университета по специальности «Программная инженерия». Он более 20 лет занимается встраиваемым и системным программированием. Александр Калмук является соучредителем Embox RTOS. Александр окончил Санкт-Петербургский государственный университет в 2014 году со степенью магистра математики и программной инженерии и учился в аспирантуре Санкт-Петербургского государственного университета по специальности «теория управления». Он более 10 лет занимается программированием встраиваемых систем.

Связанное содержание:

Чтобы получить больше информации о Embedded, подпишитесь на еженедельную рассылку Embedded по электронной почте.


Встроенный

  1. Руководство по облачным вычислениям в Linux
  2. Облачный хостинг Linux против облачного хостинга Windows
  3. Классификация красителей по применению
  4. ST запускает серию микропроцессоров STM32MP1 с дистрибутивом Linux
  5. ИС управления питанием поддерживает семейство прикладных процессоров
  6. Сенсорная телеметрия 2.0.1
  7. Java 10 — совместное использование данных классов
  8. Что такое текущие облигации?
  9. Управление кластером на PLCnext?
  10. Java-приложение на PLCnext Control