韓豐娟 叢瀟雨 郭山紅 付姣姣
(南京理工大學(xué)電子工程與光電技術(shù)學(xué)院 江蘇 南京 210094)
在導(dǎo)引頭系統(tǒng)研制過程中,仿真驗(yàn)證占有非常重要的地位[1],為了能更接近于真實(shí)的作戰(zhàn)場(chǎng)景,近年來導(dǎo)引頭系統(tǒng)仿真對(duì)實(shí)時(shí)性的要求越來越高。目前實(shí)時(shí)系統(tǒng)仿真難于實(shí)現(xiàn)的原因主要有兩方面,一方面是仿真多基于Windows操作系統(tǒng),雖然Windows擁有強(qiáng)大的圖形化接口與眾多第三方硬件的支撐,但其存在著延遲不確定、線程優(yōu)先級(jí)倒置、線程調(diào)度機(jī)制不確定、IO設(shè)備訪問受限、定時(shí)器精度差等諸多問題,很難滿足實(shí)時(shí)性要求。另一方面復(fù)雜的仿真系統(tǒng)多為多機(jī)互聯(lián)的拓?fù)浣Y(jié)構(gòu),目前常用的通信機(jī)制如紅外、無線、USB等,很難實(shí)現(xiàn)多機(jī)間的實(shí)時(shí)通信。
為了提高Windows系統(tǒng)的實(shí)時(shí)性,滿足硬實(shí)時(shí)系統(tǒng)嚴(yán)格的響應(yīng)時(shí)間要求,本文采用了美國(guó)IntervlaZero公司的Windows操作系統(tǒng)實(shí)時(shí)性解決方案RTX[2]。該方案的實(shí)時(shí)性主要體現(xiàn)在以下三個(gè)方面:第一,相比于Windows下毫秒級(jí)的定時(shí)精度,RTX下可達(dá)到100 ns[3-4];第二,RTX能獨(dú)立地進(jìn)行中斷管理,而不受Windows干擾[5],可以實(shí)現(xiàn)對(duì)中斷的實(shí)時(shí)響應(yīng)。第三,RTX對(duì)線程的控制透明、靈活,擁有更多的線程數(shù)和更高的優(yōu)先級(jí),線程間切換時(shí)間小于10 μs,能夠大幅優(yōu)化導(dǎo)引頭回波產(chǎn)生和信號(hào)處理的時(shí)間,提高系統(tǒng)實(shí)時(shí)性。在滿足實(shí)時(shí)性的同時(shí),RTX可以通過共享內(nèi)存的方式與Windows實(shí)現(xiàn)通信,從而保留了對(duì)C/C++標(biāo)準(zhǔn)模板庫(kù)與圖形化交互界面的支持。為了解決多機(jī)間通信同步的問題,本文采用了由反射內(nèi)存卡+光纖Hub卡組成的反射內(nèi)存網(wǎng)通信機(jī)制,它是一種實(shí)時(shí)網(wǎng)絡(luò)[6],實(shí)現(xiàn)了基于總線公共存儲(chǔ)策略的硬件級(jí)數(shù)據(jù)同步傳輸,具有速度快、通信協(xié)議簡(jiǎn)單、傳輸糾錯(cuò)能力強(qiáng)等優(yōu)點(diǎn)。
基于以上的分析,本文提出了基于RTX+Windows+反射內(nèi)存網(wǎng)的解決方案,完成了一種多機(jī)互聯(lián)的導(dǎo)引頭實(shí)時(shí)系統(tǒng)仿真架構(gòu)設(shè)計(jì),實(shí)現(xiàn)了對(duì)實(shí)時(shí)性和友好交互的兼顧。
如圖1所示,本文導(dǎo)引頭實(shí)時(shí)系統(tǒng)仿真分為六個(gè)模塊,分別是作戰(zhàn)想定人機(jī)接口、導(dǎo)引頭回波產(chǎn)生、導(dǎo)引頭干擾產(chǎn)生、導(dǎo)引頭接收機(jī)1、導(dǎo)引頭接收機(jī)2、數(shù)據(jù)融合與場(chǎng)景演示。每個(gè)模塊所在的計(jì)算機(jī)構(gòu)成分布式控制節(jié)點(diǎn),各節(jié)點(diǎn)通過反射內(nèi)存卡在光纖HUB上實(shí)現(xiàn)互連,組成了一種星型結(jié)構(gòu)的反射內(nèi)存網(wǎng)絡(luò)。整個(gè)系統(tǒng)在RTX下進(jìn)行回波產(chǎn)生、干擾產(chǎn)生、信號(hào)處理、數(shù)據(jù)融合,在Windows下進(jìn)行可視化展示,RTX與Windows通過共享內(nèi)存進(jìn)行通信,各個(gè)模塊在中斷機(jī)制的控制下通過反射內(nèi)存網(wǎng)實(shí)現(xiàn)同步數(shù)據(jù)傳輸,進(jìn)而實(shí)現(xiàn)實(shí)時(shí)仿真。
圖1 導(dǎo)引頭系統(tǒng)架構(gòu)圖
圖2給出了系統(tǒng)的數(shù)據(jù)流程,用戶在作戰(zhàn)想定人機(jī)接口模塊的Windows軟件界面上輸入裝訂信息,RTX應(yīng)用程序通過共享內(nèi)存讀到裝訂信息后,再通過反射內(nèi)存網(wǎng)將其分別發(fā)送給回波產(chǎn)生模塊和干擾產(chǎn)生模塊。兩模塊的RTX程序根據(jù)得到的信息計(jì)算出回波與干擾信號(hào),并傳送給導(dǎo)引頭接收機(jī)1和導(dǎo)引頭接收機(jī)2進(jìn)行信號(hào)處理。接收機(jī)模塊將處理得到的目標(biāo)信息通過反射內(nèi)存網(wǎng)傳送給數(shù)據(jù)融合與場(chǎng)景演示模塊,該模塊在RTX系統(tǒng)下進(jìn)行數(shù)據(jù)融合,然后將融合結(jié)果通過共享內(nèi)存?zhèn)魉徒oWindows進(jìn)行動(dòng)畫展示,最終完成整個(gè)導(dǎo)引頭工作過程的實(shí)時(shí)仿真。
圖2 數(shù)據(jù)流程圖
(1) 在Windows下進(jìn)行RTX開發(fā)。
RTX是在Windows環(huán)境下安裝和運(yùn)行的。IntervalZero公司將RTX封裝為一個(gè)實(shí)時(shí)子系統(tǒng)RTSS,以驅(qū)動(dòng)的形式加載在Windows上。開發(fā)人員可以使用Visual Studio(簡(jiǎn)稱vs)工具來加載RTSS并進(jìn)行RTX開發(fā),具體步驟如下:
① 安裝WDK(Windows Driver Kit)。
② 依次安裝:RTX SDK、RTX runtime、RTX MM。
③ 在vs中新建RTX Application工程。
④ 在新建工程下調(diào)用RTSS的API函數(shù)RtAPI進(jìn)行相關(guān)應(yīng)用程序開發(fā)。
(2) RTX與Windows間的通信機(jī)制。
為了克服與Win32進(jìn)程間數(shù)據(jù)交互的困難,RTX提供了IPC通信機(jī)制:共享內(nèi)存、事件體、互斥體、信號(hào)量。其中共享內(nèi)存實(shí)現(xiàn)進(jìn)程間的數(shù)據(jù)交互[7-8],事件體、互斥體、信號(hào)量保證進(jìn)程間的同步。本文基于該機(jī)制使系統(tǒng)具有實(shí)時(shí)性的同時(shí)能夠?qū)崿F(xiàn)友好的人機(jī)交互。
以數(shù)據(jù)融合與場(chǎng)景演示模塊為例,在RTX下創(chuàng)建共享內(nèi)存,然后將接收到的目標(biāo)位置、速度等信息寫入;在Windows下打開共享內(nèi)存后便可將信息讀出進(jìn)行動(dòng)畫展示,其中對(duì)共享內(nèi)存緩沖區(qū)訪問的同步通過互斥體實(shí)現(xiàn),任何一方對(duì)共享內(nèi)存進(jìn)行操作時(shí),都需要對(duì)互斥體加鎖,互斥體被釋放后共享內(nèi)存才可被另一方使用。該過程中用到的RtAPI函數(shù)如表1所示。
表1 RtAPI中IPC通信實(shí)現(xiàn)函數(shù)
本文導(dǎo)引頭實(shí)時(shí)系統(tǒng)仿真中多機(jī)間的數(shù)據(jù)傳輸是通過反射內(nèi)存網(wǎng)實(shí)現(xiàn)的,因此對(duì)RTX下反射內(nèi)存卡驅(qū)動(dòng)的開發(fā)十分關(guān)鍵。首先需要在RTX系統(tǒng)的Control Pannel工具中將設(shè)備從Windows移到RTX下。根據(jù)系統(tǒng)需要,本文的反射內(nèi)存卡RTX驅(qū)動(dòng)主要實(shí)現(xiàn)以下三個(gè)功能:開關(guān)設(shè)備、中斷控制以及讀寫數(shù)據(jù)。驅(qū)動(dòng)程序的流程如圖3所示。下面對(duì)三個(gè)功能的實(shí)現(xiàn)分別進(jìn)行闡述:
(1) 開關(guān)設(shè)備 打開反射內(nèi)存卡的步驟如下:首先將驅(qū)動(dòng)程序附加到硬件設(shè)備上;然后將總線地址轉(zhuǎn)換為相應(yīng)的系統(tǒng)邏輯地址,再映射到用戶的虛擬地址空間;其次在I/O總線上設(shè)置設(shè)備的總線配置數(shù)據(jù);最后使用得到的地址空間句柄對(duì)設(shè)備中斷狀態(tài),DMA等進(jìn)行初始化配置。
關(guān)閉反射內(nèi)存卡只需關(guān)掉對(duì)設(shè)備進(jìn)行操作的句柄,RTX會(huì)自己回收內(nèi)存資源。
(2) 中斷控制 中斷控制包括中斷使能、設(shè)置中斷類型、發(fā)中斷、響應(yīng)中斷與等中斷五個(gè)部分。① 中斷使能,首先創(chuàng)建事件對(duì)象,然后檢查設(shè)備是否支持MSI或MSI-X,掛載中斷,最后將中斷線程/例程關(guān)聯(lián)到line-based/message-based的硬件中斷。② 設(shè)置中斷類型,通過配置反射內(nèi)存卡本地配置寄存器的中斷狀態(tài)位來實(shí)現(xiàn)。③ 發(fā)中斷,即將中斷節(jié)點(diǎn)、附加信息、控制位信息(NIC、NTN、NTD)寫入到本地配置寄存器,其中寫NIC將啟動(dòng)網(wǎng)絡(luò)中斷。④ 響應(yīng)中斷,啟動(dòng)網(wǎng)絡(luò)中斷后,中斷響應(yīng)函數(shù)將判斷中斷類型,然后設(shè)置相應(yīng)的事件對(duì)象。⑤ 等中斷,等待中斷觸發(fā),獲取事件對(duì)象句柄,然后取出中斷附加信息(ISD)、中斷節(jié)點(diǎn)(SID),最后重新設(shè)置中斷類型。
(3) 讀寫數(shù)據(jù) 本文使用DMA和memcpy兩種方式分別實(shí)現(xiàn)大數(shù)據(jù)塊和小數(shù)據(jù)塊的讀寫。
寫數(shù)據(jù)時(shí)首先判斷數(shù)據(jù)長(zhǎng)度,若其小于DMA傳輸?shù)淖钚≈?,則直接使用memcpy將用戶數(shù)據(jù)復(fù)制到反射內(nèi)存卡的內(nèi)存中,否則,使用DMA進(jìn)行傳輸。讀數(shù)據(jù)時(shí)依舊首先判斷數(shù)據(jù)長(zhǎng)度,若其小于DMA傳輸?shù)淖钚≈担瑒t直接使用memcpy將反射內(nèi)存卡中的數(shù)據(jù)復(fù)制到用戶申請(qǐng)的內(nèi)存中,否則,使用DMA進(jìn)行傳輸。其中DMA傳輸數(shù)據(jù)的步驟如下:判斷傳輸方向;得到傳輸數(shù)據(jù)物理地址;利用中斷的方式控制DMA對(duì)物理地址上的數(shù)據(jù)進(jìn)行分塊傳輸。
圖3 驅(qū)動(dòng)程序設(shè)計(jì)流程圖
相比于Windows下多線程使用的諸多局限性,RTX留給用戶的操作空間大,可支持多達(dá)997個(gè)獨(dú)立進(jìn)程,每個(gè)進(jìn)程的線程數(shù)不設(shè)限,由用戶自由設(shè)置。RTX的線程具有128個(gè)優(yōu)先級(jí)且均高于Windows的所有線程和中斷[9],線程間切換時(shí)間小于10 μs,因此使用RTX的多線程可以極大提高程序的實(shí)時(shí)性。本文對(duì)多線程的應(yīng)用體現(xiàn)在兩個(gè)方面,一是實(shí)現(xiàn)數(shù)據(jù)的傳輸與處理并發(fā)進(jìn)行,本文的數(shù)據(jù)傳輸是通過DMA控制加反射內(nèi)存網(wǎng)的方式實(shí)現(xiàn),不需要占用主機(jī)CPU資源,因此在數(shù)據(jù)傳輸過程中閑置的CPU可以用來進(jìn)行數(shù)據(jù)處理,從而大大提升系統(tǒng)的工作效率。二是通過RTX多線程將計(jì)算機(jī)的多核充分利用起來實(shí)現(xiàn)信號(hào)處理速度的提升,提高系統(tǒng)的實(shí)時(shí)性。RTX系統(tǒng)下線程創(chuàng)建及管理方法如下:
在RTX的Control Pannel工具中為系統(tǒng)分配內(nèi)核,其中Windows至少分配一個(gè)核,其余供RTX使用。RTX程序中主線程會(huì)占用第一個(gè)核,剩余的內(nèi)核可由開發(fā)人員按照需要自由分配給子線程,為了系統(tǒng)最優(yōu),一般建議一個(gè)核分配一個(gè)線程。此外,為線程分配的內(nèi)核必須屬于其父進(jìn)程。RTX下創(chuàng)建使用線程的C++代碼如下:
SetProcessAffinityMask(GetCurrentProcess(), 0x3E);
//為當(dāng)前進(jìn)程分配內(nèi)核
ULONG RTFCNDCL childThread1(void*nContext)
{
//TODO:在此放入代碼
}
childThread1=RtCreateThread(NULL,0,thread01,NULL,CREATE_SUSPENDED,NULL);
//創(chuàng)建子線程
RtSetThreadPriority(childThread1, 120);
//為子線程設(shè)置優(yōu)先級(jí)
SetThreadAffinityMask(childThread1, 0x04);
//為子線程分配內(nèi)核
ResumeThread(childThread1);
//啟動(dòng)子線程
SuspendThread(childThread1);
//掛起子線程
本文首先對(duì)所實(shí)現(xiàn)的導(dǎo)引頭實(shí)時(shí)仿真系統(tǒng)的準(zhǔn)確性、實(shí)時(shí)性、與真實(shí)作戰(zhàn)場(chǎng)景的相似性在高性能硬件下分別進(jìn)行了驗(yàn)證。計(jì)算機(jī)CPU6核、主頻3.7 GHz、32 GB內(nèi)存,反射內(nèi)存卡采用PCI-5565PIORC,PCIE接口,容量128 MB字節(jié)。
(1) 準(zhǔn)確性驗(yàn)證 如圖4所示,在作戰(zhàn)想定人機(jī)接口模塊輸入裝訂信息,在數(shù)據(jù)融合與場(chǎng)景演示模塊將數(shù)據(jù)導(dǎo)引頭系統(tǒng)仿真結(jié)果通過Unity進(jìn)行動(dòng)畫展示,可以得到目標(biāo)的飛行狀態(tài),結(jié)果準(zhǔn)確。
圖4 裝訂信息輸入界面
(2) 實(shí)時(shí)性驗(yàn)證 本文從以下四個(gè)方面分別驗(yàn)證實(shí)時(shí)性:
① 本文使用Latrey Time工具對(duì)仿真系統(tǒng)在采用RTX前后的延遲時(shí)間進(jìn)行了測(cè)量,結(jié)果如圖5所示,可以看到在Windows下系統(tǒng)延遲較大,且非常不穩(wěn)定,最高延遲達(dá)32 ms,而RTX下系統(tǒng)延遲時(shí)間均小于10 μs,且相對(duì)穩(wěn)定,符合實(shí)時(shí)系統(tǒng)要求。
圖5 時(shí)延示意圖
② 在RTX下使用RtGetClockTime()函數(shù)獲取系統(tǒng)時(shí)間來計(jì)算中斷響應(yīng)時(shí)間,在Windows下使用QueryPerformanceFrequency()函數(shù)和QueryPerformanceConter()函數(shù)獲取系統(tǒng)計(jì)時(shí)器頻率和數(shù)值,計(jì)算得到Windows下的中斷響應(yīng)時(shí)間,進(jìn)行10次測(cè)試后統(tǒng)計(jì)結(jié)果如圖6所示??梢钥吹絎indows下系統(tǒng)中斷響應(yīng)時(shí)間較大,且極不穩(wěn)定,RTX下系統(tǒng)中斷響應(yīng)時(shí)間穩(wěn)定在12 μs左右,符合實(shí)時(shí)系統(tǒng)要求。
圖6 RTX與Windows中斷響應(yīng)時(shí)間比較
③ 使用CPUUsage工具和Monitor Utility工具獲得CPU使用率和線程切換時(shí)間,在單線程和多線程下的CPU利用率如圖7所示。可以看到,在多線程下CPU核的利用率大大提高。一次信號(hào)處理時(shí)間由2 s減少為0.5 s,提高了系統(tǒng)的實(shí)時(shí)性。通過查看Monitor的輸出日志我們獲得線程切換時(shí)間,最大為為7.5 μs,符合實(shí)時(shí)系統(tǒng)要求。
圖7 CPU使用率打印信息
④ 使用RtGetClockTIme()函數(shù)獲得傳輸時(shí)間,根據(jù)傳輸數(shù)據(jù)大小計(jì)算得到反射內(nèi)存網(wǎng)數(shù)據(jù)傳輸率約為880 Mbit/s,滿足實(shí)時(shí)傳輸要求。
(3) 與真實(shí)場(chǎng)景的相似性驗(yàn)證 分別對(duì)本文實(shí)時(shí)仿真系統(tǒng)與傳統(tǒng)MATLAB軟件仿真系統(tǒng)的響應(yīng)延遲、信號(hào)處理時(shí)間與數(shù)據(jù)傳輸率進(jìn)行測(cè)試,取二十次測(cè)試的平均值,同真實(shí)作戰(zhàn)場(chǎng)景下的性能指標(biāo)進(jìn)行對(duì)比,得到表2。從表中可以看到,傳統(tǒng)軟件仿真系統(tǒng)響應(yīng)延遲為10.4 ms,信號(hào)處理時(shí)間為2.7 s,而本文所設(shè)計(jì)的實(shí)時(shí)仿真系統(tǒng)響應(yīng)延遲僅為8.7 μs,信號(hào)處理時(shí)間為540 ms,更加接近真實(shí)作戰(zhàn)場(chǎng)景下系統(tǒng)響應(yīng)延遲和信號(hào)處理時(shí)間。另一方面,本文設(shè)計(jì)的實(shí)時(shí)仿真系統(tǒng)采用模塊化的設(shè)計(jì),各模塊之間的數(shù)據(jù)傳輸速為880 Mbit/s,相比于傳統(tǒng)MATLAB單機(jī)軟件仿真,更加接近于真實(shí)作戰(zhàn)場(chǎng)景。
表2 仿真方案性能對(duì)比
本文使用RTX及反射內(nèi)存網(wǎng)技術(shù)設(shè)計(jì)了一種導(dǎo)引頭實(shí)時(shí)系統(tǒng)仿真架構(gòu),準(zhǔn)確性高,實(shí)時(shí)性好,與傳統(tǒng)的MATLAB軟件仿真方案相比,更接近于真實(shí)作戰(zhàn)環(huán)境。測(cè)試結(jié)果表明,系統(tǒng)仿真結(jié)果準(zhǔn)確,計(jì)算機(jī)資源利用率較高,整體時(shí)延小于10 μs,中斷響應(yīng)約為12 μs,跨主機(jī)傳輸速度約為880 Mbit/s,滿足實(shí)時(shí)系統(tǒng)要求。