基于PCI Express總線的雷達(dá)數(shù)據(jù)記錄器驅(qū)動(dòng)程序開發(fā)
AddDevice是WDM驅(qū)動(dòng)程序另一個(gè)入口函數(shù),當(dāng)DriverEntry初始化成功后,PnP管理器會(huì)調(diào)用AddDevice創(chuàng)建一個(gè)FDO,然后把總線驅(qū)動(dòng)程序創(chuàng)建的PDO連接到FDO上,同時(shí)還會(huì)創(chuàng)建一個(gè)設(shè)備擴(kuò)展對(duì)象。本文在設(shè)備擴(kuò)展對(duì)象中保存了DMA緩存地址、設(shè)備寄存器地址和一些標(biāo)志位。AddDevice還寄存了一個(gè)設(shè)備接口,以便應(yīng)用程序打開設(shè)備。
接著,PnP管理器向驅(qū)動(dòng)程序堆棧發(fā)送一個(gè)PnP啟動(dòng)消息,它是一個(gè)主功能代碼為IRP_MN_START_DEVICE的IRP。驅(qū)動(dòng)程序并不處理該IRP,只是將它傳遞給總線驅(qū)動(dòng)程序處理并等待該IRP的處理結(jié)果,總線驅(qū)動(dòng)程序?qū)@得的設(shè)備資源(中斷、DMA通道、內(nèi)存和I/O資源等)保存在IRP中并通知驅(qū)動(dòng)程序取出這些信息保存在設(shè)備擴(kuò)展對(duì)象中。于是,驅(qū)動(dòng)程序就可以根據(jù)這些信息對(duì)PEX8311進(jìn)行操作了。
4.2 數(shù)據(jù)傳輸初始化
數(shù)據(jù)傳輸初始化是在DispatchIoControl派遣例程中實(shí)現(xiàn)的。功能驅(qū)動(dòng)程序正常裝入后,應(yīng)用程序就可以發(fā)出DeviceIoControl請(qǐng)求初始化數(shù)據(jù)傳輸。初始化包括接收用戶程序傳來的事件句柄、分配DMA緩存、設(shè)置中斷寄存器。
驅(qū)動(dòng)程序采用事件方式與應(yīng)用程序進(jìn)行通信。應(yīng)用程序中用CreateEvent創(chuàng)建事件hEvent,再調(diào)用DeviceIoControl函數(shù)將它傳給驅(qū)動(dòng)程序,驅(qū)動(dòng)程序響應(yīng)該請(qǐng)求,從輸入緩沖區(qū)中取出這個(gè)事件句柄存在設(shè)備擴(kuò)展對(duì)象中。當(dāng)驅(qū)動(dòng)程序?qū)⒃撌录O(shè)置為信號(hào)狀態(tài)時(shí),應(yīng)用程序就可以得到通知。
驅(qū)動(dòng)程序通過函數(shù)AllocateCommonBuffer分配的一段非分頁、連續(xù)的DMA緩存,用于緩存從PEX8311傳來的雷達(dá)數(shù)據(jù)。為了使應(yīng)用程序能夠直接訪問DMA緩存,本文通過函數(shù)MmMapLockedPages把這段內(nèi)存映射到應(yīng)用程序。每次DMA讀取512KB數(shù)據(jù),本文分配了60段512KB的連續(xù)DMA緩存,驅(qū)動(dòng)程序依次將每次讀取的數(shù)據(jù)存在這些連續(xù)的緩存中,而應(yīng)用程序按相同的順序取出數(shù)據(jù)存在SCSI硬盤上。即使應(yīng)用程序在下次LINT#中斷到來時(shí)還沒及時(shí)將緩存中數(shù)據(jù)寫到SCSI硬盤上,驅(qū)動(dòng)程序也會(huì)啟動(dòng)DMA將新數(shù)據(jù)存在下一段緩存中,不會(huì)丟失數(shù)據(jù)。
驅(qū)動(dòng)程序設(shè)置PEX8311的中斷寄存器,允許LINT#中斷和PCI中斷。允許LINT#中斷可以使LINT#信號(hào)處于可用狀態(tài),而允許PCI中斷可以將LINT#中斷和DMA中斷路由到計(jì)算機(jī)系統(tǒng),操作系統(tǒng)就能調(diào)用中斷服務(wù)程序響應(yīng)中斷。
4.3 數(shù)據(jù)傳輸模塊
數(shù)據(jù)傳輸模塊主要包括中斷服務(wù)例程(ISR)和DPC例程(DpcForIrq)。前者響應(yīng)LINT#中斷和DMA中斷,后者啟動(dòng)DMA傳輸并在數(shù)據(jù)傳完后通知應(yīng)用程序讀取DMA緩存中的數(shù)據(jù)。因?yàn)镮SR運(yùn)行于較高的硬件中斷級(jí)別[5](DISPATCH_LEVEL),它會(huì)阻塞所有的進(jìn)程,而DpcForIrq運(yùn)行在軟件中斷級(jí)別,不會(huì)阻塞所有進(jìn)程,所以應(yīng)該盡量減少ISR的運(yùn)行時(shí)間,而在DpcForIrq中完成耗時(shí)的操作。本文在ISR中只判斷中斷類型,ISR的流程如圖3所示:
圖3 ISR流程圖
在調(diào)試中發(fā)現(xiàn):當(dāng)PEX8311的LINT#中斷信號(hào)有效時(shí)間超過8us時(shí),會(huì)造成死機(jī)。但系統(tǒng)繁忙時(shí),計(jì)算機(jī)會(huì)因?yàn)橹袛嘤行r(shí)間太短而響應(yīng)不了中斷。為解決這一問題,使LINT#的有效時(shí)間加長到32us,驅(qū)動(dòng)程序在剛進(jìn)入ISR時(shí),先禁止PCI中斷,LINT#中斷便不能傳到計(jì)算機(jī)系統(tǒng),也就不會(huì)造成死機(jī),ISR也有足夠的時(shí)間讀中斷寄存器的值進(jìn)行判斷。
數(shù)據(jù)傳輸初始化工作完成后,當(dāng)有LINT#中斷時(shí),系統(tǒng)調(diào)用ISR。ISR中先判斷是LINT#中斷,于是將標(biāo)志m_LINT設(shè)置為true,接著調(diào)用IoRequestDpc ()將一個(gè)DPC對(duì)象放入DPC隊(duì)列中,最后,中斷服務(wù)程序退出。
然后,系統(tǒng)取出DPC對(duì)象,在DISPATCH_LEVEL的級(jí)別下執(zhí)行DpcForIrq。因?yàn)閙_LINT為true,說明是FIFO存滿數(shù)據(jù),DpcForIrq設(shè)置DMA參數(shù)并啟動(dòng)DMA讀數(shù)據(jù)。然后DpcForIrq退出。當(dāng)PEX8311完成DMA傳輸后會(huì)產(chǎn)生DMA中斷,中斷服務(wù)程序按相同的方式執(zhí)行,此時(shí)m_LINT被設(shè)置為false,說明是PEX8311完成DMA傳輸而產(chǎn)生的DMA中斷,驅(qū)動(dòng)程序在DpcFor_Irq中用事件通知應(yīng)用程序讀取DMA緩存中的數(shù)據(jù)寫到SCSI硬盤上。如果應(yīng)用程序不退出,驅(qū)動(dòng)程序會(huì)一直按上述方式循環(huán)運(yùn)行。當(dāng)應(yīng)用程序退出時(shí),驅(qū)動(dòng)程序關(guān)閉中斷并釋放DMA緩存。
4.4 驅(qū)動(dòng)程序調(diào)試
本文采用Microsoft隨DDK一起發(fā)布的調(diào)試工具WinDbg調(diào)試驅(qū)動(dòng)程序。WinDbg是一種內(nèi)核模式和用戶模式調(diào)試器,可以用來分析故障轉(zhuǎn)儲(chǔ)文件和執(zhí)行驅(qū)動(dòng)程序代碼。調(diào)試需要兩臺(tái)計(jì)算機(jī):目標(biāo)機(jī)(雷達(dá)數(shù)據(jù)記錄器)和主機(jī)(運(yùn)行Windbg的機(jī)器),它們用串口線連接,主機(jī)控制和監(jiān)視目標(biāo)機(jī)上的活動(dòng)。設(shè)置好主機(jī)和目標(biāo)機(jī)后,通過WinDbg的命令窗口可以設(shè)置斷點(diǎn)、觀察調(diào)試輸出信息或分析目標(biāo)機(jī)藍(lán)屏后產(chǎn)生的故障轉(zhuǎn)儲(chǔ)文件。
測(cè)試時(shí):外部中斷頻率可以提高到200Hz以上,每次中斷讀取512KB數(shù)據(jù)。通過分析,測(cè)試數(shù)據(jù)完全正確。經(jīng)反復(fù)測(cè)試,記錄器穩(wěn)定記錄速度可達(dá)100MB/S以上。
由于只采用了兩個(gè)SCSI硬盤以及系統(tǒng)運(yùn)行效率的限制,數(shù)據(jù)記錄速度沒有達(dá)到PEX8311的理論傳輸速度。若增加SCSI硬盤數(shù)量和升級(jí)硬件,記錄速度還有很大提升空間。
5 總結(jié)
本文詳細(xì)的介紹了基于PCI Express總線的雷達(dá)數(shù)據(jù)記錄器驅(qū)動(dòng)程序的開發(fā)。本文創(chuàng)新點(diǎn)為:針對(duì)雷達(dá)數(shù)據(jù)記錄器和PEX8311的特點(diǎn)設(shè)計(jì)了高效的驅(qū)動(dòng)程序,它具有易操作、移植性強(qiáng)的優(yōu)點(diǎn)。該驅(qū)動(dòng)程序已成功地應(yīng)用于某雷達(dá)原始數(shù)據(jù)記錄器中。 合成孔徑雷達(dá)相關(guān)文章:合成孔徑雷達(dá)原理
評(píng)論