韓豐娟 叢瀟雨 郭山紅 付姣姣
(南京理工大學電子工程與光電技術學院 江蘇 南京 210094)
在導引頭系統研制過程中,仿真驗證占有非常重要的地位[1],為了能更接近于真實的作戰場景,近年來導引頭系統仿真對實時性的要求越來越高。目前實時系統仿真難于實現的原因主要有兩方面,一方面是仿真多基于Windows操作系統,雖然Windows擁有強大的圖形化接口與眾多第三方硬件的支撐,但其存在著延遲不確定、線程優先級倒置、線程調度機制不確定、IO設備訪問受限、定時器精度差等諸多問題,很難滿足實時性要求。另一方面復雜的仿真系統多為多機互聯的拓撲結構,目前常用的通信機制如紅外、無線、USB等,很難實現多機間的實時通信。
為了提高Windows系統的實時性,滿足硬實時系統嚴格的響應時間要求,本文采用了美國IntervlaZero公司的Windows操作系統實時性解決方案RTX[2]。該方案的實時性主要體現在以下三個方面:第一,相比于Windows下毫秒級的定時精度,RTX下可達到100 ns[3-4];第二,RTX能獨立地進行中斷管理,而不受Windows干擾[5],可以實現對中斷的實時響應。第三,RTX對線程的控制透明、靈活,擁有更多的線程數和更高的優先級,線程間切換時間小于10 μs,能夠大幅優化導引頭回波產生和信號處理的時間,提高系統實時性。在滿足實時性的同時,RTX可以通過共享內存的方式與Windows實現通信,從而保留了對C/C++標準模板庫與圖形化交互界面的支持。為了解決多機間通信同步的問題,本文采用了由反射內存卡+光纖Hub卡組成的反射內存網通信機制,它是一種實時網絡[6],實現了基于總線公共存儲策略的硬件級數據同步傳輸,具有速度快、通信協議簡單、傳輸糾錯能力強等優點。
基于以上的分析,本文提出了基于RTX+Windows+反射內存網的解決方案,完成了一種多機互聯的導引頭實時系統仿真架構設計,實現了對實時性和友好交互的兼顧。
如圖1所示,本文導引頭實時系統仿真分為六個模塊,分別是作戰想定人機接口、導引頭回波產生、導引頭干擾產生、導引頭接收機1、導引頭接收機2、數據融合與場景演示。每個模塊所在的計算機構成分布式控制節點,各節點通過反射內存卡在光纖HUB上實現互連,組成了一種星型結構的反射內存網絡。整個系統在RTX下進行回波產生、干擾產生、信號處理、數據融合,在Windows下進行可視化展示,RTX與Windows通過共享內存進行通信,各個模塊在中斷機制的控制下通過反射內存網實現同步數據傳輸,進而實現實時仿真。

圖1 導引頭系統架構圖
圖2給出了系統的數據流程,用戶在作戰想定人機接口模塊的Windows軟件界面上輸入裝訂信息,RTX應用程序通過共享內存讀到裝訂信息后,再通過反射內存網將其分別發送給回波產生模塊和干擾產生模塊。兩模塊的RTX程序根據得到的信息計算出回波與干擾信號,并傳送給導引頭接收機1和導引頭接收機2進行信號處理。接收機模塊將處理得到的目標信息通過反射內存網傳送給數據融合與場景演示模塊,該模塊在RTX系統下進行數據融合,然后將融合結果通過共享內存傳送給Windows進行動畫展示,最終完成整個導引頭工作過程的實時仿真。

圖2 數據流程圖
(1) 在Windows下進行RTX開發。
RTX是在Windows環境下安裝和運行的。IntervalZero公司將RTX封裝為一個實時子系統RTSS,以驅動的形式加載在Windows上。開發人員可以使用Visual Studio(簡稱vs)工具來加載RTSS并進行RTX開發,具體步驟如下:
① 安裝WDK(Windows Driver Kit)。
② 依次安裝:RTX SDK、RTX runtime、RTX MM。
③ 在vs中新建RTX Application工程。
④ 在新建工程下調用RTSS的API函數RtAPI進行相關應用程序開發。
(2) RTX與Windows間的通信機制。
為了克服與Win32進程間數據交互的困難,RTX提供了IPC通信機制:共享內存、事件體、互斥體、信號量。其中共享內存實現進程間的數據交互[7-8],事件體、互斥體、信號量保證進程間的同步。本文基于該機制使系統具有實時性的同時能夠實現友好的人機交互。
以數據融合與場景演示模塊為例,在RTX下創建共享內存,然后將接收到的目標位置、速度等信息寫入;在Windows下打開共享內存后便可將信息讀出進行動畫展示,其中對共享內存緩沖區訪問的同步通過互斥體實現,任何一方對共享內存進行操作時,都需要對互斥體加鎖,互斥體被釋放后共享內存才可被另一方使用。該過程中用到的RtAPI函數如表1所示。

