劉康麗1,谷 靜,杜 影1,畢 碩1,朱元元
(1.北京航天測控技術(shù)有限公司,北京 100041; 2.北京航天長征飛行器研究所,北京 100076)
目前,我國的自主可控生態(tài)環(huán)境還處于初期階段,國產(chǎn)龍芯 CPU的成功研發(fā)與應(yīng)用承載著我國自主軟件發(fā)展的希望。隨著國產(chǎn)核心基礎(chǔ)軟硬件的性能與功能逐步完善,在國家政策支持和大力發(fā)展民族產(chǎn)業(yè)的背景下,“龍芯 +中標麒麟”的模式為國產(chǎn)軟硬件的發(fā)展、推廣和應(yīng)用開辟出一條創(chuàng)新的道路。在測試控制領(lǐng)域,把開源的軟件和PXI硬件結(jié)合在一起,打造基于開源軟件的通用測試平臺,建立基于國產(chǎn)龍芯計算平臺的PXI模塊儀器生態(tài)是實現(xiàn)國產(chǎn)化替代的必經(jīng)之路。本文將詳細討論中標麒麟系統(tǒng)下基于QT的PXI儀器軟件開發(fā)方法和步驟。
中標麒麟桌面操作系統(tǒng)軟件(龍芯版)V5.0是國內(nèi)首款支持龍芯64位平臺并規(guī)模化應(yīng)用部署的自主操作系統(tǒng),兼容龍芯3A3000平臺并實現(xiàn)系統(tǒng)內(nèi)核及核心參數(shù)等優(yōu)化適配,能夠最大程度發(fā)揮中標麒麟操作系統(tǒng)和龍芯3A3000整機平臺的整體性能。該系統(tǒng)提供全新經(jīng)典的用戶UI界面,兼顧用戶使用習(xí)慣,跨平臺部署提供統(tǒng)一用戶體驗;核心參數(shù)升級,性能有效提升并保障系統(tǒng)穩(wěn)定性和安全性;提供完善的系統(tǒng)升級維護機制;軟件中心提供豐富的桌面應(yīng)用及工具,實現(xiàn)開機即用;系統(tǒng)兼容性好,支持主流國產(chǎn)軟硬件[1]。
圖1所示為龍芯平臺搭載中標麒麟操作系統(tǒng),可安裝的應(yīng)用開發(fā)環(huán)境有Eclipse、Qt、GCC和腳本語言[1],該平臺上的應(yīng)用軟件發(fā)展現(xiàn)狀正處于由可用到好用的過渡階段,龍芯軟件生態(tài)環(huán)境還處于緩慢發(fā)展階段,這使得PXI儀器軟件的遷移和二次開發(fā)存在一定難度,需要操作系統(tǒng)、應(yīng)用軟件以及硬件兼容的緊密配合。

