当前位置: 首页 > ai >正文

海思3519V200ARM Linux 下移植 Qt5.8.0

一、移植背景及意义

海思3519V200是一款基于ARM架构的嵌入式芯片,广泛应用于智能安防、工业控制等领域。在这些应用场景中,对设备的图形用户界面(GUI)有着越来越高的要求。Qt5.8.0作为一个功能强大、跨平台的GUI开发框架,能够帮助开发者快速开发出美观、高效的用户界面。将其移植到海思3519V200平台上,可以极大地提升嵌入式设备的人机交互体验,满足市场需求。

二、移植准备

1.硬件环境

准备海思3519V200开发板一台,并确保其能够正常启动运行。同时,还需要一台用于交叉编译的PC主机,通常配置为x86架构的Linux系统,如Ubuntu 16.04或更高版本。

2.软件环境

在PC主机上安装适合海思3519V200的交叉编译工具链,如arm-linux-gnueabi-gcc或arm-himix200-linux-g++等。安装必要的依赖库和工具,如build-essential、libgtk2.0-dev、libudev-dev、libssl-dev等,可以通过运行以下命令进行安装:

sudo apt-get install build-essential libgtk2.0-dev libudev-dev libssl-dev

从Qt官网(Index of /archive/qt)下载适合嵌入式Linux的Qt5.8.0版本的源码包,如qt-everywhere-opensource-src-5.8.0.tar.xz,并将其传输到开发主机上并解压。

三、交叉编译

1.配置Qt源码

进入Qt源码目录,根据海思3519V200平台的特点和需求,编写一个配置脚本(如configure.sh),常用的配置选项及其含义如下:

  • -prefix:指定Qt库的安装路径,如/home/qt-5.8.0

  • -release:指定生成发布版本的Qt库,提高性能和稳定性。

  • -opensource:声明使用开源版本的Qt。

  • -confirm-license:确认接受Qt的开源协议。

  • -static:生成静态库,便于程序在板端运行,减少对库加载路径的配置。

  • -qt-zlib-qt-libpng-qt-libjpeg-qt-freetype:使用Qt库自带的zlib、libpng、libjpeg、freetype等库,避免因系统缺少这些库而导致的编译或运行问题。

  • -no-pch:不使用预编译头文件,减少编译过程中的潜在问题。

  • -no-avx-no-openssl-no-cups-no-dbus-no-opengl-no-glib:根据海思3519V200平台的特点和需求,禁用一些不必要的功能和库,如AVX指令集、OpenSSL加密库、CUPS打印系统、DBus通信框架、OpenGL图形库、Glib库等。

  • -xplatform:指定交叉编译平台,如linux-arm-himix200-g++

  • -nomake examples-nomake tests:不编译示例和测试代码,减少编译时间和生成文件的大小。

2.运行配置脚本

在终端中进入Qt源码根目录,运行以下命令使配置脚本具有执行权限,并执行该脚本:

chmod +x configure.sh
./configure.sh

配置过程中可能会提示缺少一些依赖库或工具,根据提示安装相应的依赖。

3.编译和安装

配置完成后,运行以下命令进行编译和安装:

make -jN
sudo make install

其中N为编译线程数,可根据主机性能设置。编译完成后,Qt库将被安装到指定的路径下。

四、修改LinuxFB插件

海思3519V200使用Linux Frame Buffer(LinuxFB)作为图形后端。在使用LinuxFB之前,需要先初始化MPP(Media Processing Platform)系统以及VO(Video Output)模块,否则直接打开fb会报权限不允许的错误。具体步骤如下:

1.修改插件源码

进入qt-everywhere-opensource-src-5.8.0/qtbase/src/plugins/platforms/linuxfb目录,找到qlinuxfb.cpp文件。在文件中添加MPP和VO初始化的代码,确保在打开fb设备之前完成相关的初始化工作。例如,在QLinuxFbScreen::connectToFramebuffer函数中添加以下代码:

// 初始化MPP系统
if (mpp_component_init() != 0) {qFatal("Failed to initialize MPP system");
}
// 初始化VO模块
vo_cfg_t voCfg;
voCfg.ePixFormat = VO_PIXEL_FORMAT_ARGB8888; // 根据实际需求设置像素格式
voCfg.eDynamicRange = VO_DYNAMIC_RANGE_SDR;
voCfg.eWorkMode = VO_WORK_MODE_NORMAL;
voCfg.eOutputType = VO_OUTPUT_TYPE_FB;
if (vo_init(&voCfg) != 0) {qFatal("Failed to initialize VO module");
}