表1 RtAPI中IPC通信實現函數
本文導引頭實時系統仿真中多機間的數據傳輸是通過反射內存網實現的,因此對RTX下反射內存卡驅動的開發十分關鍵。首先需要在RTX系統的Control Pannel工具中將設備從Windows移到RTX下。根據系統需要,本文的反射內存卡RTX驅動主要實現以下三個功能:開關設備、中斷控制以及讀寫數據。驅動程序的流程如圖3所示。下面對三個功能的實現分別進行闡述:
(1) 開關設備 打開反射內存卡的步驟如下:首先將驅動程序附加到硬件設備上;然后將總線地址轉換為相應的系統邏輯地址,再映射到用戶的虛擬地址空間;其次在I/O總線上設置設備的總線配置數據;最后使用得到的地址空間句柄對設備中斷狀態,DMA等進行初始化配置。
關閉反射內存卡只需關掉對設備進行操作的句柄,RTX會自己回收內存資源。
(2) 中斷控制 中斷控制包括中斷使能、設置中斷類型、發中斷、響應中斷與等中斷五個部分。① 中斷使能,首先創建事件對象,然后檢查設備是否支持MSI或MSI-X,掛載中斷,最后將中斷線程/例程關聯到line-based/message-based的硬件中斷。② 設置中斷類型,通過配置反射內存卡本地配置寄存器的中斷狀態位來實現。③ 發中斷,即將中斷節點、附加信息、控制位信息(NIC、NTN、NTD)寫入到本地配置寄存器,其中寫NIC將啟動網絡中斷。④ 響應中斷,啟動網絡中斷后,中斷響應函數將判斷中斷類型,然后設置相應的事件對象。⑤ 等中斷,等待中斷觸發,獲取事件對象句柄,然后取出中斷附加信息(ISD)、中斷節點(SID),最后重新設置中斷類型。
(3) 讀寫數據 本文使用DMA和memcpy兩種方式分別實現大數據塊和小數據塊的讀寫。
寫數據時首先判斷數據長度,若其小于DMA傳輸的最小值,則直接使用memcpy將用戶數據復制到反射內存卡的內存中,否則,使用DMA進行傳輸。讀數據時依舊首先判斷數據長度,若其小于DMA傳輸的最小值,則直接使用memcpy將反射內存卡中的數據復制到用戶申請的內存中,否則,使用DMA進行傳輸。其中DMA傳輸數據的步驟如下:判斷傳輸方向;得到傳輸數據物理地址;利用中斷的方式控制DMA對物理地址上的數據進行分塊傳輸。

