Запуск Qt на микроконтроллерах STM32 с RTOS Embox: практическое руководство по производительности
Встраиваемые системы всё чаще должны обеспечивать расширенную функциональность. Linux предлагает обширную экосистему библиотек и инструментов, но его аппаратные требования — особенно к памяти — часто увеличивают стоимость и потребление энергии. Современные микроконтроллеры (MCU), такие как серия STM32, предоставляют достаточно ресурсов для множества умных приложений, оставаясь недорогими и энергоэффективными.
Контекст
Ранее мы демонстрировали пример Qt «moveblocks» на плате STM32F746-Discovery. Теперь мы расширяем это на пример «animatedtiles», который предлагает интерактивную 3D-графику и подходит для сенсорных экранов. Мы хотели оценить, может ли ЦПУ и память MCU обеспечить плавный рендеринг на дисплеях 480×272 или 800×480.
Сборка приложения
Сначала мы собираем пример Qt для QEMU — открытого эмулятора. Запуск приложения в QEMU устраняет необходимость предварительного выделения памяти, гарантируя наличие всех зависимостей. После проверки мы добавляем необходимые компоненты в конфигурационные файлы STM32.
Первый запуск на целевой плате
Приложение запускается на STM32F746G-Discovery, но заполняется только верхняя половина экрана. Отладка непосредственно на плате возможна, однако более эффективный подход — использовать хостовую среду для первичной отладки.
Отладка на хосте
Для запуска и отладки примера установите библиотеки Qt и QVFB (Qt Virtual Framebuffer). QVFB предоставляет виртуальный дисплей, в который Qt может рендерить. Соберите QVFB по официальной инструкции.
Запустите QVFB с разрешением платы:
./qvfb -width 480 -height 272 -nocursor
Скомпилируйте Qt с профилем embedded (без X11) и отключите ненужные модули:
./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
Соберите и запустите animatedtiles с QVFB:
./examples/animation/animatedtiles/animatedtiles -qws -display QVFb:0
Приложение снова занимает только верхнюю половину экрана. Проверка examples/animation/animatedtiles/main.cpp показывает, что представление отображается в оконном режиме. Добавление флага -fullscreen решает проблему.
Развёртывание на STM32F746-Discovery
После изменения исходного кода мы пересобираем приложение для Embox и запускаем в QEMU. При запуске на физической плате возникает ошибка «Out Of Memory», указывающая на недостаточную кучу. Для определения требуемого размера используем инструмент Massif из Valgrind.
valgrind --tool=massif --massif-out-file=animatedtiles.massif ./examples/animation/animatedtiles/animatedtiles -qws -fullscreen ms_print animatedtiles.massif > animatedtiles.out
Massif сообщает о потребности в куче примерно 2,7 МБ. Увеличение кучи до 3 МБ в конфигурации Embox позволяет запустить демо в полноэкранном режиме.
Развёртывание на STM32F769I-Discovery
Плата STM32F769I-Discovery оснащена дисплеем 800×480 и 16 МБ внешней SDRAM. Кадрбуфер сам по себе потребляет ~0,8 МБ (800×480×2 байта). Нам нужно только скорректировать размер кучи.
Запустите QVFB для большего разрешения:
./qvfb -width 800 -height 480 -nocursor &
Запустите Massif снова:
valgrind --tool=massif --massif-out-file=animatedtiles.massif ./examples/animation/animatedtiles/animatedtiles -qws -fullscreen ms_print animatedtiles.massif > animatedtiles.out
Massif сообщает ~6 МБ кучи. Настройка кучи на 6 МБ обеспечивает полноэкранную работу на плате STM32F769I.

Посмотрите демо в видео ниже или воспроизведите шаги, следуя инструкциям на нашем GitHub wiki.
Примечания
- https://habr.com/ru/company/embox/blog/459730/ (на русском, также доступно на английском: https://sudonull.com/post/25508-Porting-Qt-to-STM32-Embox-Blog)
- https://alexkalmuk.medium.com/a-little-about-graphics-subsystem-internals-on-microcontrollers-d952cfd0966a
Антон Бондарев — основатель Embox RTOS. Получил степень магистра электротехники в Санкт-Петербургском электротехническом университете (ЛЭТИ) в 2003 году, позже окончил аспирантуру по программной инженерии в СПбГУ. Более 20 лет опыта во встраиваемых и системных программах, руководит проектом Embox.
Александр Калмук — сооснователь Embox RTOS. Имеет степень магистра математики и программной инженерии в СПбГУ (2014), прошёл аспирантуру по теории управления. Более десяти лет занимается программированием встраиваемых систем, ключевой участник разработки Embox.
Связанный контент
- Использование Linux с критическими приложениями: как смешивать масло и воду?
- Зачем мне Yocto Project для моего IoT-проекта?
- Предвосхищение потребности в экспертизе Automotive Grade Linux
- MCU позволяет использовать Linux для промышленного IoT
- Open-source платформа нацеливается на IoT с встраиваемым Linux
- Драйверы устройств Embedded Linux: понимание их роли
- OTA-обновления для Embedded Linux, часть 1 — Фундаменты и реализация
- Как установить безопасный встраиваемый веб-сервер на WiFi-устройство за $3
- Освойте бесконечный жизненный цикл разработки ПО для подключённых систем — или он освоит вас
Для получения большего контента по Embedded подпишитесь на еженедельную рассылку Embedded.
Встроенный
- Почему Linux движет облаком: исчерпывающее руководство
- Linux Cloud Hosting vs Windows Cloud Hosting: что выбрать для вашего бизнеса
- Классификация красителей по применению: от реактивных к дисперсным — обзор отрасли
- ST запустила STM32MP1: двухъядерный Arm Cortex MP1 с OpenSTLinux и низким потреблением
- ROHM запускает PMIC BD71850MWV для процессоров NXP i.MX 8M Nano
- Sensor Telemetry 2.0.1 — продвинутый мониторинг температуры с Azure IoT Hub
- Java 10: улучшение производительности через AppCDS (Application Class-Data Sharing)
- Бегущий шов: основная технология кладки кирпича
- Управление кластерами на PLCnext: Использование Kubernetes для промышленной автоматизации
- Оптимизация Java 9 приложений на PLCnext Control с помощью jlink