王少虎,劉亞斌
(北京航空航天大學(xué)自動(dòng)化科學(xué)與電氣工程學(xué)院,北京100191)
飛控組件綜合測(cè)試系統(tǒng)主要用以對(duì)某型號(hào)產(chǎn)品的飛控組件的電氣性能、功能、時(shí)序進(jìn)行全面調(diào)試與測(cè)試,并隔離、定位和分析故障,完成常溫、高低溫性能測(cè)試、振動(dòng)和沖擊測(cè)試。飛控組件與載機(jī)、導(dǎo)引頭、舵機(jī)等通訊,不斷發(fā)出代表自身工作狀態(tài)的LVDS遙測(cè)信息[1]。測(cè)試系統(tǒng)中的LVDS遙測(cè)采集卡需實(shí)時(shí)采集LVDS遙測(cè)信息,并存儲(chǔ)、顯示。Win?dows系統(tǒng)實(shí)時(shí)性差[2],在采集LVDS遙測(cè)信息過程中時(shí)常會(huì)出現(xiàn)丟幀、誤碼現(xiàn)象。本測(cè)試系統(tǒng)要求在有限的、確定的時(shí)間內(nèi)實(shí)現(xiàn)一個(gè)周期數(shù)據(jù)的采集。鑒于Windows7良好的人機(jī)交互界面、強(qiáng)大的圖形顯示和數(shù)據(jù)處理功能[3],并考慮到各類實(shí)時(shí)系統(tǒng)或開發(fā)工具的實(shí)時(shí)性能、開發(fā)難度、軟件可移植性、成本等因素,選取RTX2012對(duì)Windows 7系統(tǒng)進(jìn)行硬實(shí)時(shí)擴(kuò)展[3],進(jìn)行LVDS遙測(cè)采集卡的RTX驅(qū)動(dòng)程序開發(fā)。
LVDS遙測(cè)采集卡主要用于接收飛控組件發(fā)出的LVDS遙測(cè)信號(hào)[4],主要特性有:PXI總線接口;一幀255個(gè)遙測(cè)數(shù)據(jù),每6 ms中斷一次,完成一幀數(shù)據(jù)上傳;接收字?jǐn)?shù)可軟件設(shè)置,數(shù)據(jù)接收時(shí)板卡自動(dòng)存儲(chǔ),至少可記錄十分鐘遙測(cè)數(shù)據(jù),且不丟幀;傳輸速率32 MB/s;傳輸距離≥5 m。
LVDS遙測(cè)信號(hào)只含有1路數(shù)據(jù)信號(hào)和1路時(shí)鐘信號(hào)[5]。本采集卡主要有兩大功能模塊:LVDS遙測(cè)信號(hào)收發(fā)模塊、PXI/CPCI總線接口模塊。兩個(gè)模塊以一片F(xiàn)PGA(型號(hào)為EP1C12Q240)為核心,利用FPGA實(shí)現(xiàn)硬件總體時(shí)序邏輯控制、LVDS遙測(cè)信號(hào)的采集/發(fā)送功能。硬件總體設(shè)計(jì)框架如圖1所示。
圖1 LVDS遙測(cè)采集卡硬件結(jié)構(gòu)框架
RTX2012(Real Time Extension 2012)是 Interval Zero公司的重要產(chǎn)品,通過對(duì)Windows的硬件抽象層進(jìn)行硬實(shí)時(shí)擴(kuò)展[6],設(shè)計(jì)實(shí)現(xiàn)實(shí)時(shí)任務(wù)的管理、調(diào)度。它沒有對(duì)Windows系統(tǒng)進(jìn)行修改或封裝[7],支持部分win32API函數(shù),并擁有一套R(shí)TAPI實(shí)時(shí)函數(shù)(中斷處理函數(shù)為RTAPI獨(dú)有)[8],方便平臺(tái)間共享、移植軟件程序。
RTX2012實(shí)時(shí)子系統(tǒng)采用搶占式優(yōu)先級(jí)[9],分127個(gè)線程優(yōu)先級(jí),RTSS線程優(yōu)先于所有的Windows線程[10];實(shí)時(shí)特性達(dá)微秒級(jí),保證上下文線程切換,使得在亞微妙范圍內(nèi)的線程優(yōu)先級(jí)更高;完全支持多核CPU,可指定RTX在獨(dú)占的核上運(yùn)行;能精確控制IRQ、I/O、內(nèi)存等[11]。
RTX2012支持PCI/PCI-E總線上基于消息、線性的中斷[12],使得配置Win 7系統(tǒng)信息變得簡(jiǎn)單;RTX2012可以通過信號(hào)量、互斥體以及共享內(nèi)存等高速IPC對(duì)象和同步機(jī)制[13],實(shí)現(xiàn)RTX與Windows之間數(shù)據(jù)交換。其定時(shí)器時(shí)鐘頻率為100ns,最低定時(shí)器周期為 100 μs,并支持實(shí)時(shí)以太網(wǎng)、USB 通訊[14]。RTX2012支持Microsoft Visual Studio 2010/2008/2005,使得不同版本開發(fā)工具開發(fā)出的軟件程序可以較好兼容。
利用Visual Studio2010+RTX2012開發(fā)RTX驅(qū)動(dòng),通過VS2010中“RTX Device Driver”選項(xiàng)按向?qū)?chuàng)建驅(qū)動(dòng)程序框架,添加對(duì)應(yīng)功能函數(shù)代碼,經(jīng)編譯、運(yùn)行,最后生成.rtss文件。
利用向?qū)Э焖賱?chuàng)建的RTX驅(qū)動(dòng)程序框架,主要提供了設(shè)備管理和中斷管理方面的基本函數(shù)[15],供開發(fā)人員調(diào)用以完成對(duì)設(shè)備的初始化、清除設(shè)備資源、中斷處理等功能。
DeviceSearch函數(shù)用于設(shè)備查找;DeviceInit函數(shù)用于獲取板卡的內(nèi)存空間、中斷號(hào)等硬件資源;RtGetBusDataByOffset函數(shù)用于訪問9054配置空間,獲取本地寄存器和存儲(chǔ)空間內(nèi)存與中斷信息[16];Rt?TranslateBusAddress和RtMapMemory函數(shù)將物理地址映射為虛擬地址,用基地址加上偏移量,RTX驅(qū)動(dòng)程序就可讀寫本地寄存器或內(nèi)存空間[17];Device?Cleanup用于釋放板卡硬件資源。RtCreateShared?Memory和RtOpenSharedMemory用于創(chuàng)建、打開共享內(nèi)存;RtCloseHandle用于釋放共享內(nèi)存;DeviceISR函數(shù)判斷中斷來源;DeviceIST函數(shù)處理中斷;RtAt?tachInterruptVectorEx將中斷向量與中斷服務(wù)線程IST、中斷服務(wù)例程ISR相關(guān)聯(lián)[18],針對(duì)中斷是否共享、中斷電平觸發(fā)方式、傳遞上下文等進(jìn)行對(duì)應(yīng)設(shè)置。
進(jìn)入主函數(shù)main()中,首選創(chuàng)建互斥體對(duì)象,防止其他線程對(duì)某一數(shù)據(jù)進(jìn)行同時(shí)訪問。隨后,為設(shè)備創(chuàng)建控制資源,這些控制資源主要包括以下:Windows指向RTX的事件對(duì)象hW2REvent,RTX指向Windows的事件對(duì)象hR2WEvent,Windows和RTX之間的共享內(nèi)存對(duì)象hDevCtrlShare,RTX命令接收線程對(duì)象hCmdThread。其中每塊板卡都將會(huì)創(chuàng)建一個(gè)命令接收線程,而且接收線程的入口地址相同。如果在創(chuàng)建這些控制資源的過程中,任何一個(gè)資源創(chuàng)建失敗,則退出主函數(shù);反之,所有控制資源都創(chuàng)建成功,則掛起當(dāng)前線程,等待用戶發(fā)出相應(yīng)的Windows指令,就進(jìn)入RTX命令接收線程進(jìn)行相應(yīng)處理。
板卡初始化函數(shù)的聲明為int InitializeO?neDevRtss(ULONG DevNum);,首先判斷板卡是否打開,如果已經(jīng)打開,則返回-1,表示初始化失敗。如果板卡尚未打開,則利用DeviceSearch函數(shù),根據(jù)vendorID和deviceID查詢PXI總線上所有設(shè)備[19],LVDS遙測(cè)采集卡vendorID、deviceID依次為0x10b5、0x0104,查詢到LVDS遙測(cè)卡后,返回設(shè)備的bus、slot和ConfigData信息,并進(jìn)行一系列的板卡硬件資源的初始化任務(wù)[20],主要包括對(duì)9054寄存器、Local寄存器基地址獲取、內(nèi)存映射。之后,禁止中斷,通過PciGetIrq獲取中斷請(qǐng)求Irq,并通過RtAttachInterrup?tVectorEx函數(shù)進(jìn)行中斷連接[21]。連接中斷成功后,清除中斷。隨后,利用RtCreateLock函數(shù)創(chuàng)建發(fā)送時(shí)鐘、接收時(shí)鐘,并用RtCreateEvent函數(shù)創(chuàng)建接收完成事件通知。如果所有操作都未返回FALSE,則板卡打開狀態(tài)變量bOpened置為TRUE,板卡初始化成功。否則,初始化失敗,并利用CleanUpOneDevRtss(ULONG DevNum)釋放已經(jīng)獲得的板卡資源。
清除設(shè)備的函數(shù)聲明為void CleanU?pOneDevRtss(ULONG DevNum);,當(dāng)初始化失敗時(shí)或關(guān)閉板卡時(shí),需調(diào)用該清除設(shè)備函數(shù)。首先,禁止中斷,取消9054和本地地址空間的內(nèi)存映射,之后,取消中斷連接,關(guān)閉已經(jīng)創(chuàng)建的發(fā)送Lock、接收Lock句柄以及接收完成事件,最后將板卡打開狀態(tài)變量RtssDevCtrl[DevNum].bOpened置為FALSE,即可完成板卡資源釋放清除功能。
中斷處理函數(shù)的聲明形式為BOOLEAN RTAPI IST(PVOID pContext);,中斷處理流程見圖2。
圖2 中斷處理流程
當(dāng)有中斷產(chǎn)生時(shí),進(jìn)入DeviceISR判斷中斷來源和類型,讀取中斷狀態(tài)寄存器的值。如果不是本設(shè)備中斷,就將中斷傳遞到下一個(gè)共享該中斷號(hào)的設(shè)備;如果是本設(shè)備中斷,先禁止中斷,再清除中斷,并加鎖以同步,判斷設(shè)備是否開始接收數(shù)據(jù)。當(dāng)設(shè)備沒有開始接收時(shí),就設(shè)置接收數(shù)目,并將數(shù)據(jù)從硬件底層讀取放入驅(qū)動(dòng)緩沖區(qū)中,數(shù)據(jù)接收完成時(shí),就設(shè)置接收完成事件,并解鎖,允許中斷,繼續(xù)等待下一個(gè)中斷到來,完成數(shù)據(jù)接收。其中,將數(shù)據(jù)從硬件板卡上讀到驅(qū)動(dòng)FIFO中的代碼實(shí)現(xiàn)如下:
該函數(shù)的聲明形式為DWORD WINAPI RtxCmdThread(PVOID param);,用戶通過 Windows友好的交互界面下發(fā)不同的操作命令,主函數(shù)接收命令,并傳入RTX命令接收線程。RTX根據(jù)接收到Windows發(fā)出的不同命令進(jìn)行相應(yīng)的處理,這些命令主要包括打開板卡、關(guān)閉關(guān)閉、開始接收、停止接收操作。具體代碼實(shí)現(xiàn)如下:
為了更好實(shí)現(xiàn)LVDS遙測(cè)卡的各項(xiàng)功能,還需要封裝一些用戶接口函數(shù),主要包括板卡的打開、關(guān)閉、發(fā)送數(shù)據(jù)、停止發(fā)送、接收數(shù)據(jù)、停止接收等。函數(shù)封裝的具體形式如下:
通過共享內(nèi)存(ShareMemory)和信號(hào)量(Sema?phore),實(shí)時(shí)進(jìn)程RTSS與上層應(yīng)用程序Win32進(jìn)程實(shí)現(xiàn)數(shù)據(jù)共享,通信過程如圖3所示。
圖3 RTSS與Win32通信簡(jiǎn)圖
當(dāng)RTSS訪問共享內(nèi)存中數(shù)據(jù)時(shí),向共享內(nèi)存發(fā)送請(qǐng)求訪問信號(hào)量;共享內(nèi)存接到請(qǐng)求信號(hào)量,向上層Win32發(fā)送詢問信號(hào)量。如果上層應(yīng)用已經(jīng)準(zhǔn)備好并將數(shù)據(jù)寫入共享內(nèi)存,在收到詢問信號(hào)量后,則下發(fā)準(zhǔn)備好信號(hào)量。此時(shí),共享內(nèi)存再返回可以訪問信號(hào)量給RTSS,RTSS就可以從共享內(nèi)存中讀取數(shù)據(jù)。反之,當(dāng)上層Win32進(jìn)程需要訪問共享內(nèi)存數(shù)據(jù)時(shí),過程同理。
對(duì)Windows下開發(fā)的LVDS遙測(cè)采集卡WDM驅(qū)動(dòng)程序進(jìn)行多次測(cè)試,板卡自檢結(jié)果如圖4所示,出現(xiàn)了丟幀、誤碼的情況。這是因?yàn)轱w控組件綜合測(cè)試系統(tǒng)對(duì)實(shí)時(shí)性要求較高,要求每6 ms來一次中斷,完成一幀數(shù)據(jù)256字節(jié)的上傳,而Windows系統(tǒng)的最小時(shí)間粒度僅為10 ms,無法滿足實(shí)時(shí)性要求[22]。相應(yīng)的利用Windows7+RTX2012開發(fā)的RTX驅(qū)動(dòng)程序進(jìn)行多次重復(fù)測(cè)試,結(jié)果如圖5所示,接收到的數(shù)據(jù)與發(fā)送的數(shù)據(jù)完全吻合,表明設(shè)計(jì)開發(fā)的LVDS遙測(cè)采集卡的RTX驅(qū)動(dòng)程序?qū)崟r(shí)、準(zhǔn)確、可靠的完成了板卡的數(shù)據(jù)接收任務(wù),很好地滿足了系統(tǒng)對(duì)數(shù)據(jù)接收實(shí)時(shí)性的要求。
鑒于飛控組件綜合測(cè)試系統(tǒng)對(duì)接收LVDS遙測(cè)信息的實(shí)時(shí)性要求,開發(fā)了Win7+RTX2012下的LVDS遙測(cè)采集卡的RTX驅(qū)動(dòng)程序。本文詳細(xì)介紹RTX2012的驅(qū)動(dòng)程序開發(fā)要點(diǎn),并給出了詳實(shí)的開發(fā)過程和方法。經(jīng)反復(fù)測(cè)試,該RTX驅(qū)動(dòng)程序運(yùn)行穩(wěn)定。目前,所開發(fā)的RTX驅(qū)動(dòng)程序已應(yīng)用于測(cè)試設(shè)備,能準(zhǔn)確、實(shí)時(shí)地完成LVDS遙測(cè)信號(hào)接收任務(wù)。
圖4 Windows驅(qū)動(dòng)程序測(cè)試結(jié)果
圖5 RTX驅(qū)動(dòng)程序測(cè)試結(jié)果
參考文獻(xiàn):
[1]姜日東,徐志躍.基于PCI總線無時(shí)鐘LVDS數(shù)據(jù)采集卡的研究[J].電子設(shè)計(jì)工程,2013(17):100-102.
[2]楊維,石德乾.基于Windows XP+RTX的火控調(diào)試平臺(tái)軟件設(shè)計(jì)[J].火炮發(fā)射與控制學(xué)報(bào),2013(4):30-34.
[3]劉婷,蔡鵬飛.Windows7的推廣與用戶實(shí)際應(yīng)用習(xí)慣的磨合[J].電腦編程技巧與維護(hù),2013(2):113-114.
[4]胡建,張紅波.某型導(dǎo)彈飛控系統(tǒng)遙測(cè)信息接收裝置設(shè)計(jì)[J].電子設(shè)計(jì)工,2012(13):69-70,75.
[5]邵華,劉亞斌,徐志躍.實(shí)時(shí)高速LVDS串行數(shù)據(jù)采集系統(tǒng)的設(shè)計(jì)[J].計(jì)算機(jī)測(cè)量與控制,2008(3):424-426.
[6]Ardence公司.RTX技術(shù)白皮書[S].北京航天捷越(美斯比)科技有限公司,2004.
[7]韓玉芹.基于RTX子系統(tǒng)的導(dǎo)彈試驗(yàn)實(shí)時(shí)測(cè)控系統(tǒng)研發(fā)[D].西安:西安電子科技大,2013.
[8]王立紅,方華.基于WINDOWS+RTX的艦炮火控測(cè)試評(píng)估系統(tǒng)開發(fā)[J].火力與指揮控制,2012,(11):199-201,205.
[9]董曉明.搶占式動(dòng)態(tài)優(yōu)先級(jí)實(shí)時(shí)調(diào)度算法[J].職業(yè),2012(29):91.
[10]金相男.基于Ardence RTX的1553B驅(qū)動(dòng)程序開發(fā)[J].電子設(shè)計(jì)工程,2014(2):149-151,155.
[11]王偉志,襲著有,王贄.基于RTX實(shí)時(shí)仿真系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].電子設(shè)計(jì)工程,2013(12):24-27.
[12]張前福,王華闖,許俊平,等.基于RTX的實(shí)時(shí)處理系統(tǒng)設(shè)計(jì)[J].微電子學(xué)與計(jì)算機(jī),2012(8):58-61,65.
[13]張蓓蕾,夏偉杰,周建江.基于RTX的舵機(jī)控制系統(tǒng)研制[J].電子科,2011(11):77-79.
[14]黃鍵,龐亞華,薛順虎.RTX環(huán)境下PCI設(shè)備實(shí)時(shí)驅(qū)動(dòng)的開發(fā)[J].計(jì)算機(jī)工程,2010(20):211-213.
[15]吳佳楠,王偉,周軍濤,等.基于RTX實(shí)時(shí)模塊的飛控系統(tǒng)綜合測(cè)試系統(tǒng)實(shí)現(xiàn)[J].測(cè)控技術(shù),2010(9):72-76,84.
[16]王道彬,陳懷民,別洪武,等.基于RTX的實(shí)時(shí)測(cè)控系統(tǒng)軟件設(shè)計(jì)[J].火力與指揮控制,2009(8):125-127.
[17]詹金勇.PXI/PCI總線設(shè)備驅(qū)動(dòng)程序設(shè)計(jì)及應(yīng)用[D].武漢:華中科技大學(xué),2011.
[18]武文峰,張泓.基于RTX的PXI板卡驅(qū)動(dòng)程序開發(fā)[J].航空兵器,2012(3):51-54.
[19]付文芳,張萍.RTX下PCI9052驅(qū)動(dòng)程的開發(fā)[J].科技廣場(chǎng),2006(8):97-100.
[20]李宏科.一種基于RTX的實(shí)時(shí)系統(tǒng)的實(shí)現(xiàn)[J].裝備制造技術(shù),2006(3):55-56,65.
[21]張帆,史彩成.Windows驅(qū)動(dòng)開發(fā)技術(shù)詳解[M].北京:電子工業(yè)出版社,2008.
[22]胡浩.基于RTX實(shí)時(shí)系統(tǒng)ARINC429總線通信驅(qū)動(dòng)開發(fā)[J].計(jì)算機(jī)測(cè)量與控制,2015(1):310-312.