圖3 驅動程序設計流程圖
相比于Windows下多線程使用的諸多局限性,RTX留給用戶的操作空間大,可支持多達997個獨立進程,每個進程的線程數不設限,由用戶自由設置。RTX的線程具有128個優先級且均高于Windows的所有線程和中斷[9],線程間切換時間小于10 μs,因此使用RTX的多線程可以極大提高程序的實時性。本文對多線程的應用體現在兩個方面,一是實現數據的傳輸與處理并發進行,本文的數據傳輸是通過DMA控制加反射內存網的方式實現,不需要占用主機CPU資源,因此在數據傳輸過程中閑置的CPU可以用來進行數據處理,從而大大提升系統的工作效率。二是通過RTX多線程將計算機的多核充分利用起來實現信號處理速度的提升,提高系統的實時性。RTX系統下線程創建及管理方法如下:
在RTX的Control Pannel工具中為系統分配內核,其中Windows至少分配一個核,其余供RTX使用。RTX程序中主線程會占用第一個核,剩余的內核可由開發人員按照需要自由分配給子線程,為了系統最優,一般建議一個核分配一個線程。此外,為線程分配的內核必須屬于其父進程。RTX下創建使用線程的C++代碼如下:
SetProcessAffinityMask(GetCurrentProcess(), 0x3E);
//為當前進程分配內核
ULONG RTFCNDCL childThread1(void*nContext)
{
//TODO:在此放入代碼
}
childThread1=RtCreateThread(NULL,0,thread01,NULL,CREATE_SUSPENDED,NULL);
//創建子線程
RtSetThreadPriority(childThread1, 120);
//為子線程設置優先級
SetThreadAffinityMask(childThread1, 0x04);
//為子線程分配內核
ResumeThread(childThread1);
//啟動子線程
SuspendThread(childThread1);
//掛起子線程
本文首先對所實現的導引頭實時仿真系統的準確性、實時性、與真實作戰場景的相似性在高性能硬件下分別進行了驗證。計算機CPU6核、主頻3.7 GHz、32 GB內存,反射內存卡采用PCI-5565PIORC,PCIE接口,容量128 MB字節。
(1) 準確性驗證 如圖4所示,在作戰想定人機接口模塊輸入裝訂信息,在數據融合與場景演示模塊將數據導引頭系統仿真結果通過Unity進行動畫展示,可以得到目標的飛行狀態,結果準確。

圖4 裝訂信息輸入界面
(2) 實時性驗證 本文從以下四個方面分別驗證實時性:
① 本文使用Latrey Time工具對仿真系統在采用RTX前后的延遲時間進行了測量,結果如圖5所示,可以看到在Windows下系統延遲較大,且非常不穩定,最高延遲達32 ms,而RTX下系統延遲時間均小于10 μs,且相對穩定,符合實時系統要求。

圖5 時延示意圖
② 在RTX下使用RtGetClockTime()函數獲取系統時間來計算中斷響應時間,在Windows下使用QueryPerformanceFrequency()函數和QueryPerformanceConter()函數獲取系統計時器頻率和數值,計算得到Windows下的中斷響應時間,進行10次測試后統計結果如圖6所示。可以看到Windows下系統中斷響應時間較大,且極不穩定,RTX下系統中斷響應時間穩定在12 μs左右,符合實時系統要求。

圖6 RTX與Windows中斷響應時間比較
③ 使用CPUUsage工具和Monitor Utility工具獲得CPU使用率和線程切換時間,在單線程和多線程下的CPU利用率如圖7所示。可以看到,在多線程下CPU核的利用率大大提高。一次信號處理時間由2 s減少為0.5 s,提高了系統的實時性。通過查看Monitor的輸出日志我們獲得線程切換時間,最大為為7.5 μs,符合實時系統要求。

圖7 CPU使用率打印信息
④ 使用RtGetClockTIme()函數獲得傳輸時間,根據傳輸數據大小計算得到反射內存網數據傳輸率約為880 Mbit/s,滿足實時傳輸要求。
(3) 與真實場景的相似性驗證 分別對本文實時仿真系統與傳統MATLAB軟件仿真系統的響應延遲、信號處理時間與數據傳輸率進行測試,取二十次測試的平均值,同真實作戰場景下的性能指標進行對比,得到表2。從表中可以看到,傳統軟件仿真系統響應延遲為10.4 ms,信號處理時間為2.7 s,而本文所設計的實時仿真系統響應延遲僅為8.7 μs,信號處理時間為540 ms,更加接近真實作戰場景下系統響應延遲和信號處理時間。另一方面,本文設計的實時仿真系統采用模塊化的設計,各模塊之間的數據傳輸速為880 Mbit/s,相比于傳統MATLAB單機軟件仿真,更加接近于真實作戰場景。

表2 仿真方案性能對比
本文使用RTX及反射內存網技術設計了一種導引頭實時系統仿真架構,準確性高,實時性好,與傳統的MATLAB軟件仿真方案相比,更接近于真實作戰環境。測試結果表明,系統仿真結果準確,計算機資源利用率較高,整體時延小于10 μs,中斷響應約為12 μs,跨主機傳輸速度約為880 Mbit/s,滿足實時系統要求。