Spec-Zone.ru › Qt 5.9

Qt для VxWorks

Qt для VxWorks доступен только по коммерческой лицензии.

Свяжитесь с компанией Qt для получения дополнительной информации: https://www.qt.io/contact-us/

Поддерживаемые архитектуры и версии VxWorks

Qt 5.5 в настоящее время протестирован и поддерживается на VxWorks 7 release SR0480 2016-09-16. Поддерживаемая архитектура — ARM-v7.

Пакет исходных кодов Qt для VxWorks

Qt для VxWorks предоставляется через Qt Account под именем Qt 5.5.1 > Qt VxWorks Платформенный пакет исходных кодов.

Требования к VxWorks

Приложения QtWidget

  • Устройство фреймбуфера (FBDEV)
  • Поддержка Evdev (режим совместимости)
  • Поддержка POSIX
  • Поддержка C++11

Приложения Qt Quick 2

Все функции, необходимые для приложений QtWidget, а также следующие:

  • Устройство графического процессора (GPUDEV) для OpenGL ES 2.0

Поддерживаемые модули

Практически все необходимые модули Qt и некоторые дополнительные модули поддерживаются.

Ограничения для основных модулей

Модуль Qt Поддерживаемые функции Примечания
Qt Multimedia Аудио SoundEffect, QSound, QSoundEffect и QAudioOutput
Qt Multimedia Widgets Не поддерживается
Qt WebKit Не поддерживается
Qt WebKit Widgets Не поддерживается

Поддерживаемые дополнения

Дополнение Qt Примечания
Qt Charts Версия 2.0.1
Qt Data Visualization Версия 1.2.1
Qt Virtual Keyboard Версия 2.0
Qt Quick Compiler Версия 3.0
Qt Concurrent
Qt Graphical Effects
Qt Image Formats
Qt OpenGL Только OpenGL ES 2

Примечание: Предоставлено для облегчения переноса с Qt 4.x. Используйте классы QOpenGL в Qt GUI для нового кода

Qt Platform Headers
Qt SVG
Qt XML Patterns

Примечание: Вы можете явно исключить неподдерживаемые или неиспользуемые модули из сборки с помощью параметра -skip <module> при запуске инструмента configure.

Примечания к платформе

С выпуском Qt 5, Qt больше не содержит собственной реализации системы окон: QWS больше не поддерживается как платформа. Для однопроцессных случаев использования Qt Platform Abstraction — это более совершенное решение.

Существует два плагина платформы, которые могут использоваться на VxWorks: EGLFS и VxWorksFB. Доступность этих плагинов зависит от конфигурации Qt. Плагин платформы по умолчанию также зависит от устройства. Например, на многих платах eglfs будет выбран в качестве плагина по умолчанию. Если плагин по умолчанию не подходит, можно использовать параметр переменной среды QT_QPA_PLATFORM для запроса другого плагина. В качестве альтернативы, для быстрых тестов, можно использовать командную строку -platform с тем же синтаксисом.

Конфигурация для конкретного устройства

Компиляция Qt для данного устройства требует компилятора и sysroot. Кроме того, некоторые устройства требуют кода адаптации, специфичного для поставщика, для поддержки EGL и OpenGL ES 2.0. Это неактуально для платформ без ускорения, например, тех, которые используют плагин VxWorksFB, но ни OpenGL, ни Qt Quick 2 не будут работать в такой настройке.

В каталоге qtbase/mkspecs/devices содержатся конфигурационные файлы и код адаптации графики для ряда устройств. Например, vxworks-imx6 содержит настройки сборки, такие как оптимальные флаги компилятора и компоновщика, для серии Freescale iMX6, и либо реализацию eglfs-хуков (код адаптации, специфичный для поставщика), либо ссылку на подходящий плагин интеграции устройства eglfs. Устройство выбирается с помощью параметра -device инструмента configure. Имя, указанное после этого аргумента, должно, по крайней мере частично, совпадать с одним из подкаталогов в каталоге devices.

