王 豐,劉 娜,肖雅靜,趙歲花
(中國電子科技集團公司第四十五研究所,北京 100176)
隨著現代科技的發展,工業控制系統一直在不斷尋求更高的精度和速度,因此實時控制系統在越來越多的方面得到應用。無論是在航空、航天、醫療、軍事還是在工業制造、仿真測試上,都可以看到實時系統的身影。
所謂的實時系統是指系統在接收到一個不可預測的事件后,能夠迅速對其做出正確響應。它的最大特點在于:一個正確的程序運行不僅取決于結果的準確,更取決于功能實現的時間。當然,“實時”并不意味著“快”,它指的是系統的時間響應特性。換句話說,實時性的衡量標準不是系統的平均響應時間而是最壞情況下的響應時間。
實時系統具有不同的分類,按實時性能來分,實時系統可以分為硬實時系統和軟實時系統。硬實時系統對響應時間的要求是嚴格的、絕對的,響應時間為微秒級或更強;軟實時系統允許有一些小的誤差,響應時間為毫秒級。通常情況下我們所說的實時系統都是指硬實時系統。一個實時系統除了其響應時間確定外,還具有其他一些優點:多線程優先級調度器;可預測的線程同步機制;具有優先級繼承;快速的時鐘和定時器。
Windows系統作為一種通用操作系統平臺,以其友好的人機界面交互功能,在工業控制中被廣泛應用。但不足之處在于Windows系統屬于一個軟實時、多任務系統,其響應時間無法滿足某些高精度的控制領域。雖然隨著微處理芯片領域的發展,其處理能力和響應時間得到顯著提高,但是其最差響應時間的提高不能總是被保證,而且其線程優先級太少,隱含著不確定的線程調度機制。因此,對Windows平臺進行實時擴展就顯得尤為必要。
美國Ardence公司推出了一套純軟件的硬實時擴展子系統Real-Time Extension for Windows(即RTX),提供了專門針對Windows系統的嵌入式實時解決方案。相比其他的實時系統,RTX具有開發周期短,成本低等優點,并且RTX支持VC++6.0與VS.NET開發環境。RTX并不對Windows系統本身進行任何封裝或修改,通過在HAL層(硬件抽象層)增加實時HAL擴展來實現基于優先級的搶占式實時任務的管理和調度。RTX實時子系統的線程優先于所有Windows線程,提供了對IRQ、I/O、內存的精確直接控制,以確保實時任務的可靠性。通過高速的IPC通信和同步機制,RTX方便地實現與Windows之間的數據交換。Windows的定時器時鐘分辨率為1 ms,而RTX的定時器時鐘分辨率為100 ns,最低定時器周期為 100 μs。
RTX被實現為一套庫的集合 (動態庫與靜態庫),RTSS(Real-Time Sub System)作為 Windows 的內核設備驅動與HAL擴展,其主要目的是管理實時任務的強占運行,為應用提供各種便利,快速響應外部事件,實現實時處理。RTSS通過RtWinAPI動態庫的實時API提供對外部對象的訪問方法。RtWinAPI可以被標準Win32環境和RTSS環境調用,將Win32程序轉化為RTX程序只需要重新鏈接一套不同的庫,Windows服務控制管理器直接將RTX進程和動態鏈接庫(DLL)的可執行映像裝入內核的不分頁內存中。
RTX的主要體系結構如圖1所示。

圖1 RTX體系架構
大多數硬件設備的驅動程序,都是基于Windows環境開發的,無法在RTX環境中使用。如果要在RTX環境中訪問此類設備,就必須把該設備導入到RTX環境中,編寫專門的驅動程序。
如圖2所示 (以RTX8.1.2版本為例),打開RTX Properties面板,選擇Hardware選項,在Devices欄點擊Setting按鈕,在彈出的Pnp Devices Setting面板上可以看到當前Windows系統下所有的即插即用設備,選擇需要在RTX下訪問的設備,點擊鼠標右鍵,在彈出的菜單中選擇Add RTX INF Support,確認后在Windows設備管理器中即可把設備導入到RTX環境中(圖2)。

