Qt在工業(yè)上的使用場景包括工業(yè)自動化、嵌入式系統(tǒng)、汽車行業(yè)、航空航天、醫(yī)療設備、制造業(yè)和物聯(lián)網應用。Qt被用來開發(fā)工業(yè)設備的用戶界面、控制系統(tǒng)、嵌入式應用和其他工業(yè)應用,因其跨平臺性和豐富的功能而備受青睞。
Qt能夠為工業(yè)領域帶來什么好處:
- Qt提供了強大的圖形引擎,使開發(fā)人員能夠創(chuàng)建具有吸引力和高性能的用戶界面。
- Qt允許開發(fā)人員根據(jù)具體需求定制用戶界面和功能。這對于滿足不同行業(yè)和項目的獨特需求至關重要,使工業(yè)應用能夠實現(xiàn)個性化的解決方案
- Qt提供了豐富的庫和工具,涵蓋了各種應用程序開發(fā)需求,包括圖形、網絡通信、多媒體處理、數(shù)據(jù)存儲等。這簡化了工業(yè)應用程序的開發(fā)流程
- Qt可以輕松與各種硬件設備和通信協(xié)議集成,這對于工業(yè)自動化和控制系統(tǒng)來說非常重要,因為它們需要與各種傳感器、執(zhí)行器和其他工業(yè)設備進行通信
本次開發(fā)教程的測試板卡來自創(chuàng)龍科技的TLT113-EVM國產工業(yè)評估板,基于全志科技T113-i雙核ARM Cortex-A7 + 玄鐵C906 RISC-V + HiFi4 DSP異構多核處理器設計,ARM Cortex-A7處理器單元主頻高達1.2GHz。
評估板由核心板和評估底板組成,核心板CPU、ROM、RAM、電源、晶振等所有元器件均采用國產工業(yè)級方案,國產化率100%。同時,評估底板大部分元器件亦采用國產工業(yè)級方案。核心板經過專業(yè)的PCB Layout和高低溫測試驗證,穩(wěn)定可靠,可滿足各種工業(yè)應用環(huán)境。
T113-i國產工業(yè)評估板硬件資源圖解
此外,T113-i國產工業(yè)開發(fā)板的接口資源豐富,能夠支持引出雙路網口、雙路CAN、雙路USB、雙路RS485、RS232等通信接口,同時引出LVDS LCD、TFT LCD、MIPI LCD、HDMI OUT、CVBS IN/OUT、LINE IN、MIC IN、H/P OUT等音視頻多媒體接口,板載WIFI、4G(選配)模塊,支持1080P@60fps JPEG/MJPEG視頻硬件編碼,支持4K@30fps H.265、4K@24fps H.264視頻硬件解碼,方便用戶快速進行產品方案評估與技術預研。
接下來我們來聊聊如何在創(chuàng)龍科技T113-i工業(yè)開發(fā)板上部署Qt應用。
開發(fā)板Qt運行環(huán)境
開發(fā)板SDK準備
創(chuàng)龍科技的資料中提供了開發(fā)板的SDK-T113-i_v1.0.tar.gz,需要解壓ubuntu中解壓出來:
rice@rice:~$mkdirt113//創(chuàng)建t113工作目錄,然后將壓縮包拷貝到此目錄 rice@rice:~$cdt113 .... rice@rice:~/t113$tar-zxvfSDK-T113-i_v1.0.tar.gz rice@rice:~/t113$cdT113-i_v1.0/ rice@rice:~/t113/T113-i_v1.0$ls brandybuildrootdeviceinstall_tools.shoutrtos-dsptools buildbuild.shkernelplatformtest
安裝依賴軟件,創(chuàng)龍科技提供了安裝腳本:install_tools.sh,我們執(zhí)行該腳本即可完成依賴工具的安裝:
rice@rice:~/t113/T113-i_v1.0$./install_tools.sh [sudo]passwordforrice: Readingpackagelists...Done Buildingdependencytree Readingstateinformation...Done texinfoisalreadythenewestversion(6.5.0.dfsg.1-2). 0upgraded,0newlyinstalled,0toremoveand121notupgraded. Readingpackagelists...Done Buildingdependencytree Readingstateinformation...Done pkg-configisalreadythenewestversion(0.29.1-0ubuntu2). 0upgraded,0newlyinstalled,0toremoveand121notupgraded. Readingpackagelists...Done ......
解壓Buildroot dl--dl.tar.gz,其為 Buildroot dl 目錄壓縮包,用于存放從官網下載的開源軟件包:
rice@rice:~/t113$tar-xvfdl.tar.gz-C~/t113/buildroot/buildroot-201902/
構建Qt固件
在編譯固件前,先清理一下SDK的編譯和配置生成文件:
rice@rice:~/t113/T113-i_v1.0$./build.shdistclean
rice@rice:~/t113/T113-i_v1.0$./build.shconfig Welcometomkscriptsetupprogress Allavailableplatform: 0.linux Choice[linux]:0 Allavailablelinux_dev: 0.bsp 1.dragonboard 2.longan 3.tinyos Choice[longan]:2 Allavailablekern_ver: 0.linux-5.4 Choice[linux-5.4]:0 Allavailableic: 0.t113 1.t113_i Choice[t113_i]:1 Allavailableboard: 0.evb1 1.evb1_auto 2.evb1_auto_nand 3.evb1_auto_nor 4.tlt113-evm-emmc 5.tlt113-evm-nand 6.tlt113-minievm-emmc 7.tlt113-minievm-nand Choice[tlt113-evm-nand]:5 Allavailableoutput_configs: 0.hdmi 1.lvds-lcd 2.mipi-lcd 3.tft-lcd 4.cvbs Choice[hdmi]:0 Allavailableflash: 0.default 1.nor Choice[default]:0 Allavailablebuild_root: 0.buildroot-201902 1.ubuntu Choice[buildroot-201902]:0 Allavailablegnueabi: 0.gnueabi 1.gnueabihf Choice[gnueabi]:0
設置編譯的環(huán)境變量:
rice@rice:~/t113/T113-i_v1.0$source./build/envsetup.sh
我們采用一鍵編譯 SPL、U-Boot、Linux 內核和 buildroot文件系統(tǒng)。
rice@rice:~/t113/T113-i_v1.0$./build.sh ACTIONList:mklichee;======== Executecommand:mklichee INFO:---------------------------------------- INFO:buildlichee... INFO:chip:sun8iw20p1 INFO:platform:linux INFO:kernel:linux-5.4 INFO:board:tlt113-evm-nand INFO:output:/home/rice/t113/T113-i_v1.0/out/t113_i/tlt113-evm-nand/longan INFO:---------------------------------------- INFO:buildbuildroot... Preparebrtoolchaingcc-linaro-5.3.1-2016.05-x86_64_arm-linux-gnueabi.tar.xz... make:Enteringdirectory'/home/rice/t113/T113-i_v1.0/buildroot/buildroot-201902' ...
編譯Qt庫,使其開發(fā)板固件支持Qt應用運行環(huán)境:
rice@rice:~/t113/T113-i_v1.0$./build.shqt ACTIONList:mkqt;======== Executecommand:mkqt INFO:buildQt... INFO:buildarm-linux-gnueabiversion'sQt /home/rice/t113/T113-i_v1.0/platform/framework/qt/qt-everywhere-src-5.12.5 Usingbuilt-inspecs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper OFFLOAD_TARGET_NAMES=nvptx-none OFFLOAD_TARGET_DEFAULT=1 Target:x86_64-linux-gnu Configuredwith:../src/configure-v--with-pkgversion='Ubuntu7.5.0-3ubuntu1~18.04'--with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs--enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++--prefix=/usr--with-gcc-major-version-only--program-suffix=-7--program-prefix=x86_64-linux-gnu---enable-shared--enable-linker-build-id--libexecdir=/usr/lib--without-included-gettext--enable-threads=posix--libdir=/usr/lib--enable-nls--enable-bootstrap--enable-clocale=gnu--enable-libstdcxx-debug--enable-libstdcxx-time=yes--with-default-libstdcxx-abi=new--enable-gnu-unique-object--disable-vtable-verify--enable-libmpx--enable-plugin--enable-default-pie--with-system-zlib--with-target-system-zlib--enable-objc-gc=auto--enable-multiarch--disable-werror--with-arch-32=i686--with-abi=m64--with-multilib-list=m32,m64,mx32--enable-multilib--with-tune=generic--enable-offload-targets=nvptx-none--without-cuda-driver--enable-checking=release--build=x86_64-linux-gnu--host=x86_64-linux-gnu--target=x86_64-linux-gnu Threadmodel:posix .....
打包系統(tǒng)鏡像文件,執(zhí)行之后,可以看到生成的固件文件,它默認生成兩個版本的固件,分別是:nand固件和SD卡固件,我們是采用SD卡啟動,所以使用SD卡固件。
rice@rice:~/t113/T113-i_v1.0$./build.shpack ACTIONList:mkpack;======== Executecommand:mkpack INFO:packingfirmware... INFO:UseBIN_PATH:/home/rice/t113/T113-i_v1.0/device/config/chips/t113_i/bin copyingtoolsfile copyingconfigsfile copyingproductconfigsfile /home/rice/t113/T113-i_v1.0/out/pack_out/aultls32.fex /home/rice/t113/T113-i_v1.0/out/pack_out/aultools.fex /home/rice/t113/T113-i_v1.0/out/pack_out/boot_package.cfg /home/rice/t113/T113-i_v1.0/out/pack_out/boot_package.fex ...... dsp0.fexLen:0x3fc78 Vdsp0.fexLen:0x4 BuildImg0 Dragonexecuteimage.cfgSUCCESS! ----------imageisat---------- size:613M/home/rice/t113/T113-i_v1.0/out/t113_i_linux_tlt113-evm-nand-sdboot_uart0.img packfinish
運行環(huán)境驗證
下載運行實例
將編譯打包后的固件(t113_i_linux_tlt113-evm-nand-sdboot_uart0.img)放到windows上,通過工具PhoenixCard.exe燒錄到SD卡上。將SD卡插到讀卡器上,然后插進電腦:
創(chuàng)龍科技提供了qt的demo,我們將led_control的實例拷貝到板子上:
rice@rice:~/t113/qt-demos/led_control/bin$scpled_controlroot@ip:~/
創(chuàng)龍T113-i上運行實例
關閉默認的Qt運行程序,設置qt的環(huán)境變量
root@T113-Tronlong:~#killallLauncher root@T113-Tronlong:~#source/etc/qtenv.sh add/dev/input/event1toQtApplication. findqt5installeddone
運行實例驗證Qt功能,運行效果如圖:
root@T113-Tronlong:~#./led_control
Qt開發(fā)環(huán)境
開發(fā)環(huán)境下載
Qt開發(fā)環(huán)境下載,作者是使用Qt 5.12.0,下載鏈接:https://download.qt.io/archive/qt/5.12/5.12.0/,Ubuntu需要下載:qt-opensource-linux-x64-5.12.0.run
開發(fā)環(huán)境交叉編譯環(huán)境配置
配置Debuggers
點擊菜單欄"Tools -> Options"
擊"Kits -> Debuggers -> Add -> Browse…"
選擇目標平臺的GDB,路徑:/home/rice/t113/T113-i_v1.0/out/t113_i/tlt113-evm-nand/longan/buildroot/host/usr/bin/arm-linux-gnueabi-gdb
配置交叉工具鏈
點擊菜單欄"Tools -> Options"
擊"Kits -> Compilers -> Add -> GCC -> C++ -> Browse…"
選擇目標平臺的交叉工具鏈,路徑:/home/rice/t113/T113-i_v1.0/out/t113_i/tlt113-evm-nand/longan/buildroot/host/usr/bin/arm-linux-gnueabi-g++
配置Qt Versions
點擊菜單欄"Tools -> Options"
擊"Kits -> Qt Versions -> Add -> GCC -> C++ -> Browse…"
選擇目標平臺的Qt Versions,路徑:/home/rice/t113/T113-i_v1.0/platform/framework/qt/qt-everywhere-src-5.12.5/Qt_5.12.5/bin/qmake
配置Kits
點擊菜單欄"Tools -> Options"
擊"Kits -> Kits"
將 Name 修改為"T113",Device type 選擇"Generic Linux Device",Compiler 的 C++選擇"T113-GCC",Debugger 選擇"T113-Debugger",Qt version 選擇"T113-qt5",點擊 Apply,然后點擊 OK 完成配置
開發(fā)Qt應用
作者開發(fā)了一個快速驗證硬件功能的,主要功能包含:
板載LED燈控制,代碼實現(xiàn):
staticQStringledPath="/sys/class/leds/user-led0"; voidrice::ledInit() { setLedStatus(0); ui->ledPushButton->setText("LEDOFF"); ui->ledPushButton->setStyleSheet("border-width:1px;" "border-style:solid;" "border-color:white;" "background-color:rgba(88,88,88,200)"); } voidrice::ledDeinit() { } boolrice::setLedStatus(intstatus) { QStringcmd="echo"+QString::number(status)+">"+ledPath+"/brightness"; if(system(cmd.toStdString().c_str())==-1){ printf("setledstatusfailed! "); returnfalse; } returntrue; } intrice::getLedStatus(void) { QStringcmd="cat"+ledPath+"/brightness"; FILE*fp=popen(cmd.toStdString().c_str(),"r"); if(fp==nullptr){ return-1; } charled_status[32]; if(fgets(led_status,sizeof(led_status),fp)==nullptr){ printf("fgetserror:%s ",cmd.toStdString().c_str()); pclose(fp); return-1; } pclose(fp); returnatoi(led_status); } voidrice::on_ledPushButton_clicked() { intledStatus=getLedStatus(); if(ledStatus==0){ setLedStatus(1); ui->ledPushButton->setText("LEDON"); ui->ledPushButton->setStyleSheet("border-width:1px;" "border-style:solid;" "border-color:white;" "background-color:rgba(00,205,00,255)"); } else{ setLedStatus(0); ui->ledPushButton->setText("LEDOFF"); ui->ledPushButton->setStyleSheet("border-width:1px;" "border-style:solid;" "border-color:white;" "background-color:rgba(88,88,88,200)"); } }
板載按鍵檢測,代碼實現(xiàn):
voidrice::keyInit() { keyFd=open(keyPath.toUtf8().data(),O_RDONLY); if(keyFd==-1) { printf("Cannotopenfile(%s)",keyPath.toUtf8().data()); return; } ui->keyTextEdit->append("KeyMonitor! "); ui->keyTextEdit->append("Keyuser0pressed!"); keyNotify=newQSocketNotifier(this->keyFd,QSocketNotifier::Read,this); connect(this->keyNotify,SIGNAL(activated(int)),this,SLOT(keyHandler())); } voidrice::keyDeinit() { } voidrice::keyHandler() { structinput_eventbuf; if(read(keyFd,&buf,sizeof(structinput_event))>0) { if(buf.code==KEY_PROG1&&buf.value==1) { ui->keyTextEdit->append("Keyuser0pressed!"); } } }
RTC時鐘獲取并顯示,代碼實現(xiàn):
voidrice::dateInit() { structrtc_timertc_tm_temp; dateFd=open(datePath.toUtf8().data(),O_RDONLY); if(dateFd==-1) { printf("Cannotopenfile(%s)",keyPath.toUtf8().data()); return; } if(ioctl(dateFd,RTC_RD_TIME,&rtc_tm_temp)0) ????{ ????????printf("Get?date?failed"); ????????return; ????} ????ui->yearLineEdit->setText(QString::number(rtc_tm_temp.tm_year+1900)); ui->monthLineEdit->setText(QString::number(rtc_tm_temp.tm_mon+1)); ui->dayLineEdit->setText(QString::number(rtc_tm_temp.tm_mday)); } voidrice::dateDeint() { }
網絡調試助手,代碼實現(xiàn):
voidrice::netInit() { server=newQTcpServer(); socket=newQTcpSocket(); } voidrice::netDeint() { } voidrice::netNewClientConnect() { socket=server->nextPendingConnection(); connect(socket,&QTcpSocket::readyRead,this,&rice::netNewRcve); } voidrice::on_netPushButton_clicked() { intport=ui->portLineEdit->text().toInt(); if(ui->netPushButton->text()==tr("Open")) { if(ui->typeComboBox->currentText()==tr("Server")) { connect(server,&QTcpServer::newConnection,this,&rice::netNewClientConnect); if(!server->listen(QHostAddress::Any,port)) { printf("Listenfailed "); return; } } elseif(ui->typeComboBox->currentText()==tr("Client")) { QStringip=ui->ipComboBox->currentText(); socket->abort(); socket->connectToHost(ip,port); if(!socket->waitForConnected(3000)) { printf("Connectserverfailed"); return; } connect(socket,&QTcpSocket::readyRead,this,&rice::netNewRcve); } ui->netPushButton->setText("Close"); } elseif(ui->netPushButton->text()==tr("Close")) { if(ui->typeComboBox->currentText()==tr("Server")) { socket->abort(); server->close(); } elseif(ui->typeComboBox->currentText()==tr("Client")) { socket->disconnectFromHost(); } ui->netPushButton->setText("Open"); } } voidrice::on_sendPushButton_clicked() { if(socket->isOpen()) { socket->write(ui->sendLineEdit->text().toUtf8().data()); } } voidrice::netNewRcve() { ui->recvTextEdit->append(socket->readAll()); } voidrice::on_typeComboBox_currentIndexChanged(constQString&arg1) { if(arg1==tr("Server")) { ui->ipComboBox->setEditable(false); } else { ui->ipComboBox->setEditable(true); } }
Qt應用驗證
板載LED燈控制驗證,當點擊開關LED按鈕時,LED燈會根據(jù)狀態(tài)亮滅:
當應用運行起來時,會獲取RTC時間,并顯示:
當板載按鍵按下時,窗口會顯示按鍵按下:
網絡調試助手支持TCP客戶端和TCP服務器兩種類型,下面演示服務器驗證。開發(fā)板上設置板子的IP,和端口號,然后通過PC上網絡調試助手連接上板子,并克實現(xiàn)數(shù)據(jù)的收發(fā):
客戶端往服務器發(fā)送數(shù)據(jù)
服務器往客戶端發(fā)送數(shù)據(jù)
? ?
本文轉載自Rice嵌入式
審核編輯:湯梓紅
-
嵌入式系統(tǒng)
+關注
關注
41文章
3570瀏覽量
129251 -
cpu
+關注
關注
68文章
10829瀏覽量
211182 -
開發(fā)板
+關注
關注
25文章
4959瀏覽量
97214 -
Qt
+關注
關注
1文章
301瀏覽量
37837 -
創(chuàng)龍科技
+關注
關注
2文章
131瀏覽量
7714 -
全志T113
+關注
關注
0文章
49瀏覽量
218
原文標題:Qt應用開發(fā)--國產工業(yè)開發(fā)板T113-i的部署教程
文章出處:【微信號:gh_79acfa3aa3e3,微信公眾號:全志在線】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論