圖1 國產(chǎn)龍芯計算平臺
Qt是由 TrollTech 公司出品的跨平臺C++圖形用戶界面應(yīng)用程序開發(fā)框架[2],它既可以開發(fā)GUI程序,也可用于開發(fā)非GUI程序,目前被廣泛應(yīng)用于嵌入式、電力系統(tǒng)、軍工系統(tǒng)等要與硬件交互的界面系統(tǒng)中。Qt是面向?qū)ο蟮目蚣埽己玫姆庋b機制令Qt的模塊化程度非常高并且可重用性好;另外,Qt具有豐富的API,在Qt中包括了至少250個的C++類,并且還提供了基于模板的 collections,serialization,file,I/O device,directory management,date/time 類,甚至還包括正則表達式的處理功能。選擇Qt作為開發(fā)工具不僅因為其開發(fā)功能強大,更主要是因為它有開源版本且支持跨平臺運行,Qt作為高質(zhì)量的跨平臺框架,具有支持平臺廣泛、功能完整、開源、執(zhí)行效率高、界面開發(fā)簡單、開發(fā)工具完備等特性,Qt官方已經(jīng)提供了在windows,Android,ios,linux中運行的SDK,一次程序開發(fā)幾乎不需要改動就能夠在Windows操作系統(tǒng)和中標麒麟操作系統(tǒng)下編譯運行,這為PXI設(shè)備的跨平臺使用創(chuàng)造了條件[3]。
文中使用中標麒麟V5.0安裝的Qt5.6,其集成開發(fā)環(huán)境(IDE)名為Qt Creator,能夠提供智能代碼完成、語法高亮,集成幫助系統(tǒng)、調(diào)試器和分析器。文中案例采用可視化編程模式,界面源碼與用戶源碼隔離,用戶源碼使用QT提供的信號槽機制,可以很好的降低界面代碼與功能代碼的耦合性,提升代碼的復(fù)用性。
龍芯版的中標麒麟操作系統(tǒng)是一種基于Linux內(nèi)核的桌面操作系統(tǒng),支持MIPS架構(gòu)。因此,目前運行在 X86 架構(gòu)的PXI儀器軟件均無法在龍芯平臺運行和使用[4]。因此,在中標麒麟操作系統(tǒng)下開發(fā)PXI儀器軟件需要完成以下工作:
1)開發(fā)中標麒麟操作系統(tǒng)下PXI儀器設(shè)備驅(qū)動程序,將其加載到內(nèi)核;
2)根據(jù)具體應(yīng)用模塊或儀器選擇開發(fā)“.so”(shared object)文件,便于應(yīng)用層軟件調(diào)用;
3)在Qt Creator中編寫界面和邏輯代碼;
4)鏈接“.so”文件,編譯生成可執(zhí)行文件,并打包成安裝程序。
軟件程序功能采取自頂向下的模塊化設(shè)計方案,根據(jù)需求分析,整個軟件的功能體系架構(gòu)如圖2所示,軟件設(shè)計過程充分運用了分層模塊化的思想,將其分解為多個子功能模塊。總體來說分為三個層次,第一層操作系統(tǒng)中接口驅(qū)動層(測試模塊采用PXI總線),第二層是設(shè)備管理接口層,主要包含儀器的多種調(diào)用函數(shù),為應(yīng)用層實現(xiàn)功能調(diào)用提供接口,第三層是軟件應(yīng)用層,主要包含界面儀器操作、配置、與各個子系統(tǒng)測試任務(wù)處理等功能。

圖2 軟件功能體系架構(gòu)
最終能夠?qū)崿F(xiàn)與底層功能函數(shù)的接口,形成功能獨立的軟件程序,并具有良好的人機界面,方便用戶使用。
Linux下的PXI設(shè)備驅(qū)動主要包含以下幾個部分:初始化設(shè)備模塊、設(shè)備打開模塊、數(shù)據(jù)讀寫和控制模塊、中斷處理模塊、設(shè)備釋放模塊和設(shè)備卸載模塊。
驅(qū)動源碼(.c)文件可在任意文本編輯環(huán)境下編寫,其主要內(nèi)容是構(gòu)造Linux操作系統(tǒng)下驅(qū)動函數(shù)的基本框架,包含Linux驅(qū)動程序的關(guān)鍵數(shù)據(jù)結(jié)構(gòu)及關(guān)鍵功能模塊。該文件能夠按照兩種方式進行編譯,一種是直接靜態(tài)編譯成內(nèi)核的一部分,另一種則是編譯成可以動態(tài)加載的模塊。如果編譯進內(nèi)核,則會增加內(nèi)核的大小,還要改動內(nèi)核的源文件,而且不能動態(tài)地卸載,不利于調(diào)試,所以推薦使用模塊方式加載。
使用gcc編譯.c文件后生成內(nèi)核模塊“.ko”(kernel object)文件,用命令insmod將其載入Linux內(nèi)核,從而成為內(nèi)核的一個組成部分,當不需要該模塊時,可以使用rmmod命令進行卸載。為了方便使用,可將加載儀器驅(qū)動指令放入開機自啟動選項中,這樣,該驅(qū)動模塊將在開機后自動加載至內(nèi)核。開機自動加載模塊驅(qū)動本文采用如下方法:
在加載成功后,通過在終端輸入lspci指令,可在終端觀察到已經(jīng)識別的PCI模塊。
“.so” (shared object)文件作為Linux下的共享鏈接庫文件,類似于windows下的 .dll 文件,它在程序啟動的時候加載到程序中,并且可以被不同的程序共享。每個共享函數(shù)庫都有個特殊的名字,其命名必須以“l(fā)ib”作為前綴,然后是函數(shù)庫的名字,然后是“.so”,例如,本文中生成的共享庫以libamc.so命名。一般情況下,共享函數(shù)庫文件需要放在相應(yīng)約定的目錄里,這樣通過系統(tǒng)的環(huán)境變量設(shè)置,應(yīng)用程序才能正確的使用這些函數(shù)庫。大部分的源碼開發(fā)的程序都遵循GNU的一些標準, GNU標準建議所有的函數(shù)庫文件都放在/usr/local/lib目錄下,而且建議命令可執(zhí)行程序都放在/usr/local/bin目錄下。
“.so”文件可向應(yīng)用層軟件提供標準化庫函數(shù),方便跨平臺軟件的移植。在本文的開發(fā)案例中,已有的windows下PXI儀器軟件調(diào)用了NI的VISA庫函數(shù)。為了方便Linux下儀器軟件開發(fā),減少邏輯代碼的修改,將Linux下的接口函數(shù)封裝成同名函數(shù),如圖3所示。

