雷 毅 周徐昌
(海軍工程大學(xué)兵器工程系 武漢 430033)
隨著計(jì)算機(jī)科學(xué)技術(shù)的迅猛發(fā)展,當(dāng)代仿真技術(shù)得到了極大地提高。傳統(tǒng)的嵌入式操作系統(tǒng)雖然實(shí)時(shí)性高,但需要獨(dú)有的開發(fā)定制工具,開發(fā)復(fù)雜,定制內(nèi)核涉及BSP相關(guān)知識;而且其它通用功能例如圖形顯示功能并不強(qiáng)大,需要購買第三方圖形開發(fā)包,開發(fā)周期長。RTX則能比較好地完成圖形化和實(shí)時(shí)兩方面要求,因而在半實(shí)物仿真系統(tǒng)中得到了廣泛地使用。但目前設(shè)備廠商對于一些采用實(shí)時(shí)操作系統(tǒng)的仿真計(jì)算機(jī),未提供相應(yīng)的設(shè)備驅(qū)動程序,由于對實(shí)時(shí)性的要求,也必須自己開發(fā)相應(yīng)的設(shè)備驅(qū)動程序。在某型武器半實(shí)物仿真系統(tǒng)中,選用研華公司的工控機(jī)和PCI1714數(shù)據(jù)采集卡、三軸轉(zhuǎn)臺等設(shè)備組成硬件平臺,RTX+Windows作為軟件平臺,在系統(tǒng)的開發(fā)過程中編寫了PCI卡的設(shè)備驅(qū)動程序。本文以PCI1714為例詳細(xì)討論了在RTX+Windows下開發(fā)PCI設(shè)備驅(qū)動程序的方法。
RTX是Windows XP/2000/NT系統(tǒng)的硬實(shí)時(shí)擴(kuò)展,為 Windows系統(tǒng)提供了高速確定性的硬實(shí)時(shí)能力,滿足了對設(shè)備I/O進(jìn)程的確定性響應(yīng)的要求。其內(nèi)核采用基于開放式的x86系列PC架構(gòu),可定制裁減,并支持多種CPU架構(gòu)[1]。其獨(dú)立的基于搶占式的RT X線程調(diào)度機(jī)制允許RTSS線程優(yōu)先于所有的Windows線程和中斷,并擁有足夠多的優(yōu)先級,每個(gè)進(jìn)程可以從0~127這128個(gè)優(yōu)先級中選擇,而且提供了 Windows和RTSS進(jìn)程之間的IPC進(jìn)程間通信機(jī)制。
RTX對x86提供了很好的支持。而且RTX提供了針對端口I/O和總線I/O所有操作的功能函數(shù),幾乎可以用于所有的驅(qū)動開發(fā)。并向開發(fā)者提供了獨(dú)立于操作系統(tǒng)和應(yīng)用程序的對于系統(tǒng)資源的直接訪問控制和所有權(quán),使得開發(fā)PCI驅(qū)動程序更方便。
某型武器半實(shí)物仿真系統(tǒng)仿真原理框圖如圖1所示,系統(tǒng)按照仿真時(shí)序的要求,采集其運(yùn)動參數(shù)及舵角,送至數(shù)字仿真計(jì)算機(jī),通過求解其動力學(xué)與運(yùn)動學(xué)方程,發(fā)送命令給三軸轉(zhuǎn)臺和水壓仿真器,三軸轉(zhuǎn)臺通過角運(yùn)動,水壓仿真器通過油壓動態(tài)變化,仿真其姿態(tài)變化和深度變化,給控制系統(tǒng)提供信息,從而模擬其下一時(shí)刻的運(yùn)動狀態(tài)。
圖1 某型武器半實(shí)物仿真系統(tǒng)仿真原理框圖
仿真系統(tǒng)主要參數(shù)有各計(jì)算機(jī)幀時(shí)、轉(zhuǎn)臺和水壓仿真器分系統(tǒng)幀時(shí)、接口通信速率等。在Windows環(huán)境下能夠?qū)崿F(xiàn)實(shí)時(shí)數(shù)據(jù)采集的資源有2個(gè):多媒體定時(shí)器和常規(guī)定時(shí)器。常規(guī)定時(shí)器是建立在PC機(jī)硬件和ROM BIOS中系統(tǒng)定時(shí)器的簡單擴(kuò)充基礎(chǔ)之上。由于ROM BIOS將PC中的一個(gè)8253定時(shí)芯片設(shè)為54.915ms產(chǎn)生一個(gè)硬件中斷,因此通過這種方式獲得的定時(shí)器只能精確到55ms,對于 55ms以下的時(shí)間精度便無能為力了[2]。多媒體定時(shí)器使用自己單獨(dú)的線程來調(diào)用一個(gè)自己的回調(diào)函數(shù),并且該線程優(yōu)先級高,每隔一定時(shí)間就發(fā)送一個(gè)消息而不管其他消息是否已執(zhí)行完,因此采用多媒體定時(shí)器可以達(dá)到1ms的最小時(shí)間精度。對于一般的實(shí)時(shí)數(shù)據(jù)采集來說,采用多媒體定時(shí)器可以滿足要求,實(shí)時(shí)性要求更高的情況就無法滿足了。但是對于本系統(tǒng)來說,為保證系統(tǒng)的仿真精度和可信度,要求數(shù)學(xué)模型實(shí)時(shí)解算,需要更高精度的定時(shí)器。
RTX其持續(xù)中斷響應(yīng)頻率可達(dá)30kHz以上,最大IST處理延遲不超過16μ s。能提供高速準(zhǔn)確的實(shí)時(shí)時(shí)間響應(yīng),定時(shí)器最小周期為100μ s,時(shí)鐘最小分辨率為100ns。故從理論上看可滿足系統(tǒng)實(shí)時(shí)性的要求。
PCI-1714配備4組模擬輸入端,具備同步采集功能。當(dāng)4組模擬輸入同時(shí)使用時(shí),采樣頻率最高可達(dá) 30MS/s。PCI-1714板卡采用 PLX-9056 PCI總線控制器,同時(shí),每路 ADC獨(dú)占板載的32kb,可保證數(shù)據(jù)在高速數(shù)據(jù)采集時(shí)的臨時(shí)存儲與數(shù)據(jù)的批量傳輸,實(shí)現(xiàn)數(shù)據(jù)的高速采集。
在完成對設(shè)備地址映射之后,驅(qū)動程序就可以根據(jù)分配的基地址訪問設(shè)備了。在RTX操作系統(tǒng)下,其驅(qū)動程序不含虛擬機(jī),無需內(nèi)核中轉(zhuǎn)請求,不含緩沖及校驗(yàn)機(jī)制,可以直接操作寄存器。故可在內(nèi)核之外與應(yīng)用程序一起編譯運(yùn)行,不必把驅(qū)動程序編譯到內(nèi)核中去。而且RTX驅(qū)動程序架構(gòu)靈活,無需WDM驅(qū)動規(guī)范,可以以各種形式存在包括.rtss,.rtdll,rtss dll,.lib。在PCI1714數(shù)據(jù)采集卡的驅(qū)動程序中,把驅(qū)動程序當(dāng)作應(yīng)用程序的一部分,一起編譯生成目標(biāo)文件,沒有使用標(biāo)準(zhǔn)的驅(qū)動規(guī)范,這樣更方便操作采集卡。
一般來說,PCI的驅(qū)動程序可分為三個(gè)部分:初始化部分、對硬件資源的訪問函數(shù)庫、具體調(diào)用部分。調(diào)用RTX操作系統(tǒng)提供的I/O函數(shù)就可以控制采集卡上的數(shù)字IO輸出以及D/A輸出[3]。
4.2.1 獲得PCI設(shè)備信息,進(jìn)行設(shè)備初始化
在執(zhí)行初始化之前,需要對板卡的基地址進(jìn)行賦值。不同于ISA設(shè)備可以預(yù)先了解設(shè)備的中斷號和基地址,PCI設(shè)備的中斷號和基地址是在開機(jī)時(shí)由系統(tǒng)自動分配的。所以在操作設(shè)備之前,必須首先確認(rèn)設(shè)備的中斷號和基地址,以便進(jìn)行下一步的操作。首先通過for循環(huán)程序找到與所編寫程序的PCI卡相對應(yīng)的PCI設(shè)備,然后讀取設(shè)備中基地址寄存器中的地址和中斷號[4]。程序代碼如下所示:
BytesWritten=RtGetBusDataByOffset(
PCIConfiguration,//type of bus data to be retrieved bus
pSlotNumber->u.AsULONG,//logical slot number
PciData,//pointer to a buffer for configuration information 0,//byte offset into buffer PCI_COMMON_HDR_LENGTH//length of buffer)
初始化操作包括:配置中斷、停止位、奇偶校驗(yàn)位、字長FIFO等。PCI設(shè)備對板卡的操作與ISA設(shè)備無異,核心就是對寄存器的配置與讀寫操作。通過直接操作相應(yīng)寄存器即可達(dá)到相應(yīng)要求,示例代碼如下:
RtWritePortUchar(ucb->baseAddress+UA RT_LCR,LCR_DIVISOR_LATCH);
tempRegister=ucb->stopBits|ucb->parity|ucb->wordSize;
tempRegister=RtReadPortUchar(ucb->baseAddress+UART_FCR);
4.2.2 調(diào)用I/O函數(shù),訪問硬件資源
硬件中斷處理是實(shí)時(shí)系統(tǒng)設(shè)計(jì)的關(guān)鍵環(huán)節(jié),外部事件通過中斷通知系統(tǒng),系統(tǒng)通過中斷服務(wù)函數(shù)處理中斷請求。在中斷模式中,操作相應(yīng)的讀寫寄存器傳入傳出數(shù)據(jù)即可,示例代碼如下:
中斷方式,清空FIFO:
VOID EmptyFIFO(UCB*ucb)
中斷方式,寫入FIFO:
VOID SendNextFIFO(UCB*ucb)
半實(shí)物仿真數(shù)據(jù)結(jié)果對比的標(biāo)準(zhǔn)有兩個(gè):一是數(shù)字仿真結(jié)果;二是實(shí)航結(jié)果。圖2為半實(shí)物仿真的深度曲線與海上實(shí)航結(jié)果對比情況。說明了該驅(qū)動程序達(dá)到了系統(tǒng)的設(shè)計(jì)要求。
本文結(jié)合PCI1714數(shù)據(jù)采集卡分析了在RTX+Windows下開發(fā)PCI設(shè)備驅(qū)動程序的方法。經(jīng)實(shí)際運(yùn)行,所編寫的驅(qū)動程序在仿真系統(tǒng)中運(yùn)行穩(wěn)定可靠,系統(tǒng)的實(shí)時(shí)性達(dá)到了設(shè)計(jì)要求。
[1]Ardence公司.RTX技術(shù)白皮書[Z].北京航天捷越(美斯比)科技有限公司,譯,2004
[2]吳麗娜,高敬陽.Windows2000/XP下通用實(shí)時(shí)采集的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用,2005,25(2):442~444
[3]王宇磊,周東.VxWorks下PCI總線驅(qū)動程序設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用
[4]董春橋,李凱.Linux系統(tǒng)PCI設(shè)備驅(qū)動程序開發(fā)[J].計(jì)算機(jī)測量與控制,2005,13
[5]WindRiver Systems Inc.VxWorks Programmer's Guide[Z].1998
[6]楊飛,安錦文,李中健.嵌入式實(shí)時(shí)操作系統(tǒng)VxWorks下CPCI設(shè)備驅(qū)動程序開發(fā)[J].計(jì)算機(jī),2007,15(5)
[7]馬明建,周長城.數(shù)據(jù)采集與處理技術(shù)[M].西安:西安交通大學(xué)出版社,1998,1:59~70
[8]肖忠祥.數(shù)據(jù)采集原理[M].西安:西安工業(yè)大學(xué)出版社,2003:15~20