圖2 RTX中導入硬件設備
RTX下編寫驅動程序相對簡單,因為應用程序可以直接訪問硬件設備的I/O端口。以PCI設備為例,RTX提供了相關的頭文件與庫函數,開發人員可以使用RTX Driver Wizard創建驅動程序框架,在創建的過程中根據應用需要可以添加中斷服務程序,共享中斷,I/O訪問,內存映射等功能函數。創建好的驅動程序包含2個重要部分:
(1)初始化設備。RTX下的硬件驅動程序首先使用DeviceSearch()函數查找PCI設備,通過指定的廠商號與設備號,遍歷查找所有的PCI的插槽,找到匹配的設備以后,記錄下當前的總線編號、內存與I/O端口的基地址以及相關的中斷資源。
(2)內核與硬件的數據交換。開發驅動程序的目的就是為了與硬件設備進行數據交換,但硬件設備讀寫數據使用的是物理地址,而應用程序讀寫數據使用的是虛擬地址,RTX中提供RtTranslateBusAddress()和 RtMapMemory()函數來完成物理地址到虛擬地址的轉化,從而完成應用程序與硬件設備的數據交換。
一般的設備控制程序需要有一個良好的圖形操作界面,RTX作為一個嵌入式的實時系統,并不直接提供支持類似MFC的圖形界面類庫。因此,在一個通用的控制程序中RTX常用來完成實時控制部分,而Windows用來完成與用戶的交互部分,二者之間通過共享內存與互斥信號量來完成數據通訊。
共享內存是在內存中開辟一塊指定大小的區域,不同的進程都可以共享此區域,包括RTSS進程與Win32進程都可以對其進行讀寫訪問。要使用共享內存通訊,首先必須創建共享內存對象,然后在另外一個需要通訊的進程中打開該共享內存對象。RTX中使用RtCreateSharedMeory()和RtOpenSharedMeory()來實現共享內存的創建與打開。通常情況下是在RTX應用程序中創建一個共享內存對象,創建的同時會產生一個該對象的句柄,其他進程通過獲取該句柄來完成不同進程間的數據傳輸。
由于Windows與RTX都可以對共享內存進行讀寫操作,為避免出現讀寫沖突,所以需要引入信號量機制。當RTX需要訪問共享內存時,首先會向共享內存發送一個請求訪問的信號量,共享內存收到此信號量后會向Windows發送一個詢問的信號量。如果Windows此時已經準備好,就會給共享內存發回一個準備好的信號量,共享內存收到后再給RTX發回一個可以訪問的信號量,RTX就可以對共享內存進行讀寫操作了。同理,當Windows需要訪問共享內存時,也需要同樣的操作,如圖3所示。

圖3 Windows與RTX通訊
在一臺主機上,RTX與Windows之間可以通過共享內存來通訊。在實際應用當中,有時候需要實現2臺主機之間互相通訊,普通的以太網通訊無法保證數據傳輸的實時性。但RTX提供了實時性能較好的RT-TCP/IP,它通過RTSS實現對底層網卡的實時支持。RTX在子系統中建立獨立的TCP/IP協議。該協議棧建立在NetSilicon公司的Fusion TCP/IP協議棧的基礎上,為了實現更好的實時性能,RTX對TCP/IP協議棧作了部分修改。RTX將TCP/IP協議的實現和硬件的操作集成在網卡的實時驅動中,用戶無需加載額外的鏈接庫。RT-TCP/IP給終端用戶提供了許多重要參數設置,使其更加適合實時傳輸。另外,RTX開放了大量網卡的驅動程序源代碼,給用戶開發RTX下的網絡通訊程序帶來了極大的幫助。
RTX可靠的實時性已經在眾多的平臺上得到了驗證,本文簡單介紹了RTX下開發實時控制程序的一個大概流程。由于RTX只是對Windows系統的一個擴展,并不對Windows系統本身做任何改變,而且RTX對微軟編譯環境的支持,使得需要更高實時性能的Windows程序可以很容易地移植到RTX下,相信RTX會在實時控制中得到更多的應用。
[1] 劉心語,楊煜普.基于RTX實時環境的1394驅動程序開發[B].微計算機信息,2009,25(11-2):75-76.
[2] 方澄,徐琦.基于RTX的飛行模擬器分布式實時仿真系統[A].測控技術,2007,26(7):86-87.
[3] 劉曉川,樊子明.Windows2 000(X P)+R TX的實時性分析與測試[J].艦船電子程,2007,27(6):135-138.
[4] 付文芳,張萍.RTX下PCI9052驅動程序的開發[A].科技廣場,2006(8):97-100.
[5] 呂瑛,陳懷民等。RTX環境下某智能串口卡的驅動開發[A].科學技術與工程,2007,7(5):761-764.