圖3 Linux下驅(qū)動接口函數(shù)定義
在應(yīng)用層程序開發(fā)過程中調(diào)用“.so”文件,首先要將添加相應(yīng)的頭文件,例如amcio.h。然后在工程文件中引用庫文件,例如libamc.so(對應(yīng)amcio.h),代碼如下:
LIBS += -L/lib64 -lamcio
Qt的集成開發(fā)環(huán)境Qt Creator在中標麒麟V5.0中已被默認集成,Qt Creator包含了項目生成向?qū)А++代碼編輯器、瀏覽文件以及累的工具,還包括QtDesigner、圖形化的GDB調(diào)試前端并且繼承了qmake構(gòu)建工具等[5-6]。在使用Qt Widgets Application創(chuàng)建Qt桌面應(yīng)用的過程中,工程創(chuàng)建后除了工程文件本身還包含:頭文件(.h)、源文件(.c)以及界面文件(.ui)。Qt與其他開發(fā)工具相比,信號槽機制是其一大特色。信號槽機制,簡單來說,就是一個類可以定個多個Signal和Slot而且完全是獨立和安全的,在需要建立二者相互通信時,通過connect函數(shù)將某個類中的Slot和另個類中的Signal連接起來,就可以實現(xiàn)事件的驅(qū)動。例如:
Connect(ui.Send_btn,SIGNAL(clicked),this,SLOT(SendData());
該函數(shù)就表示了單擊Send_btn按鈕,將會響應(yīng) SendData()這個函數(shù)。因此,利用Qt特有的信號槽(Signal-Slot)通信機制,可將界面文件與用戶邏輯代碼文件有效隔離。這樣,在Windows和Linux下的界面文件能夠跨平臺使用,不需要更改界面源碼。
在兩種平臺下我們只需重新配置工程環(huán)境就能輕松實現(xiàn)界面源碼的移植,具體環(huán)境參數(shù)設(shè)置如圖4所示。
Qt提供了可視化的開發(fā)工具設(shè)計器,可直接將各種控件拖拽至項目設(shè)計器中,其擁有豐富的設(shè)計組建并且支持自繪組件的加入。本文中,用戶界面設(shè)計方面也采用了圖形操作界面,對用戶友好并具有如下特點:
1)軟件界面保持一致性:界面規(guī)范遵循軟件界面的規(guī)范;
2)設(shè)計完整的對話過程:系統(tǒng)的每一次對話都應(yīng)該有明確的次序:開始、中間處理過程、結(jié)束;
3)提供簡單的錯誤處理機制;
4)提供信息反饋:用多種信息提示用戶當前軟件運行狀態(tài),軟件界面當前的功能;
5)軟件具備測試數(shù)據(jù)保存功能,以方便用戶隨時調(diào)用、分析。

(a)Window下Qt環(huán)境配置

