Qt for VxWorks

欲获取更多信息,请联系 Qt 公司:https://www.qt.io/contact-us/

支持架构和 VxWorks 版本

  • Qt 6.7 在 VxWorks 23.09 上进行了验证,支持架构为 ARM-v7。

如果您对后续的 Qt 版本感兴趣,请联系 Qt 专业服务。

VxWorks 的要求

Qt Widgets 应用程序

  • POSIX 支持
  • C++17 支持

Qt Quick 2 应用程序

Qt Widgets 应用程序所需的全部功能,以及以下功能:

  • GPU 设备 (GPUDEV) 用于 OpenGL ES 2.0

支持模块

大多数基本 Qt 模块 和一些附加模块得到支持。

支持基本模块

支持附加模块

注意:当运行配置工具时,您可以通过 -skip <module> 选项明确排除不受支持的或未使用的模块。

平台说明

从 Qt 5.0 版本开始,Qt 不再包含自己的窗口系统实现:QWS 不再是受支持的平台。对于单进程用例,Qt 平台抽象 是一个更优的解决方案。

有一个插件适用于 VxWorks:EGLFS。此插件的可用性取决于 Qt 的配置。

为特定设备配置

为了给特定设备构建 Qt,需要编译主机上的 Qt6 安装、工具链和 sysroot。另外,某些设备还需要针对 EGL 和 OpenGL 2.0 支持的供应商特定的适配代码。

在运行 configure 和构建 Qt 6 之前,需要在命令提示符中打开 VxWorks 开发 Shell

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

以下是BD-SL-i.MX6的示例配置。对于大多数VxWorks板,配置命令非常相似。默认情况下,Qt 6配置为使用共享库。要静态编译Qt 6,请在configure添加-static选项。

./configure \
    -cmake-generator "Ninja" \
    -icu \
    -no-feature-timezone \
    -no-feature-vulkan \
    -platform vxworks-clang \
    -qt-host-path <path_to_qt6_host_installation_dir> \
    -sysroot <path_to_vxworks_vsb_dir>/fsl_imx6_<vsb_version>_VSB \
    -qpa "eglfs" \
    -DQT_QPA_EGLFS_INTEGRATION=eglfs_viv \
    -prefix /sd0:1/qt6rtp \
    -extprefix <path_to_host_dir>/qt6rtp \
    -nomake tools \
    -nomake examples

建议使用影子构建来构建Qt 6。更多相关信息,请参阅Qt配置选项

构建和安装Qt 6

ninja
ninja install

适用于VxWorks设备的平台插件

EGLFS

EGL是OpenGL和本地窗口系统之间的接口。Qt可以使用EGL进行上下文和表面管理。然而,该API不包含平台特定的信息。创建一个本地窗口(这不一定是在屏幕上的实际窗口)仍然需要通过特定于平台的方式来完成。因此需要针对板卡或GPU特定进行适配的代码。这些适配作为EGLFS钩子提供,将单个源文件编译到平台插件中,或者作为动态加载的EGL设备集成插件。

EGLFS是一个平台插件,可以在EGL和OpenGL ES 2.0上运行Qt 6应用程序,而无需真正的窗口系统(如X11或Wayland)。除了Qt Quick 2和本地OpenGL应用程序外,它还支持软件渲染的窗口(例如QWidget)。在后一种情况下,小部件的内容使用CPU渲染成图像,然后由插件上传到纹理并进行合成。

这是适用于包含GPU的现代VxWorks设备的推荐插件。

EGLFS强制第一个顶级窗口(无论是QWidget还是QQuickView)成为全屏。此窗口也被选择为小部件窗口,其中所有其他顶级小部件(例如对话框、弹出菜单或组合框的下拉菜单)都被合成。这是因为在使用EGLFS的情况下,始终只有一个本地窗口和一个EGL窗口表面,这些属于首先创建的小部件或窗口。当应用程序存在一个整个生命周期的主窗口,并且所有其他小部件要么不是顶级小部件,要么在主窗口显示之后创建时,这种方法工作得很好。

