Qt для VxWorks
Qt для VxWorks доступен только по коммерческой лицензии.
Обратитесь в The Qt Company за дополнительной информацией: https://www.qt.io/contact-us/
Поддерживаемые архитектуры и версии VxWorks
Qt 5.5 в настоящее время протестирован и поддерживается на VxWorks 7 версии SR0480 от 2016-09-16. Поддерживаемая архитектура — ARM-v7.
Если вас интересуют более поздние версии Qt, пожалуйста, обратитесь в Qt professional services: обратитесь.
Пакет исходного кода 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 /sd1:1/qt5rtp -sysroot <path_to_vxworks_vsb_dir>/fsl_imx6_1_1_11_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 с помощью отдельной сборки. Дополнительную информацию см. в разделе Параметры конфигурации 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— Переопределяет устройство буфера кадров. Значение по умолчанию —/dev/fb0. На большинстве встраиваемых платформ это не так важно, так как буфер кадров используется только для запроса параметров, таких как размеры дисплея. Однако на некоторых устройствах этот параметр позволяет указать, какой дисплей использовать в конфигурациях с несколькими дисплеями, аналогично параметруfbв VxWorksFB. -
QT_QPA_EGLFS_WIDTHиQT_QPA_EGLFS_HEIGHT— Содержат ширину и высоту экрана в пикселях. Хотя eglfs попытается определить размеры из устройства буфера кадров /dev/fb0, это не всегда работает, и может потребоваться ручное указание размеров. -
QT_QPA_EGLFS_PHYSICAL_WIDTHиQT_QPA_EGLFS_PHYSICAL_HEIGHT— Физическая ширина и высота экрана в миллиметрах. На платформах, где устройство буфера кадров /dev/fb0 недоступно или запрос не удаётся, значения вычисляются на основе DPI по умолчанию 100. Эта переменная может использоваться для переопределения таких значений по умолчанию. -
QT_QPA_EGLFS_DEPTH— Переопределяет глубину цвета для экрана. На платформах, где устройство буфера кадров /dev/fb0 недоступно или запрос не удаётся, используется значение по умолчанию 32. Эту переменную можно использовать для переопределения таких значений по умолчанию. Обратите внимание, что это влияет только на значение глубины цвета, сообщаемое QScreen. Это не имеет связи с конфигурациями EGL и глубиной цвета, используемой для рендеринга OpenGL. -
QT_QPA_EGLFS_SWAPINTERVAL— По умолчанию запрашивается интервал переключения1. Это позволяет синхронизироваться с вертикальной частотой обновления дисплея. Значение можно переопределить с помощью этой переменной среды. Например, передача 0 отключит блокировку при переключении, что позволит работать с максимальной скоростью без синхронизации. -
QT_QPA_EGLFS_FORCE888— При установке, размеры каналов цвета Red, Green и Blue игнорируются при создании нового контекста, окна или оффскрин-поверхности. Вместо этого плагин запросит конфигурацию с 8 битами на канал. Это может быть полезно на устройствах, где конфигурации с менее чем 32 или 24 битами на пиксель выбираются по умолчанию, но, например, из-за эффекта полос, не подходят. Вместо изменения всех приложений, эта переменная предоставляет более простой способ принудительно задавать конфигурации 24/32 бпп для данного устройства. -
QT_QPA_EGLFS_DEBUG— При установке, некоторые отладочные сведения выводятся в отладочный вывод. Например, входной QSurfaceFormat и свойства выбранной конфигурации EGL выводятся при создании нового контекста. Вместе с переменнойQSG_INFOQt Quick, это может предоставить полезную информацию для устранения неполадок, связанных с конфигурацией EGL. -
QT_QPA_EGLFS_INTEGRATION— В дополнение к встроенным hooks, также можно предоставить адаптацию, специфичную для устройства или поставщика, в виде динамически загружаемых плагинов. Эта переменная среды навязывает определённый плагин. Например, установка её в eglfs_kms использует бэкэнд KMS/DRM. Это возможно только тогда, когда не были указаны статические, встроенные hooks в спецификациях устройства. На практике традиционные встроенные hooks редко используются, почти все бэкэнды теперь перенесены в плагины. В спецификациях устройства по-прежнему есть релевантнаяEGLFS_DEVICE_INTEGRATIONзапись: имя предпочтительного бэкэнда для данного устройства. Это необязательно, но очень полезно, чтобы избежать необходимости устанавливать эту переменную среды в случае, если в целевой системе присутствует более одного плагина. В настольной среде бэкэнды KMS или X11 имеют приоритет, в зависимости от наличия переменной средыDISPLAY.
В дополнение к QT_QPA_EGLFS_DEBUG, eglfs также поддерживает более современную систему категорированного логирования Qt. Доступны следующие категории логирования:
-
qt.qpa.egldeviceintegration— Включает логирование для динамически загружаемых бэкэндов. Очень полезно для проверки, какой бэкэнд используется. -
qt.qpa.input— Включает вывод отладки от обработчика ввода evdev. Очень полезно для проверки, был ли данный устройство ввода правильно распознан и открыт.
Поток рендеринга графа сцен Qt Quick
Граф сцен — это графическое представление сцены элементов. Его можно рассматривать как графическую глубокую копию, независимую структуру, содержащую достаточную информацию для рендеринга всех элементов.
На многих платформах граф сцен будет рендериться в отдельном потоке рендеринга, в то время как основной поток GUI подготавливает состояние следующего кадра.
В некоторых случаях, когда приложение сложное, например, его граф сцен содержит множество элементов, граф сцен может потреблять больше памяти стека, чем доступно по умолчанию для потока рендеринга. Размер стека памяти по умолчанию составляет 64 КБ. С помощью переменной среды QSG_RENDERTHREAD_STACK_SIZE можно увеличить размер стека, доступный для потока рендеринга графа сцен.
VxWorksFB
Этот плагин записывает данные непосредственно в буфер кадров. Поддерживается только программный рендеринг. Обратите внимание, что на некоторых конфигурациях производительность дисплея может быть ограничена.
Плагин vxworksfb позволяет указать дополнительные параметры, передав их в переменную среды QT_QPA_PLATFORM или параметр командной строки -platform. Например, QT_QPA_PLATFORM=vxworksfb:fb=/dev/fb1 указывает, что устройство буфера кадров /dev/fb1 должно использоваться вместо значения по умолчанию fb0. Несколько параметров могут быть заданы, разделяя их двоеточием.
-
fb=/dev/fbN— Указывает устройства буфера кадров. В конфигурациях с несколькими дисплеями это обычно позволит запускать приложение на разных дисплеях. На данный момент нет возможности использовать несколько буферов кадров из одного приложения Qt. -
size=<width>x<height> — Указывает размер экрана в пикселях. Плагин попытается запросить размеры дисплея, как физические, так и логические, из устройства буфера кадров. Однако это может не всегда привести к правильным результатам, и поэтому может потребоваться явное указание значений. -
mmSize=<width>x<height> — Физическая ширина и высота в миллиметрах. -
offset=<width>x<height> — Смещение в пикселях, указывающее верхний левый угол экрана. По умолчанию положение находится в(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.14/vxworks.html