1.2通过网络调试Qt工程
本小节使用led_control案例演示通过网络调试Qt工程的方法。
配置环境
点击"Devices -> Devices -> Add…",选择"Generic Linux Device",然后点击"Start Wizard"确认。
在弹出的界面中,将"The name to identify this configuration"修改为"T153-Device","The device's host name or IP address"修改为单板机IP地址,本次操作单板机IP地址为"192.168.12.37","The username to log into the device"修改为"root",然后点击"Next >"。
弹出配置密钥界面,此处无需密钥文件,配置为空即可,继续点击"Next >"。
然后点击Finish连接单板机。
再次查看Devices,可见添加了一个新设备。
请打开led_control工程源码目录的led_control.pro文件,并在文件中添加以下内容。该内容作用是将编译生成的led_control可执行程序安装至单板机系统的"root"目录下。
qnx: target.path = /root
else: unix:!android: target.path = /root
!isEmpty(target.path): INSTALLS += target
点击"Projects -> Run -> Add Deploy Step",选中"Deploy files via rsync",通过rsync部署文件。
点击"Projects -> Run",选中"Environment",点击"Fetch Device Environment"获取设备环境。
点击调试按钮。目前未设置断点,所以无信息打印。
设置断点
打开led_control工程源码目录的mainwindow.cpp文件,点击代码行号的左侧边框栏即可设置断点,或直接按下F9进行设置。断点将以红色实心圆点显示,表示程序执行到该行时将暂停。本次以分别在65、166处设置断点为例进行演示。
启动调试,点击工具栏的调试按钮
(或按F5),观察程序运行。程序会执行到第一个断点处暂停,此时可观察变量的值,可调用堆栈、线程状态等信息。
调试操作
单步调试
使用单步跳过(F10)、单步进入(F11),单步跳出(Shift + F11)按键来逐行执行代码,观察程序的执行流程。按下F11可以进入函数里面进行调试,按下"Shift + F11"可跳出。可见黄色箭头已跳至对应函数。
按下F10进行调试,需重复按下F10,直到显示如下界面即停下。
然后点击led_control程序按键,可通过状态栏查看信息。
查看变量和表达式
点击led_control程序按键,可见按钮被按下时,LED的值为0。
继续执行
目前断点已是最后一个,若还存在断点,则按下F10让程序继续执行,直到遇到下一个断点或者程序结束。
调试结束
当调试完后,点击工具栏上的停止按钮,结束当前会话。
分析调试结果
可根据调试过程中观察到的信息,分析程序的执行流程和潜在问题,并进行相应的修改和优化。
1.3基于命令行方式开发
本章节使用led_control案例进行演示。演示基于命令行方式开发Qt程序的方法。
进入led_control工程源码目录,配置交叉编译工具链环境变量,执行qmake命令生成Makefile文件,再执行make命令编译生成可在单板机上正常运行的ARM端Qt程序镜像,如下图所示。
Host# source /home/tronlong/T153/environment
Host# qmake
Host# make
1.4Qt显示与触摸说明
当前系统默认采用Xorg桌面方案,Qt应用在不同运行模式下,适配不同的显示组件、触摸组件及校准工具,具体配置策略如下表所示。
其中,SBC-TLT153单板机适配的XT070YTA23R_A6 LVDS电阻屏需进行触摸校准,XT070YTD23C LVDS电容屏和TL070MIPI显示屏无需进行触摸校准。
桌面环境测试
在桌面环境下,Qt应用基于X11窗口系统运行。设备Qt编译默认搭载XCB平台插件,依托Xorg底层evdev驱动完成触摸输入识别,无需额外配置环境变量或运行参数,直接在终端执行Qt程序即可正常运行。
若使用需进行触摸校准的显示屏,请执行如下命令运行xinput_calibrator程序进行校准,根据屏幕提示,依次点击屏幕上出现的光标,校准后生成配置文件。
Target# xinput-calibrate.sh
非桌面环境测试
在非桌面环境下,Qt应用直接操作Linux帧缓冲(Framebuffer)显示画面,并依赖tslib处理触摸数据。运行Qt程序前,需正确配置tslib相关的环境变量,并在运行参数中指定运行插件。
备注:当前LVDS电阻屏运行Qt程序前,需执行export QT_QPA_FB_DISABLE_INPUT=1命令关闭Qt framebuffer输入处理,避免与tslib冲突。运行export QT_QPA_FB_DISABLE_INPUT=1后无法使用鼠标进行案例测试。
若使用需进行触摸校准的显示屏,请执行如下命令,关闭桌面环境。
Target# systemctl stop lightdm
执行如下命令,使用tslib提供的校准工具进行屏幕校准。
备注:若出现偏差,请重新校准。
Target# ts_calibrate
1.5Qt程序自启动说明
本章节以led_control案例为例,演示Qt程序自启动功能。
请将案例bin目录下可执行程序led_control拷贝至单板机系统"/root/"目录下。单板机上电启动进入系统后,执行如下命令,在"/etc/default/"下新建qtapp文件,并添加以下内容设置Qt程序运行依赖环境变量。
Target# vim /etc/default/qtapp
新增内容如下:
UNTIME_DIR=/run/user/0
DISPLAY=":0"
QT_ROOT=/usr/lib/qt-5.15.8
QT_QPA_FONTDIR=/usr/share/fonts
QT_QPA_PLATFORM_PLUGIN_PATH=/usr/lib/qt-5.15.8/plugins
QT_PLUGIN_PATH=/usr/lib/qt-5.15.8/plugins
LD_LIBRARY_PATH=/usr/lib/qt-5.15.8/lib:/usr/lib/qt-5.15.8/plugins/platforms
XAUTHORITY=/root/.Xauthority
执行如下命令,在"/etc/systemd/system/"目录下新建qtapp.service文件,并添加以下内容设置qt程序自启动服务依赖环境以及qt程序的路径。
Target# vim /etc/systemd/system/qtapp.service
新增内容如下:
[Unit]
Description=Qt App Service
Requisite=display-manager.service
After=display-manager.service
[Service]
EnvironmentFile=-/etc/default/qtapp
ExecStart=/root/led_control
Restart=always
[Install]
WantedBy=multi-user.target
执行如下命令,开启Qt程序自启动,并重启单板机。
Target# systemctl enable qtapp
Target# sync
Target# reboot
单板机重启后,Qt程序将会自启动。Qt程序运行成功后,可观察到LVDS显示屏显示LED控制界面,可通过点击下方的按钮控制LED的亮灭。如下图所示。
执行如下命令,可取消led_control程序自启动。
Target# systemctl disable qtapp