Перед запуском configure и компиляцией Qt 5 необходимо открыть VxWorks 7 Development Shell в командной строке.

  • Linux:
    cd <VxWorks 7 installation directory>
    ./wrenv.sh -p vxworks-7
  • Windows:
    cd <VxWorks 7 installation directory>
    wrenv -p vxworks-7

Ниже приведен пример конфигурации для BD-SL-i.MX6. Для большинства плат VxWorks команда configure будет очень похожей. По умолчанию Qt 5 настроен на использование динамических библиотек. Для компиляции Qt 5 со статическими библиотеками добавьте параметр -static для configure.

./configure -commercial -confirm-license -device vxworks-imx6 -device-option CROSS_COMPILE=arm -prefix /sd0:1/qt5rtp -sysroot <path_to_vxworks_vsb_dir>/fsl_imx6_1_1_6_0_VSB -no-gcc-sysroot -extprefix <path_to_host_dir>/qt5rtp -hostprefix <path_to_host_dir>/qt5rtp -no-openssl -nomake tools -nomake examples

Наиболее важные параметры — -device, -device-option CROSS_COMPILE=<arch>, -sysroot и -no-gcc-sysroot. Указывая -sysroot, файлы заголовков и библиотеки, используемые для проверки возможностей configure, а также Qt, будут взяты из указанного местоположения, а не из стандартных расположений на компьютере. Это означает, что установка пакетов разработки на хост-машине не имеет значения. Вместо этого, заголовки и библиотеки для целевой архитектуры (например, ARM) должны присутствовать в sysroot.

Рекомендуется собирать Qt 5 с использованием shadow build. Более подробную информацию см. в разделе Параметры конфигурации Qt.

Сборка и установка Qt 5

make -j<N>
make install

Плагины платформы для устройств VxWorks

EGLFS

EGL — интерфейс между OpenGL и родной системой окон. Qt может использовать EGL для управления контекстами и поверхностями, однако API не содержит специфики платформы: создание родного окна (которое необязательно будет реальным окном на экране) всё равно должно выполняться платформенно-специфичным способом. Отсюда и необходимость кода адаптации, специфичного для платы или графического процессора. Такие адаптации предоставляются либо в виде eglfs-хуков, одного исходного файла, компилируемого в плагин платформы, либо в виде динамически загружаемых плагинов интеграции устройств EGL.

EGLFS — это плагин платформы для запуска приложений Qt 5 поверх EGL и OpenGL ES 2.0 без реальной системы окон (например, X11 или Wayland). Помимо приложений Qt Quick 2 и нативных приложений OpenGL, он поддерживает и окна, отрисовываемые программным способом (например, QWidget). В последнем случае содержимое виджетов отрисовывается процессором в изображения, которые затем загружаются в текстуры и компонуются плагином.

Это рекомендуемый плагин для современных устройств VxWorks с графическим процессором.

EGLFS заставляет первое окно верхнего уровня (будь то QWidget или QQuickView) стать полноэкранным. Это окно также выбирается в качестве корневого окна виджета, в которое компонуются все остальные окна верхнего уровня (например, диалоговые окна, всплывающие меню или раскрывающиеся списки). Это необходимо, потому что с EGLFS всегда есть ровно одно родное окно и поверхность окна EGL, и они принадлежат тому виджету или окну, которое создаётся первым. Этот подход хорошо работает, когда существует главное окно, которое существует на протяжении всего жизненного цикла приложения, а все остальные виджеты являются либо не основными, либо создаются позднее, после того, как основное окно отображается.

Существуют дополнительные ограничения для окон, основанных на OpenGL. По состоянию на Qt 5.3, eglfs поддерживает одно полноэкранное окно GL (например, окно OpenGL на основе QWindow, QQuickView или QGLWidget). Открытие дополнительных окон OpenGL или смешивание таких окон с контентом на основе QWidget не поддерживается и приведёт к завершению приложения с сообщением об ошибке.

