王立偉 胡大斌 肖劍波
摘 要: QNX操作系統具有可靠性高、實時性強的特點和強大的圖形界面功能,基于其開發的水下航行器嵌入式操控訓練系統,解決了系統的實時性需求,還能方便地開發出友好的人機界面。簡要介紹了QNX操作系統的特點和映像文件配置的一般方法,基于PhAB開發了嵌入式操控訓練系統的操控界面,根據系統的模塊劃分對主程序進行了設計,系統程序運行穩定,滿足訓練要求,對其他嵌入式訓練系統軟件設計具有一定的借鑒意義。
關鍵詞: QNX; 圖形界面; 建模; 嵌入式訓練系統
中圖分類號: TN964?34 文獻標識碼: A 文章編號: 1004?373X(2014)12?0015?04
Abstract: QNX, an operating system with strong development function of graphic interface, has the characteristics of high real?time performance and reliability. The embedded control training system for underwater vehicle developed on the basis of QNX can meet real?time requirement of the system and can develop friendly man?machine interface conveniently. The characteristics of QNX and the general ways to configure mapping files are briefly introduced. The control interface of the embedded control training system based on PhAB was developed. The main program was designed according to the sort of modules. The embedded control training system can fulfill the requirements of training, and runs steadily, which can be used as a reference to the software design of other embedded training systems.
Keywords: QNX; GUI; modeling; embedded training system
0 引 言
操縱控制系統是水下航行器的指揮中樞,用于控制操縱設備來改變或保持運動速度、姿態和深度,其可靠性和實時性決定了水下航行的安全。嵌入式操控訓練系統在原有操控系統的基礎上加裝了訓練模塊,集操縱控制和訓練功能于一身,提高了訓練效率,降低了訓練成本,但也對系統性能提出了更高的要求。QNX操作系統作為一款主流的嵌入式實時操作系統,可靠性高,實時性強,圖形界面開發功能強大,基于其開發的水下航行器嵌入式操控訓練系統即能滿足實時性方面的要求,又具有友好的人機交互界面。
1 QNX概述
QNX是由加拿大QSSL公司開發的一款嵌入式實時操作系統,具有實時性強、多任務、分布式、可擴展的特點和強大的圖形界面開發功能,廣泛應用于軍事、航空航天、醫療設備、車載系統、高端網絡系統和自動化等領域[1]。獨特的中斷處理方式,快速的上下文切換和基于優先級驅動的搶占調度方式,保證了其強大的實時性能。QNX的內核僅執行四種最基本的功能,使得系統具有良好的可靠性,而高度的可裁剪性也讓其在嵌入式開發方面具有得天獨厚的優勢。此外,QNX還具有良好的可移植性和自保護機制,符合POSIX標準,這些都使得其在嵌入式實時領域得到了越來越廣泛的應用。
2 系統軟件設計
2.1 QNX系統映像文件的配置
映像文件包括操作系統,可執行程序和任何與程序相關的數據文件,是嵌入式系統開發的基礎,為系統軟件設計提供了平臺。根據系統的實際需求制作合適的操作系統映像文件,可以充分發揮嵌入式系統小巧的特點,在節省內存資源的同時也保證了系統的整體性能。具體說來就是根據自己所選擇的CPU類型和應用程序所需要的操作系統模塊支持來定制系統,在保證既定功能的基礎上裁剪掉與實現功能無關的文件,實現系統的最小化。
在建立映像文件之前必須編輯生成一個QNX的buildfile文件,buildfile文件一般由bootstrap script(啟動引導腳本)、startup script(啟動腳本)、file list(文件列表)三部分組成[2]。啟動引導腳本用于指明CPU的啟動方式,配置與CPU相適應的微內核。對于x86及其兼容的嵌入式計算機,通常格式如下:
[virtual=x86,bios +compress] .bootstrap = {
startup?bios
PATH=/proc/boot:/bin LD_LIBRARY_PATH=/proc/boot:/lib:/dll procnto}
其中x86為處理器類型,對于其他類型的CPU可根據參考手冊進行相應的替換;bios +compress指通過bios啟動,并壓縮鏡像文件; “PATH=/proc/boot” 確定了PATH環境變量;“procnto” 是微內核和進程管理器。
啟動腳本是在進程管理啟動后一系列將要被執行命令的序列,用于在引導腳本執行完后運行驅動程序和用戶程序,通常格式如下:
[+script] .script={
command line
}
文件列表是指系統程序和用戶程序執行所必須的文件列表和一些共享庫,通過[type=link]重新定位它們的位置。由于本文所設計的嵌入式操控訓練系統以C語言為開發語言,所有的驅動至少需要一個標準C共享庫:
[type=link] /usr /lib/ldqnx.so.2=/proc/boot/libc.so
libc.so #標準C共享庫
完成buildfile文件的編譯后,使用mkifs命令即可生成鏡像文件.ifs。例如:mkifs ControlSystem.build ControlSystem.ifs。通過objdump命令,可以檢查鏡像文件是否包含了全部所需文件。然后將鏡像文件嵌入到目標機中,運行后即可看到用戶定制的嵌入式操作系統。
2.2 應用程序設計
2.2.1 模塊化設計
嵌入式操控訓練系統不僅要實現對水下航行器的操縱和訓練等功能,還應能處理系統內部和外部的各種輸入輸出信號讀寫、計算和通信。根據系統的功能,將其分為以下模塊:
(1) 系統控制模塊:管理系統運行狀態、數據通信等。
(2) 界面程序模塊:顯示深度、航向和縱傾的設定值;顯示深度、航向、縱傾、橫傾的當前值;顯示方向舵、舯水平舵和艉升降舵當前的舵角值。
(3) 運動模型模塊:模擬水下航行器的運動狀態,根據六自由度方程解算出當前的狀態參數值。
(4) 舵機模型模塊:模擬舵機,輸出舵角值。
(5) 航向、深度、縱傾控制模塊:自動和遙控工況下航向、深度、縱傾的保持和改變。
(6) 工作模式轉換模塊:完成訓練模式和操控模式的快速安全切換。
除上述模塊外,還包括數據采集卡控制模塊、接口控制模塊和通信模塊。通過采用模塊化設計方法,降低了軟件結構的復雜性,方便了軟件設計,降低了開發難度。軟件系統的模塊結構如圖1所示。
2.2.2 界面設計
QNX為用戶提供了三種開發圖形的方法,即GF(Graphics Framework),Adobe Flash,Photon microGUI[3]。利用GF進行圖形界面開發具有小巧、高速的優點,能有效和最大限度地利用顯示硬件,但缺少像Photon中的可直接使用的控件,而且也沒有特別的編程工具,開發難度較大。利用Adobe Flash開發的圖形界面不依賴于操作系統,僅需支持Flash就可以使用。用戶通過FLASHDEVELOP軟件編寫的圖形界面更加絢麗,但其在嵌入式設備上的性能還有待提高。
Photon microGUI采用了與QNX微內核相同的結構,圖形窗口的構建是通過微內核和一組共操作的進程來實現的,使得窗口系統占用的空間少而可靠性高。Photon自帶的PhAB開發工具采用所見即所得的開發模式,可以自動生成主要的C和C++代碼來完成工程的用戶界面,大大提高編程效率。本文采用PhAB開發工具進行界面設計。
PhAB提供了76個控件類,用戶可以直接將需要的控件拖到繪圖窗口,設定大小,在Resources窗口中設置各類屬性,在Callbacks中選擇回調函數的類型和設置函數名稱,之后選擇Build下的Genrate UI命令即可生成目標代碼。
目標代碼生成后,用戶可以利用QNX Momentics IDE軟件編寫相應的初始化函數、回調函數和其他函數。本文所設計的界面需要實現對深度、航向和水下航行器運行狀態等動態數據的實時顯示,下面以界面中顯示航向的動態碼盤繪制為例介紹程序設計的一般方法。
動態碼盤的繪制采用的是具有自動重繪功能的PtRaw控件,回調函數包括:
(1) 繪圖函數:void course_draw( PtWidget_t *widget, PhTile_t *damage )。負責繪制柱形碼盤。
(2) 定時器函數:int timer_refresh( PtWidget_t *widget, ApInfo_t *apinfo, PtCallbackInfo_t *cbinfo )。負責定時調用清除函數或發送事件,從而引發繪圖函數根據新數據自動重繪。
繪圖函數通過設置PtRaw控件的Pt_ARG_RAW_
DRAW_F資源進行定義。函數定義中的*widget是指向PtRaw控件的指針,指針為ABW_加上控件的變量名,*damage是指向碎片的指針,用于程序識別PtRaw控件畫布中被銷毀的部分。
繪制動態碼盤就是要不斷的調用繪圖函數進行重繪,然而繪圖函數不能被直接調用,只能通過銷毀PtRaw控件畫布的方式來達到重繪的目的。滿足以下兩個條件之一即可以銷毀畫布:
(1) PtRaw控件實現時;
(2) 覆蓋在畫布上的區域被移走或銷毀。
前者可以用PtClearWidget()和PtReRealizeWidget()函數來實現。PtClearWidget()函數用來銷毀一個容器控件中的子控件,通過在定時器函數中調用該函數可以將PtRaw容器控件中使用的PtLine子控件繪制的碼盤擦除,再利用PtReRealizeWidget()函數使PtRaw控件實現,從而調用繪圖函數,重繪頻率取決于定時器的Timer Repeat值。
Photon事件空間由若干個平面組成[4],如圖2所示,事件在某個平面生成并在事件空間中移動。比如,繪畫事件從Application平面向Graphics平面移動;輸入事件從Pointer/Keyboard平面向Root平面移動。為實現PtRaw控件畫布銷毀的第二個條件,可以在Photon事件空間中創建一個平面并使其發生一個矩形的Ph_EV_EXPOSE事件,在它向Root平面穿梭的過程中移走了Application平面上的區域,使得PtRaw控件自動調用繪圖函數實現重繪。
按照上述方法繪制航向、方向舵、舯水平舵、艉升降舵碼盤和水下航行器狀態顯示畫面,編寫回調函數,系統初始化函數,即可完成系統的界面設計。
2.2.3 主程序設計
為避免代碼的重復編譯,提高程序執行效率,本文以界面程序中已設定的回調函數為基礎對系統主程序進行了設計,減小了編程工作量。根據嵌入式訓練系統的功能要求,進行的程序設計如下:
(1) 六自由度運動模型程序設計。由于運動模型的精度直接關系到嵌入式訓練系統的訓練效果,本文采用了國際通用的六自由度空間運動方程[5],包括軸向力方程、側向力方程、垂向力方程、橫搖力矩方程、縱傾力矩方程、偏航力矩方程和輔助方程,利用數學方法將方程化為[u=f1]的形式,通過積分解算程序解算出狀態向量[u,v,w,p,q,r,φ,θ,ψ,ξ,η,ζ],這些積分值再與方向舵、舯水平舵、艉升降舵的舵角一起作為六自由度模型新的初始條件參與下一時刻狀態向量的求解。
(2) 舵機模型程序設計。目前,通常采用的舵機數學模型[6]為:
[TEδ=KE(δe-δ)]
式中:[δ]為實際舵角;[δe]為指令舵角;[TE]為舵機時間常數;[KE]為舵機的控制增益。考慮到舵機的實際情況,在模型中加入舵角及轉舵速度限制,模型程序如下:
double rudder_model(double angle,double angle_given,double angle_limit)
{ double diff,deter;
int i;
for (i=0;i<100;i++)
{
diff= angle_given ?angle;
deter=0.4*diff; //舵機模型,TE取2.5,KE取1
if(deter>3.14/90) deter=3.14/90;
//轉舵速度限制..3(°)/s
if (deter