(b)Linux下Qt環(huán)境配置圖4 環(huán)境參數(shù)設(shè)置圖
6)軟件集成.chml格式幫助文檔,內(nèi)部包含硬件以及軟件的用戶說明書。
為保證PXI儀器軟件能夠在其他龍芯平臺上運行,需要將用戶程序編譯后與所依賴的動態(tài)鏈接庫一起打包生成可安裝程序。首先,在Qt Creator中使用release方式編譯出可執(zhí)行文件,將其拷貝至新建文件夾中,修改文件夾名稱,例如AMC5214C。然后在AMC5214C文件夾中建立腳本文件pack.sh和AMC5214C.sh。
pack.sh文件中包括需要發(fā)布的程序名稱和創(chuàng)建文件夾位置等信息。其內(nèi)容如下:
!/bin/sh
exe="AMC5214C"
des="/home/QT/AMC5214C"
deplist=(ldd exe | awk '{if (match(3,"/")){ printf("%s "),3 } }')
cp deplist des
AMC5214C.sh文件內(nèi)容如下:
appname=`basename 0 | sed s,。sh,,`
dirname=`dirname 0`
tmp="{dirname ?}"
if [ "{dirname%tmp}" != "/" ]; then
dirname=PWD/dirname
fi
LD_LIBRARY_PATH=dirname
export LD_LIBRARY_PATH
dirname/appname "@"
在終端中運行./pack.sh 指令,執(zhí)行文件所依賴的鏈接庫會自動拷貝至AMC5214C文件夾中。
在其他龍芯平臺上運行AMC5214C.sh腳本文件即可啟動AMC5214C模塊儀器軟件。
本文將采用龍芯3A3000 CPU搭建整機測試平臺,操作系統(tǒng)為中標麒麟5.0版本,該版本中集成安裝了QT 5.6.1開發(fā)工具。開發(fā)對象是北京航天測控公司自主生產(chǎn)的PXI通用測試平臺下的PXI系列模塊,分別為:
1)5.5位數(shù)字多用表(AMC4311),主要應(yīng)用于PXI平臺的信號高精度測量。模塊提供自校準生產(chǎn)功能,通過軟件模塊可以在不使用特定人力情況下實現(xiàn)采集測量的自校準,糾正測量誤差。
2)64通道控制開關(guān)(AMC4607),是一個基于PXI總線的64通道SPST開關(guān),主要用于切換較大電流的控制信號。具有集成度高,附加功能豐富的優(yōu)點。
3)多串口通訊模塊(AMC5214C)是一種基于PXI總線的多協(xié)議通用異步串行通訊產(chǎn)品。該模塊產(chǎn)品具有8個獨立的RS-232/RS-422/RS-485的串口通訊端口,每個端口的最大數(shù)據(jù)通訊速率為921.6 Kbps,8個端口之間采用光電隔離,端口具有靜電放電保護能力。該模塊主要用于PXI系統(tǒng)中的通訊單元。
根據(jù)第2章節(jié)所述,首先要編寫驅(qū)動程序并將其編譯成可安裝模塊(module),本文中編譯生成的驅(qū)動模塊為AMCDEV.ko文件,使用insmod 命令將其動態(tài)加載到內(nèi)核中,并加入到開機自動啟動項。開機啟動后可通過lspci命令查看驅(qū)動模塊是否正常加載。
第二步,開發(fā)并編譯“l(fā)ibamcio.so”文件,具體參見2.3節(jié)。
第三步,編寫PXI硬件模塊功能函數(shù),以多串口通訊模塊為例,其主要功能及流程如圖5所示[7],功能函數(shù)在AMC5214C.cpp文件中實現(xiàn):

圖5 多串口通訊模塊功能流程圖
第四步,界面設(shè)計,以多串口通訊模塊為例,該通訊模塊共有8通道,各通道均可獨立工作,每個通道均有參數(shù)設(shè)置、數(shù)據(jù)接收、數(shù)據(jù)顯示等窗口,如圖6所示。利用QT的槽機制,將界面與功能函數(shù)相關(guān)聯(lián)起來。

圖6 多串口通訊模塊界面圖
第五步,編譯可執(zhí)行程序并打包安裝,參見2.5節(jié)。
經(jīng)驗證,三個PXI模塊的Qt程序均可在龍芯平臺下啟動運行,并實現(xiàn)儀器資源查找、打開、測試測量、通訊、關(guān)閉等操作。
本文詳細介紹了在中標麒麟操作系統(tǒng)和龍芯3A3000整機平臺下利用開源的QT開發(fā)軟件對自主研發(fā)的國產(chǎn)PXI模塊儀器進行軟件設(shè)計的的方法和步驟,完成了三款PXI儀器模塊的軟件開發(fā)工作,為中標麒麟下以Qt軟件為核心創(chuàng)立PXI模塊儀器生態(tài)開辟了全新思路,為未來國產(chǎn)硬件平臺搭載國產(chǎn)操作系統(tǒng)下的PXI儀器軟件開發(fā)提供了很好的案例。