При необходимости, eglfs можно настроить с помощью переменных окружения:

  • QT_QPA_EGLFS_FB — Заменяет устройство framebuffer. Значение по умолчанию — /dev/fb0. На большинстве встраиваемых платформ это не очень актуально, поскольку framebuffer используется только для запроса параметров, таких как размеры дисплея. Однако на некоторых устройствах этот параметр позволяет указать, какой дисплей использовать в конфигурациях с несколькими дисплеями, аналогично параметру fb в VxWorksFB.
  • QT_QPA_EGLFS_WIDTH и QT_QPA_EGLFS_HEIGHT — Содержат ширину и высоту экрана в пикселях. Хотя eglfs попытается определить размеры по устройству framebuffer /dev/fb0, это не всегда работает, и может потребоваться ручное указание размеров.
  • QT_QPA_EGLFS_PHYSICAL_WIDTH и QT_QPA_EGLFS_PHYSICAL_HEIGHT — Физическая ширина и высота экрана в миллиметрах. На платформах, где устройство framebuffer /dev/fb0 недоступно или запрос не успешен, значения вычисляются на основе значения DPI по умолчанию 100. Эта переменная может использоваться для переопределения любых таких значений по умолчанию.
  • QT_QPA_EGLFS_DEPTH — Переопределяет глубину цвета для экрана. На платформах, где устройство framebuffer /dev/fb0 недоступно или запрос не успешен, используется значение по умолчанию 32. Эта переменная может использоваться для переопределения любых таких значений по умолчанию. Обратите внимание, что это влияет только на значение глубины цвета, сообщаемое QScreen. Она не имеет связи с конфигурациями EGL и глубиной цвета, используемой для рендеринга OpenGL.
  • QT_QPA_EGLFS_SWAPINTERVAL — По умолчанию будет запрошен интервал обмена 1. Это позволяет синхронизировать процесс с вертикальной частотой обновления дисплея. Значение может быть переопределено с помощью этой переменной среды. Например, передача 0 отключит блокировку при обмене, что позволит работать с максимальной скоростью без синхронизации.
  • QT_QPA_EGLFS_FORCE888 — При установке этого значения размеры каналов красного, зеленого и синего цвета игнорируются при создании нового контекста, окна или offscreen-поверхности. Вместо этого плагин запросит конфигурацию с 8 битами на канал. Это может быть полезно на устройствах, где по умолчанию выбираются конфигурации с менее чем 32 или 24 битами на пиксель, но известно, что они не подходят, например, из-за эффекта «полос». Вместо изменения всех приложений эта переменная предоставляет более простой способ принудительно использовать конфигурации 24/32 бпп для данного устройства.
  • QT_QPA_EGLFS_DEBUG — При установке этого значения в выходные данные отладки выводятся некоторые отладочные сведения. Например, входной QSurfaceFormat и свойства выбранной конфигурации EGL выводятся при создании нового контекста. В сочетании с переменной QSG_INFO Qt Quick это может предоставить полезную информацию для устранения неполадок, связанных с конфигурацией EGL.
  • QT_QPA_EGLFS_INTEGRATION — В дополнение к встроенным плагинам также можно предоставить адаптацию, специфичную для устройства или поставщика, в форме динамически загружаемых плагинов. Эта переменная среды принудительно использует определенный плагин. Например, установка значения eglfs_kms будет использовать бэкенд KMS/DRM. Это возможно только в том случае, если в описании устройства не указаны статические, встроенные плагины. На практике традиционные встроенные плагины редко используются, практически все бэкэнды теперь переведены на плагины. В описании устройства по-прежнему содержится соответствующая EGLFS_DEVICE_INTEGRATION запись: имя предпочтительного бэкенда для данного устройства. Это необязательно, но очень полезно, чтобы избежать необходимости установки этой переменной среды в случае наличия более одного плагина в целевой системе. В настольной среде бэкэнды KMS или X11 имеют приоритет в зависимости от наличия переменной среды DISPLAY.