2.重新编译插件

修改完成后,重新编译LinuxFB插件:

make
make install

此时,LinuxFB插件将适配海思3519V200平台,能够正确地与设备的图形硬件进行交互。

五、开发板移植

1.复制文件

将安装好的Qt库和相关文件复制到海思3519V200开发板的文件系统中对应的位置,一般为/usr/local/qt5.8.0

2.配置环境变量

在开发板的/etc/profile文件中添加以下环境变量配置:

export QTDIR=/usr/local/qt5.8.0
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH

执行source /etc/profile命令使环境变量生效。

六、测试

1.运行示例程序

在开发板上运行Qt的示例程序进行测试。可以使用以下命令启动示例程序:

export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0:size=1920X1080
/usr/local/qt5.8.0/examples/widgets/widgets/mainwindow

如果程序能够正常显示图形界面并响应用户操作,说明Qt移植成功。

2.编写和编译自己的程序

自行编写一个简单的Qt应用程序,在.pro文件中添加海思相关的库和头文件。使用qmake生成Makefile,然后编译生成可执行文件,并将其复制到开发板上运行。例如,编写一个简单的main.cpp文件:

#include <QApplication>
#include <QWidget>int main(int argc, char *argv[])
{QApplication app(argc, argv);QWidget window;window.resize(800, 480);window.show();return app.exec();
}

创建一个test.pro文件:

QT       += core gui
TARGET = test
TEMPLATE = app
SOURCES += main.cpp
HEADERS  += 

使用以下命令生成Makefile并编译:

/usr/local/qt5.8.0/bin/qmake test.pro -o Makefile
make

将生成的test可执行文件复制到开发板上,并运行:

export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0:size=1920X1080
./test

如果能够正常显示一个窗口,说明Qt移植成功。

七、总结与展望

在海思3519V200 ARM Linux下成功移植Qt5.8.0,为嵌入式设备开发丰富的图形界面提供了强大的支持。通过合理的配置和编译,以及对LinuxFB插件的修改,可以确保Qt在海思3519V200平台上稳定运行。在后续的开发工作中,可以基于移植好的Qt开发各种嵌入式应用,如智能安防监控界面、工业控制操作面板等。同时,随着Qt和海思技术的不断发展,需要持续关注新技术和新特性,以进一步提升嵌入式系统的性能和用户体验。

http://www.xdnf.cn/news/9054.html

相关文章:

  • 开疆智能Profinet转Profibus网关连接丹佛斯FC300变频器配置案例
  • Windows11+WSL2+Ubuntu22 安装
  • 汽车恒温器行业2025数据分析报告
  • 【Pandas】pandas DataFrame drop_duplicates
  • 【springMVC】springMVC学习系列一:springMVC的组件
  • 调度算法中的轮盘赌与锦标赛选择算子:优势对比与选择策略
  • 创建一个简易的风扇动画界面:基于 WPF 和 XAML 的实现教程
  • 第Y1周打卡——调用官方权重进行检测
  • 每日算法 -【Swift 算法】字符串转整数算法题详解:myAtoi 实现与正则表达式对比
  • 直线参数方程何时必须化为标准形式 |新高考已删
  • golang channel 的特点、原理及使用场景
  • 人工智能 - Magentic-UI与Browser Use 技术选型
  • C++基础算法————递推
  • Neural Blind Deconvolution Using Deep Priors论文阅读
  • 【Dify系列教程重置精品版】第十章:Dify与RAG
  • Guard Trace 值得吗?
  • 3.python操作mysql数据库
  • 切换目录大全
  • Voice Conversion语音转换
  • PHP:赋能Web开发的经典语言与未来演进
  • XSS跨站脚本攻击的原理、危害与防御
  • 基于PDF流式渲染的Word文档在线预览技术
  • 用MMdetection框架训练自己的数据集(全流程实战)
  • GitAny - 無需登入的 GitHub 最新倉庫檢索工具
  • AbMole| Erastin(571203-78-6,M2679,铁死亡诱导剂)
  • 基于MATLAB的大规模MIMO信道仿真
  • 系统架构中的限流算法(一)
  • 两个Ubuntu机器,设置共享目录实时同步
  • React的单向数据绑定
  • 力扣热题-有向图中最大颜色值