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