В дополнение к QT_QPA_EGLFS_DEBUG, eglfs также поддерживает более современную категоризированную систему логирования Qt. Доступны следующие категории логирования:

  • qt.qpa.egldeviceintegration — Включает логирование для динамически загружаемых бэкэндов. Очень полезно для проверки используемого бэкенда.
  • qt.qpa.input — Включает вывод отладки от обработчика входных данных evdev. Очень полезно для проверки, было ли правильно распознано и открыто данное устройство ввода.

Поток рендеринга сцены Qt Quick

Графическое представление сцены Item называется графической схемой. Ее можно рассматривать как графическую копию, независимую структуру, содержащую достаточную информацию для рендеринга всех элементов.

На многих платформах графическая схема даже будет рендериться в отдельном потоке рендеринга, в то время как поток GUI готовит состояние следующего кадра.

В некоторых случаях, когда приложение сложное, например, его графическая схема содержит много элементов Item, графическая схема может потреблять больше памяти стека, чем доступно по умолчанию для потока рендеринга. Размер памяти стека по умолчанию составляет 64 КБ. С помощью переменной среды QSG_RENDERTHREAD_STACK_SIZE можно увеличить размер стека, доступный для потока рендеринга графической схемы.

VxWorksFB

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

Плагин vxworksfb позволяет задавать дополнительные параметры, передавая их в переменную среды QT_QPA_PLATFORM или опцию командной строки -platform. Например, QT_QPA_PLATFORM=vxworksfb:fb=/dev/fb1 указывает, что устройство framebuffer /dev/fb1 должно использоваться вместо значения по умолчанию fb0. Несколько параметров могут быть заданы, разделяя их двоеточием.

  • fb=/dev/fbN — Указывает устройства framebuffer. В конфигурациях с несколькими дисплеями это обычно позволит запускать приложение на разных дисплеях. На данный момент нет способа использовать несколько framebuffer из одного приложения Qt.
  • size=<ширина>x<высота> — Указывает размер экрана в пикселях. Плагин попытается запросить размеры дисплея, как физические, так и логические, из устройства framebuffer. Однако это может не всегда привести к правильным результатам, и поэтому может потребоваться явное указание значений.
  • mmSize=<ширина>x<высота> — Физическая ширина и высота в миллиметрах.
  • offset=<ширина>x<высота> — Смещение в пикселях, указывающее верхний левый угол экрана. По умолчанию положение находится в (0, 0).

Входные данные

При отсутствии системного окна мышь, клавиатура и сенсорный ввод считываются непосредственно через evdev. Обратите внимание, что для этого требуется, чтобы узлы устройств /input/event* были доступны для чтения пользователю. eglfs и vxworksfb имеют весь код обработки входных данных evdev, встроенный в них.

Входные данные в eglfs и vxworksfb

Параметры, такие как имя узла устройства, можно задать в переменных среды QT_QPA_EVDEV_MOUSE_PARAMETERS, QT_QPA_EVDEV_KEYBOARD_PARAMETERS и QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS. Кроме того, встроенные обработчики входных данных можно отключить, установив QT_QPA_EGLFS_DISABLE_INPUT или QT_QPA_FB_DISABLE_INPUT в значение 1. На некоторых сенсорных экранах координаты необходимо повернуть. Это можно включить, установив QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS в значение rotate=180.

Мышь

Курсор мыши будет отображаться, если QT_QPA_EGLFS_HIDECURSOR (для eglfs) или QT_QPA_FB_HIDECURSOR (для vxworksfb) не установлены, курсор мыши всегда будет отображаться, если не отключен явно через переменную среды.

Поддержка горячей подключаемости отсутствует.

Клавиатура

Обработчик клавиатуры evdev поддерживает следующие дополнительные параметры:

  • /input/... — Указывает имя устройства ввода. Если не указано, Qt найдет подходящее устройство, пройдя по доступным узлам.

