基于PCI Express總線的雷達數(shù)據(jù)記錄器驅動程序開發(fā)
在數(shù)據(jù)采集系統(tǒng)中,大量的數(shù)據(jù)必須通過總線傳到計算機內存中,傳統(tǒng)的PCI總線越來越不能滿足人們對帶寬增長的需要。為解決這一矛盾,PC行業(yè)協(xié)會和外設廠商一起發(fā)布了PCI Express總線[1]規(guī)范,并且于2004年在標準臺式機上得到應用。該技術可以有效地提高設備至計算機內存的數(shù)據(jù)傳輸速率。相對于PCI總線,它最大的特點是實現(xiàn)點到點的數(shù)據(jù)傳輸[2],每個設備有自己專用的雙向數(shù)據(jù)通道,數(shù)據(jù)以包的形式串行傳輸,每個通道具有單方向250MB/S的數(shù)據(jù)傳輸速度。多個通道可以組合在一起形成x1(單通道)、x2、x4、x8、x12、x16和x32的信道以提高帶寬。
在合成孔徑雷達系統(tǒng)中,大量的回波數(shù)據(jù)需要實時記錄下來以便進行事后成像處理。而PCI Express總線高帶寬的優(yōu)點可以很好的滿足高速雷達數(shù)據(jù)記錄的需要,而要充分發(fā)揮PCI Express總線的作用,驅動程序設計是關鍵。本文介紹了在Windows XP系統(tǒng)下,雷達數(shù)據(jù)記錄器中PCI Express總線接口芯片PEX8311的驅動程序開發(fā)。
2 雷達數(shù)據(jù)記錄器介紹
雷達數(shù)據(jù)記錄器由一臺服務器計算機、PCI Express接口卡、SCSI卡和SCSI硬盤四部分組成,其中PCI Express接口卡的軟硬件自行設計,其它部分采用標準的外購件。雷達數(shù)據(jù)
通過PCI Express接口卡傳入計算機內存,計算機再將數(shù)據(jù)通過SCSI卡寫在SCSI硬盤上。
PCI Express接口卡采用美國PLX公司推出的PEX8311作為本地總線和PCI Express總線的接口。PEX8311[3]是一款x1的PCI Express接口芯片,本地端總線頻率最高可達66MHZ,數(shù)據(jù)位寬32bit。PEX8311含有4KB的配置空間,其中前256字節(jié)是和PCI設備功能上是兼容的,其余是PCI Express擴展配置空間。本文采用PEX8311的引腳LINTi#接收外部中斷信號,使用DMA通道0進行塊DMA方式讀數(shù)據(jù)。
接口卡的結構框圖如圖1所示,利用差分轉換芯片先將外部差分信號轉換成單端信號,兩塊FIFO的“乒乓”傳輸以實現(xiàn)數(shù)據(jù)的連續(xù)傳輸,單個FIFO容量為512KB。在CPLD的控制下,兩塊FIFO的數(shù)據(jù)輪流通過PEX8311的DMA通道0傳入計算機。
500)this.style.width=500;" border="0" />
圖1 PCI Express接口卡框圖
具體工作過程:當其中一個FIFO被寫滿數(shù)據(jù)后,在CPLD控制下,外部數(shù)據(jù)繼續(xù)寫入另一個FIFO,同時,CPLD使PEX8311的LINTi#輸入為低電平,這會產生一個LINT#中斷,驅動程序響應中斷并啟動DMA傳輸讀取FIFO中的數(shù)據(jù)到DMA緩存中。讀完后,驅動程序通知應用程序將DMA緩存的數(shù)據(jù)寫到SCSI盤上。
3 WDM驅動程序概述
WDM是一種分層驅動程序模型[4],如圖2所示。系統(tǒng)啟動時,總線驅動程序枚舉總線上的設備,并為每個設備創(chuàng)建一個物理設備對象(PDO);然后PnP管理器根據(jù)注冊表中的信息查找與這個PDO相關的過濾驅動程序和功能驅動程序,建立的過濾設備對象(FIDO)
500)this.style.width=500;" border="0" />
圖2 WDM分層驅動模型
和功能設備對象(FDO),最終,系統(tǒng)完成設備驅動的裝入過程。設備擴展對象是與設備對象關聯(lián)的另一種重要的數(shù)據(jù)結構,它是一塊未分頁的內存,I/O管理器自動把它分配給已建立的任何設備擴展對象,可以用它來保存與設備關聯(lián)的任何信息,驅動程序需要時,只要在設備擴展對象中取出這些資源使用即可。
IRP全名為IO Request Packet,即I/O請求包,是系統(tǒng)創(chuàng)建的一種數(shù)據(jù)結構。當應用程序對設備操作時,I/O管理器根據(jù)具體的請求建立相應的IRP,IRP先被I/O管理器發(fā)送到最上層的驅動程序處理,然后依次傳遞給下層的驅動程序處理。每層驅動程序可以不作任何事情而直接將IRP向下傳遞,也可以直接將該IRP設置為完成狀態(tài)。
4 PEX8311驅動程序設計
微軟提供的驅動程序開發(fā)軟件包DDK(Device Driver Kits)提供了用于驅動程序開發(fā)的資源文件、編譯連接程序、開發(fā)技術文檔等。第三方開發(fā)工具有NuMega公司DriverStudio和Jungo公司的WinDriver,它們對DDK進行了封裝,方便用戶進行驅動開發(fā)。但效率方面不如DDK。考慮到雷達數(shù)據(jù)記錄的數(shù)據(jù)率較高,所以本文采用DDK開發(fā)PEX8311的驅動程序??偩€驅動程序由系統(tǒng)提供,過濾驅動程序是可選的。所以本文只設計了PEX8311的功能驅動程序(以下簡稱驅動程序),它主要由驅動程序初始化、數(shù)據(jù)傳輸初始化、數(shù)據(jù)傳輸模塊三部分組成。其基本思想是:應用程序與驅動程序共享DMA緩存,當驅動程序接收到一個LINT#中斷時,啟動DMA讀取FIFO中的數(shù)據(jù)存在DMA緩存中,每次讀完后,驅動程序通過事件通知應用程序取出DMA緩存中的數(shù)據(jù)存在SCSI硬盤上。
4.1 驅動程序初始化
DriverEntry是驅動程序的入口函數(shù),負責初始化驅動程序對象。系統(tǒng)啟動時,如果檢測到PEX8311的存在,I/O管理器會建立一個未初始化的驅動程序對象并將它作為一個參數(shù)傳給DriverEntry。DriverEntry把驅動程序其它例程的函數(shù)指針裝入到驅動程序對象里面。當一個IRP被發(fā)送到設備時,I/O管理器使用該IRP關聯(lián)的驅動程序對象找到正確的驅動程序例程處理。初始化的主要函數(shù)指針有:AddDevice、DriverUnload、DispatchCreate、DispatchClose、DispatchIoControl、DispatchCleanup、DispatchPnp、DispatchPower。[!--empirenews.page--]
AddDevice是WDM驅動程序另一個入口函數(shù),當DriverEntry初始化成功后,PnP管理器會調用AddDevice創(chuàng)建一個FDO,然后把總線驅動程序創(chuàng)建的PDO連接到FDO上,同時還會創(chuàng)建一個設備擴展對象。本文在設備擴展對象中保存了DMA緩存地址、設備寄存器地址和一些標志位。AddDevice還寄存了一個設備接口,以便應用程序打開設備。
接著,PnP管理器向驅動程序堆棧發(fā)送一個PnP啟動消息,它是一個主功能代碼為IRP_MN_START_DEVICE的IRP。驅動程序并不處理該IRP,只是將它傳遞給總線驅動程序處理并等待該IRP的處理結果,總線驅動程序將獲得的設備資源(中斷、DMA通道、內存和I/O資源等)保存在IRP中并通知驅動程序取出這些信息保存在設備擴展對象中。于是,驅動程序就可以根據(jù)這些信息對PEX8311進行操作了。
4.2 數(shù)據(jù)傳輸初始化
數(shù)據(jù)傳輸初始化是在DispatchIoControl派遣例程中實現(xiàn)的。功能驅動程序正常裝入后,應用程序就可以發(fā)出DeviceIoControl請求初始化數(shù)據(jù)傳輸。初始化包括接收用戶程序傳來的事件句柄、分配DMA緩存、設置中斷寄存器。
驅動程序采用事件方式與應用程序進行通信。應用程序中用CreateEvent創(chuàng)建事件hEvent,再調用DeviceIoControl函數(shù)將它傳給驅動程序,驅動程序響應該請求,從輸入緩沖區(qū)中取出這個事件句柄存在設備擴展對象中。當驅動程序將該事件設置為信號狀態(tài)時,應用程序就可以得到通知。
驅動程序通過函數(shù)AllocateCommonBuffer分配的一段非分頁、連續(xù)的DMA緩存,用于緩存從PEX8311傳來的雷達數(shù)據(jù)。為了使應用程序能夠直接訪問DMA緩存,本文通過函數(shù)MmMapLockedPages把這段內存映射到應用程序。每次DMA讀取512KB數(shù)據(jù),本文分配了60段512KB的連續(xù)DMA緩存,驅動程序依次將每次讀取的數(shù)據(jù)存在這些連續(xù)的緩存中,而應用程序按相同的順序取出數(shù)據(jù)存在SCSI硬盤上。即使應用程序在下次LINT#中斷到來時還沒及時將緩存中數(shù)據(jù)寫到SCSI硬盤上,驅動程序也會啟動DMA將新數(shù)據(jù)存在下一段緩存中,不會丟失數(shù)據(jù)。
驅動程序設置PEX8311的中斷寄存器,允許LINT#中斷和PCI中斷。允許LINT#中斷可以使LINT#信號處于可用狀態(tài),而允許PCI中斷可以將LINT#中斷和DMA中斷路由到計算機系統(tǒng),操作系統(tǒng)就能調用中斷服務程序響應中斷。
4.3 數(shù)據(jù)傳輸模塊
數(shù)據(jù)傳輸模塊主要包括中斷服務例程(ISR)和DPC例程(DpcForIrq)。前者響應LINT#中斷和DMA中斷,后者啟動DMA傳輸并在數(shù)據(jù)傳完后通知應用程序讀取DMA緩存中的數(shù)據(jù)。因為ISR運行于較高的硬件中斷級別[5](DISPATCH_LEVEL),它會阻塞所有的進程,而DpcForIrq運行在軟件中斷級別,不會阻塞所有進程,所以應該盡量減少ISR的運行時間,而在DpcForIrq中完成耗時的操作。本文在ISR中只判斷中斷類型,ISR的流程如圖3所示:
500)this.style.width=500;" border="0" />
圖3 ISR流程圖
在調試中發(fā)現(xiàn):當PEX8311的LINT#中斷信號有效時間超過8us時,會造成死機。但系統(tǒng)繁忙時,計算機會因為中斷有效時間太短而響應不了中斷。為解決這一問題,使LINT#的有效時間加長到32us,驅動程序在剛進入ISR時,先禁止PCI中斷,LINT#中斷便不能傳到計算機系統(tǒng),也就不會造成死機,ISR也有足夠的時間讀中斷寄存器的值進行判斷。
數(shù)據(jù)傳輸初始化工作完成后,當有LINT#中斷時,系統(tǒng)調用ISR。ISR中先判斷是LINT#中斷,于是將標志m_LINT設置為true,接著調用IoRequestDpc ()將一個DPC對象放入DPC隊列中,最后,中斷服務程序退出。
然后,系統(tǒng)取出DPC對象,在DISPATCH_LEVEL的級別下執(zhí)行DpcForIrq。因為m_LINT為true,說明是FIFO存滿數(shù)據(jù),DpcForIrq設置DMA參數(shù)并啟動DMA讀數(shù)據(jù)。然后DpcForIrq退出。當PEX8311完成DMA傳輸后會產生DMA中斷,中斷服務程序按相同的方式執(zhí)行,此時m_LINT被設置為false,說明是PEX8311完成DMA傳輸而產生的DMA中斷,驅動程序在DpcFor_Irq中用事件通知應用程序讀取DMA緩存中的數(shù)據(jù)寫到SCSI硬盤上。如果應用程序不退出,驅動程序會一直按上述方式循環(huán)運行。當應用程序退出時,驅動程序關閉中斷并釋放DMA緩存。
4.4 驅動程序調試
本文采用Microsoft隨DDK一起發(fā)布的調試工具WinDbg調試驅動程序。WinDbg是一種內核模式和用戶模式調試器,可以用來分析故障轉儲文件和執(zhí)行驅動程序代碼。調試需要兩臺計算機:目標機(雷達數(shù)據(jù)記錄器)和主機(運行Windbg的機器),它們用串口線連接,主機控制和監(jiān)視目標機上的活動。設置好主機和目標機后,通過WinDbg的命令窗口可以設置斷點、觀察調試輸出信息或分析目標機藍屏后產生的故障轉儲文件。
測試時:外部中斷頻率可以提高到200Hz以上,每次中斷讀取512KB數(shù)據(jù)。通過分析,測試數(shù)據(jù)完全正確。經(jīng)反復測試,記錄器穩(wěn)定記錄速度可達100MB/S以上。
由于只采用了兩個SCSI硬盤以及系統(tǒng)運行效率的限制,數(shù)據(jù)記錄速度沒有達到PEX8311的理論傳輸速度。若增加SCSI硬盤數(shù)量和升級硬件,記錄速度還有很大提升空間。
5 總結
本文詳細的介紹了基于PCI Express總線的雷達數(shù)據(jù)記錄器驅動程序的開發(fā)。本文創(chuàng)新點為:針對雷達數(shù)據(jù)記錄器和PEX8311的特點設計了高效的驅動程序,它具有易操作、移植性強的優(yōu)點。該驅動程序已成功地應用于某雷達原始數(shù)據(jù)記錄器中。