基于GPL(General Public License)架構之下的Linux,具有硬件需求低,架構開(kāi)放,系統穩定,保密性好等特點(diǎn),嵌入式Linux的這些優(yōu)點(diǎn)正好符合工控領(lǐng)域安全性,穩定性,實(shí)時(shí)性和易維護等要求。另外,嵌入式Linux操作系統中一個(gè)重要的組成部分就是圖形用戶(hù)界面GUl(Graphic User Interface)。風(fēng)電控制系統中人機界面功能復雜,種類(lèi)繁多,其性能的好壞主要取決于圖形功能的設計。利用Qt/Embedded(簡(jiǎn)稱(chēng)qte)開(kāi)發(fā)的GUI,能實(shí)現系統的監視,控制,管理等功能。 1 控制界面的圖形化設計 在風(fēng)電控制界面設計中,對用戶(hù)特征分析十分重要,用戶(hù)一般是受過(guò)訓練的,經(jīng)常使用計算機而且有相當經(jīng)驗的非程序員用戶(hù)。其人機界面開(kāi)發(fā)中應考慮以下幾方面: (1)安全性:設定操作員級別,使畫(huà)面顯示,執行和操作根據權限的不同而有區別。 (2)順序原則:信息分層,增強可讀,集成一致性。 (3)圖形系統:完成特定圖形的輸入,顯示和操作。 (4)實(shí)時(shí)數據的操作:對現場(chǎng)采集的數據能在限定的時(shí)間內給予顯示,通過(guò)畫(huà)面方便的在線(xiàn)調節和設定一些參數。如風(fēng)電中風(fēng)速顯示,葉輪的轉角調節等。 (5)先進(jìn)的報警系統。 眾多的自動(dòng)化控制設備,如微機調速器以及微機測量?jì)x表等它們采用小體積的Flash或ROM,處理器性能相對較弱,它們適合用嵌入式GUI來(lái)完成人機交互的操作。嵌入式Linux系統的有代表性的GUI系統主要有MiniGUI、Microwindows、TinyX以及Qt/Embedded。很多工控軟件是使用c++語(yǔ)言編寫(xiě)的,而且系統本身對庫的健壯性,穩定性要求比較高,用qte能設計出優(yōu)秀的圖形界面,并且能和其它C++程序互相調用。 2 開(kāi)發(fā)過(guò)程 開(kāi)發(fā)使用的硬件平臺為H9200F系統主板,它是基于嵌入式工業(yè)控制系統的開(kāi)發(fā)套件。系統的核心是32位ARM920T核的高速ARM處理器AT91RM9200,移植了Uboot,設備的驅動(dòng)程序包括觸摸屏驅動(dòng)和unux-2.4.27的內核,交叉編譯工具為cross-2.95.3。 2.1 建立交叉編譯環(huán)境 嵌入式系統應用軟件的開(kāi)發(fā)屬于跨平臺開(kāi)發(fā),因為嵌入式設備所用的CPU和Pc機上的CPU有著(zhù)不同的架構,需要一個(gè)交義開(kāi)發(fā)環(huán)境在PC機上編譯出適用于嵌入式設備CPU架構的軟件。用來(lái)開(kāi)發(fā)的計算機一般稱(chēng)為宿主機(X86),它運行Linux程序;嵌入式設備稱(chēng)為目標機,一般就是目標板(arm),所以我們必須配置兩套開(kāi)發(fā)環(huán)境((for ARM和for X86)。如圖1為完整的嵌入式Qt程序開(kāi)發(fā)流程。 ![]() 圖1 嵌入式Qt交叉編譯開(kāi)發(fā)過(guò)程 從網(wǎng)上下載免費的Qt/Embedded開(kāi)發(fā)包,本系統采用qte3.3.4的版本:qt-embedded-free-3.3.4.tar.gz,qt-x11-free-3.3.4.tar.gz。其軟件包中自帶了qmake,可以生成工程文件和Makefile文件。 * 將壓縮包解壓后安裝在主機上。在qte的安裝過(guò)程中,研究了以下幾個(gè)問(wèn)題: (1)./configure后的命令指定Qt嵌入式開(kāi)發(fā)包能否生成虛擬緩沖幀工具qvfb,支持的顯示顏色深度,支持的圖形種類(lèi)等。如果qte的應用是在UNIX/Linux平臺下開(kāi)發(fā)的話(huà),那么qvfb就可以在機器上以一個(gè)獨立的控制臺或者虛擬緩沖幀的方式來(lái)運行,通過(guò)指定顯示設備的寬度,高度和顏色深度,虛擬出來(lái)的緩沖幀將和物理的顯示設備在每個(gè)像素卜保持一致。這樣每次調試應用時(shí)開(kāi)發(fā)人員就不用總是刷新嵌入式設備的FLASH存儲空間。從而加速了應用的編譯、鏈接和運行周期。 (2)安裝完成后為保證每次運行程序的路徑都足正確的,需要修改個(gè)人設定文檔中的~/.bashrc文件或者~/.bash_profile或者系統路徑文件,在文檔中加入幾個(gè)路徑變量,特別是QTEDIR=qte安裝路徑,QTDIR=qte安裝路徑和qte的lib文件路徑的設定。 (3)運行qvfb,若無(wú)法找到輸入設備,如顯示/dev下沒(méi)有fb0設備,則列臨時(shí)文件夾/tmp下刪除相應的文件;如果是缺少字庫,則將系統里的字庫拷貝到QTDIR/lib下,最后必須保證環(huán)境變量PATH能搜尋到qvtb命令。 * 第二步是在交義編譯的目錄下重新安裝能編譯目標板arm程序的qte。 首先在交叉編澤目錄下重新解壓qt-embedded-free-3.3.4.tar.gz,將X86的QTEDIR/bin文件罩的moc和uic二進(jìn)制文件復制到交義編譯的目錄下的bin文件夾里。然后配置交叉編譯工具(如qmake),修改.conf文件,指定文件的編譯器為安裝的交叉編譯工具,即QMAKE_CC,QMAKE_CXX,QMAKE_LINK,QMAKE_LINK_SHLIB所用的工具。 精簡(jiǎn)Qt就在于make命令,按開(kāi)發(fā)的實(shí)際需求可以增減Qt庫的大小。qte開(kāi)發(fā)包有5種編譯范圍的選項,使用這些選項,可控制Qt生成的庫文件的大小。每個(gè)選項都對應在$QTDIR/src/tools/的.h(標頭檔)文件里.Tmlltech把這些標頭檔定義為“Feature Definition Files”(特征定義檔)。除廠(chǎng)使用已有的五種定義外,也可以根據實(shí)際定義Qt的特征,把在sre/tools/中所不需要的項目用QT_NO_記錄下來(lái)創(chuàng )造一個(gè)自定義標頭檔,但是還要注意項目之間功能的相依性問(wèn)題。 最后,執行strip命令:#strip -R.note -R.comment $QTDIR/lib/lihqte.so*。將交叉編譯好的Qt庫libqte.so*下載到開(kāi)發(fā)板中的某個(gè)目錄下。 2.2 Qt/Embedded開(kāi)發(fā)程序過(guò)程 Qt/Embedded的開(kāi)發(fā)有兩種方式,一種是圖形編程方式,一種是傳統的代碼編程方式。不論是使用圖形界面編程還是直接寫(xiě)代碼。都會(huì )涉及到Qt的元對象系統。Qt的一個(gè)主要成就就是使用了一個(gè)機制擴展了c++并且可以創(chuàng )建獨立的軟件組件。這種機制被稱(chēng)為元對象系統,它有兩個(gè)關(guān)鍵技術(shù):信號和槽,以及內省(introspection)。內省功能是實(shí)現信號和槽的基礎,它允許程序員在運行時(shí)獲得有關(guān)QObject子類(lèi)的“元信息”,包含對象的類(lèi)名以及它所支持的信號和槽的列表。但是標準的c++沒(méi)有對Qt元對象系統提供支持。Qt通過(guò)提供一個(gè)獨立的工具moc來(lái)解析Q_OBJECT類(lèi)定義。moc使用純c++來(lái)實(shí)現它所有功能,所以Qt的元對象系統可以在任意C++編譯器上工作。 ![]() 圖2 Qt/Embedded編程過(guò)程 * 利用Qt Designer開(kāi)發(fā) 這是一種所見(jiàn)即所得的方式。啟動(dòng)Qt圖形編輯器,編輯GUI界,保存后得到.ui文件。在Qt Designer的代碼編輯器里輸入的代碼保存為file.ui.h文件(一個(gè)C++源文件)。雙擊窗體啟動(dòng)Qt Designer的代碼編輯器,可以添加所制窗口的一些額外功能。比如添加新的槽函數.Qt Designer會(huì )自動(dòng)監測到在代碼中已經(jīng)創(chuàng )建了一個(gè)新槽,并且Uic(User Interface Compiler)會(huì )在窗體的類(lèi)定義中自動(dòng)生成正確的函數聲明。在Qt中,uic是從XML文件生成代碼的用戶(hù)編輯器,用來(lái)將fiie.ui文件生成file.h和file.cpp文件。 在風(fēng)電控制系統中為了設定用戶(hù)級別,對信息進(jìn)行安全管理和根據權限而限制操作范圍,一般需要有用戶(hù)登錄管理,如: ![]() 圖3 用戶(hù)管理界面 兩個(gè)界面是用Qt Designer開(kāi)發(fā)的,它們進(jìn)行切換的功能就可以在代碼編輯器中蓖寫(xiě)accept ()函數實(shí)現,即:Login1的對象->hide0;Login2的對象->show0, * 編寫(xiě)程序開(kāi)發(fā) 這是一般程序員開(kāi)發(fā)程序時(shí)所用的方式。在控制界面中,需要使用很多圖元和圖標,系統應該有圖庫集和能調入圖形的擴展接口;蛘呤怯凶约航⒌幕緢D元。Qt中有很多為應用程序提供圖片的方法。常用的有: (1)在運行時(shí)候把圖片保存到文件中并且載人它們; (2)在源文件中包含XMP文件(因為XMP文件也是有效的C++文件) (3)使用Qt的圖片集機制。 圖片集方法比在運行的時(shí)候載入文件更加方便和迅速,并且它可以和所有支持的文件格式一起工作。這些圖片被存放在源代碼樹(shù)中名為images的子目錄下。 程序中繼承QMainWindow()類(lèi)編寫(xiě)桌面,采用Qt的布局管理器QGridLayout().QVBoxLayout()和QHBoxLayout(),在桌面上雙擊第三個(gè)圖標Item 3打開(kāi)表格處理程序為: ![]() 圖4 桌面系統 void desktop::iconView() { QIconView *qiconview=new QIconView(this);//定義按鈕類(lèi)對象 ⋯//對象的屬性設定 QIconViewItem *itemX:new QIconViewItem(qiconview, QString("Item X")); //定義各個(gè)按鈕 ⋯//按鈕屬性(setRenameEnabled(),setPixmap()等) QObject::connect(qiconview,SIGNAL(doubleClicked(QIconViewItem *)),this,SLOT(itemClicked(QIconViewItem *)));//按鈕信號與槽的設定 ⋯//鼠標移動(dòng)按鈕的監聽(tīng)} void desktop::itemClicked(QIconViewItem *item)//按鈕按下的槽函數 {int id=item->index(); switch(id){ case 0-2:{...//其他應用程序}break; case 3:{表格程序的對象base; base->show0; base的屬性設定;}break;⋯} 2.3 將程序發(fā)布到目標板上 將開(kāi)發(fā)好的Qt/Embedded程序用交叉編譯工具重新編譯成可執行文件,生成二進(jìn)制目標可執行代碼,再將嵌入式目標系統掛載到Linux宿主機的共享分區,讓qte程序直接運行在嵌入式目標系統,并進(jìn)行調試。調試成功以后,就可以把程序同化到系統的FLASH存儲器中。如果需要程序開(kāi)機自動(dòng)運行,可以編輯啟動(dòng)時(shí)的執行文件/usr/etc/rc.local,將啟動(dòng)運行的程序路徑及文件名添加到這里,就可以實(shí)現系統啟動(dòng)時(shí)的程序自動(dòng)運行。 3 結束語(yǔ) 桌面系統實(shí)現了圖像數據的載入,文字編輯,表格處理和屏幕鍵盤(pán)等基礎功能,為開(kāi)發(fā)風(fēng)力發(fā)電組態(tài)軟件提供了一個(gè)很好的平臺。本文的創(chuàng )新點(diǎn)在于:1.以設計風(fēng)力發(fā)電控制臺人機交互界面為前提,以用戶(hù)需求結合qte特點(diǎn)來(lái)開(kāi)發(fā)嵌入式GUI。2.對qte安裝和編程上的技術(shù)問(wèn)題做了詳細分析,提出精簡(jiǎn)qte的方法。 作者:趙瑩,徐大平,呂躍剛 來(lái)源:《微計算機信息》(嵌入式與SOC)2009年第4-2期 |