Если стандартная встроенная раскладка клавиатуры недостаточно удобна, можно указать другую раскладку либо с помощью параметра keymap, либо с помощью специфичной для eglfs функции loadKeymap(). Последнее позволяет изменять раскладку во время работы. Однако обратите внимание, что это требует использования встроенного обработчика клавиатуры eglfs; это не поддерживается, когда обработчик клавиатуры загружается с помощью параметра командной строки -plugin.

Сенсорный ввод

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

Отладка устройств ввода

Можно выводить информацию в отладочный вывод, включив правило логирования qt.qpa.input, например, установив переменную среды QT_LOGGING_RULES в значение qt.qpa.input=true. Это полезно для определения используемого устройства или для устранения неполадок при обнаружении устройств.

Использование пользовательских изображений курсора мыши

eglfs поставляется со своим набором изображений курсора мыши размером 32x32. Если их недостаточно, можно предоставить пользовательский атлас курсора, установив переменную среды QT_QPA_EGLFS_CURSOR в имя файла JSON. Файл также можно встроить в приложение с помощью системы ресурсов Qt.

Например, встроенный атлас курсора с 8 изображениями курсора в строке может быть задан следующим образом:

{
  "image": ":/cursor-atlas.png",
  "cursorsPerRow": 8,
  "hotSpots": [
      [7, 2],
      [12, 3],
      [12, 12],
      ...
  ]
}

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

Поток загрузчика компонентов QML

В некоторых случаях сложное приложение (например, с использованием большого количества пользовательских компонентов QML) может привести к тому, что поток загрузчика QML будет потреблять больше памяти стека, чем 32 КБ по умолчанию. С помощью переменной среды QML_LOADERTHREAD_STACK_SIZE можно увеличить размер стека, доступный для потока загрузчика QML.

Предотвращение таймаутов в QEventDispatcher

Стандартная частота системных часов (SYS_CLK_RATE) для VxWorks 7 составляет 1/60 с или ~16,67 мс. В некоторых случаях это может привести к снижению частоты кадров приложения; в QEventDispatcher функция select блокируется на весь интервал системных часов, поскольку используется таймаут. Определением переменной среды QT_FORCE_SELECT_NOTIMEOUT=1 функция select возвращается немедленно, если новые события недоступны, и разрешение системных часов выше 10 мс, что верно для значения по умолчанию.

Запуск приложений Qt

Следующий пример показывает, как запустить приложение при построении Qt 5 с использованием динамических библиотек. При статически скомпилированном Qt 5 нет необходимости использовать переменную среды LD_LIBRARY_PATH. Эта переменная нужна только для указания местоположения динамических библиотек VxWorks (например, libc и OpenGL ES 2.0). Она не нужна для динамических библиотек Qt 5.

putenv "LD_LIBRARY_PATH=/sd0:1/lib"
cd "/sd0:1"
rtpSp("<Qt5_app>", 200, 0x100000, 0, 0x01000000)

Ограничения

Поддержка OpenSSL

Qt 5 не поддерживает OpenSSL для VxWorks, так как не поддерживает использование OpenSSL в режиме RTP.

Видеопамять

Системы с фиксированным объёмом выделенной видеопамяти могут потребовать дополнительного внимания перед запуском приложения Qt, основанного на Qt Quick или классах, таких как QOpenGLWidget. Значение по умолчанию может быть недостаточным для таких приложений, особенно когда они отображаются на экране высокого разрешения (например, Full HD). В этом случае они могут начать работать непредсказуемо. Поэтому рекомендуется убедиться, что доступно не менее 128 МБ памяти GPU. Для систем, не имеющих фиксированного объёма памяти, резервированной для GPU, эта проблема не актуальна.

vxworksfb

Используйте параметр плагина fb для указания устройства буфера кадра, которое необходимо использовать.

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.9/vxworks.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API