对于基于OpenGL的窗口还有进一步的限制。从Qt 6.7开始,EGLFS支持单个全屏的GL窗口(例如,基于OpenGL的QWindowQQuickView或QGLWidget)。打开额外的OpenGL窗口或与基于QWidget的内容混合不受支持,这会导致应用程序因错误信息而终止。

如有必要,可以通过环境变量配置EGLFS

  • QT_QPA_EGLFS_FB - 覆盖了帧缓冲设备。默认为/dev/fb0。在大多数嵌入式平台上,这并不重要,因为仅使用帧缓冲区来查询设置,如显示尺寸。但在某些设备上,此参数提供了在多个显示设置中指定使用哪个显示的功能,类似于VxWorksFB中的fb参数。
  • QT_QPA_EGLFS_WIDTHQT_QPA_EGLFS_HEIGHT - 包含屏幕宽度和高度(像素)。虽然EGLFS尝试从帧缓冲设备/dev/fb0中确定尺寸,但这并不总能行得通,可能需要手动指定大小。
  • QT_QPA_EGLFS_PHYSICAL_WIDTHQT_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 - 当设置时,创建新的环境、窗口或离屏表面时忽略红色、绿色和蓝色颜色通道的大小。相反,插件请求8位通道的配置。这对于默认选中的配置少于32位或24位每像素的设备很有用,但这些配置已知不合适,例如由于色带效应。不需要更改所有应用,此变量提供了一个更容易的快捷方式来为指定设备强制24/32位像素配置。
  • QT_QPA_EGLFS_DEBUG - 当设置时,一些调试信息将打印到调试输出。例如,当创建新上下文时,将打印输入 QSurfaceFormat 和选择的EGL配置的属性。与Qt Quick的 QSG_INFO 变量一起,这可以提供有关EGL配置故障排除问题的有用信息。
  • QT_QPA_EGLFS_INTEGRATION - 除了编译内 钩子 外,还可以以动态加载插件的形式提供特定于设备和供应商的适应。此环境变量强制使用特定的插件。例如,将其设置为 eglfs_kms 使用KMS/DRM后端。这仅在未指定设备makesspec中的静态编译钩子时才为选项。实际上,传统的编译内钩子很少使用,几乎所有后端现在都已迁移到插件。设备makesspec仍包含一个相关的 EGLFS_DEVICE_INTEGRATION 条目:特定设备的首选后端名称。这是可选的,但非常有用,可以避免在目标系统中有多个插件时设置此环境变量。在桌面环境中,根据是否存在 DISPLAY 环境变量,优先选择KMS或X11后端。

除了 QT_QPA_EGLFS_DEBUG,EGLFS 还支持Qt更现代的分类日志系统。以下日志类别可用

  • qt.qpa.egldeviceintegration – 启用对动态加载后端的日志记录。非常有用,可以检查正在使用哪个后端。
  • qt.qpa.input – 使evdev输入处理器启用调试输出。非常有用,可以检查给定的输入设备是否被正确识别并打开。

运行Qt应用程序

以下示例显示如何使用共享库构建Qt 6时启动应用程序。使用静态构建的Qt 6,没有必要使用LD_LIBRARY_PATH环境变量。此变量仅用于指向VxWorks共享库的位置(例如libc和OpenGL ES 2.0)。对于Qt 6静态库不需要。

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

限制

显存

拥有固定量专用显存的系统可能在运行基于 Qt Quick 或类似 QOpenGLWidget 类的 Qt 应用程序之前需要额外注意。默认设置可能不足以支持这类应用程序,尤其是在高分辨率(例如,全高清)屏幕上显示时。在这种情况下,它们可能会以意外的方式进行失败。因此,建议确保至少有 128 MB 的 GPU 内存可用。对于没有为 GPU 保留固定内存的系统,这不是问题。

© 2024 Qt 公司。包含在此的文档贡献者的文档版权属于他们各自的所有者。本提供的文档根据自由软件基金会发布的 GNU 自由文档许可版本 1.3 的条款提供。Qt 和相应标志是芬兰和/或全球其他地区的 The Qt Company Ltd. 的商标。所有其他商标属于各自所有者。