<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 基于PCI Express總線的雷達數(shù)據(jù)記錄器驅(qū)動程序開發(fā)

          基于PCI Express總線的雷達數(shù)據(jù)記錄器驅(qū)動程序開發(fā)

          作者: 時間:2010-03-05 來源:網(wǎng)絡 收藏

          AddDevice是WDM程序另一個入口函數(shù),當DriverEntry初始化成功后,PnP管理器會調(diào)用AddDevice創(chuàng)建一個FDO,然后把程序創(chuàng)建的PDO連接到FDO上,同時還會創(chuàng)建一個設備擴展對象。本文在設備擴展對象中保存了DMA緩存地址、設備寄存器地址和一些標志位。AddDevice還寄存了一個設備接口,以便應用程序打開設備。
          接著,PnP管理器向程序堆棧發(fā)送一個PnP啟動消息,它是一個主功能代碼為IRP_MN_START_DEVICE的IRP。驅(qū)動程序并不處理該IRP,只是將它傳遞給驅(qū)動程序處理并等待該IRP的處理結果,驅(qū)動程序?qū)@得的設備資源(中斷、DMA通道、內(nèi)存和I/O資源等)保存在IRP中并通知驅(qū)動程序取出這些信息保存在設備擴展對象中。于是,驅(qū)動程序就可以根據(jù)這些信息對PEX8311進行操作了。
          4.2 傳輸初始化
          傳輸初始化是在DispatchIoControl派遣例程中實現(xiàn)的。功能驅(qū)動程序正常裝入后,應用程序就可以發(fā)出DeviceIoControl請求初始化傳輸。初始化包括接收用戶程序傳來的事件句柄、分配DMA緩存、設置中斷寄存器。
          驅(qū)動程序采用事件方式與應用程序進行通信。應用程序中用CreateEvent創(chuàng)建事件hEvent,再調(diào)用DeviceIoControl函數(shù)將它傳給驅(qū)動程序,驅(qū)動程序響應該請求,從輸入緩沖區(qū)中取出這個事件句柄存在設備擴展對象中。當驅(qū)動程序?qū)⒃撌录O置為信號狀態(tài)時,應用程序就可以得到通知。
          驅(qū)動程序通過函數(shù)AllocateCommonBuffer分配的一段非分頁、連續(xù)的DMA緩存,用于緩存從PEX8311傳來的數(shù)據(jù)。為了使應用程序能夠直接訪問DMA緩存,本文通過函數(shù)MmMapLockedPages把這段內(nèi)存映射到應用程序。每次DMA讀取512KB數(shù)據(jù),本文分配了60段512KB的連續(xù)DMA緩存,驅(qū)動程序依次將每次讀取的數(shù)據(jù)存在這些連續(xù)的緩存中,而應用程序按相同的順序取出數(shù)據(jù)存在SCSI硬盤上。即使應用程序在下次LINT#中斷到來時還沒及時將緩存中數(shù)據(jù)寫到SCSI硬盤上,驅(qū)動程序也會啟動DMA將新數(shù)據(jù)存在下一段緩存中,不會丟失數(shù)據(jù)。
          驅(qū)動程序設置PEX8311的中斷寄存器,允許LINT#中斷和中斷。允許LINT#中斷可以使LINT#信號處于可用狀態(tài),而允許中斷可以將LINT#中斷和DMA中斷路由到計算機系統(tǒng),操作系統(tǒng)就能調(diào)用中斷服務程序響應中斷。
          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所示:

          圖3 ISR流程圖
          在調(diào)試中發(fā)現(xiàn):當PEX8311的LINT#中斷信號有效時間超過8us時,會造成死機。但系統(tǒng)繁忙時,計算機會因為中斷有效時間太短而響應不了中斷。為解決這一問題,使LINT#的有效時間加長到32us,驅(qū)動程序在剛進入ISR時,先禁止中斷,LINT#中斷便不能傳到計算機系統(tǒng),也就不會造成死機,ISR也有足夠的時間讀中斷寄存器的值進行判斷。
          數(shù)據(jù)傳輸初始化工作完成后,當有LINT#中斷時,系統(tǒng)調(diào)用ISR。ISR中先判斷是LINT#中斷,于是將標志m_LINT設置為true,接著調(diào)用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傳輸后會產(chǎn)生DMA中斷,中斷服務程序按相同的方式執(zhí)行,此時m_LINT被設置為false,說明是PEX8311完成DMA傳輸而產(chǎn)生的DMA中斷,驅(qū)動程序在DpcFor_Irq中用事件通知應用程序讀取DMA緩存中的數(shù)據(jù)寫到SCSI硬盤上。如果應用程序不退出,驅(qū)動程序會一直按上述方式循環(huán)運行。當應用程序退出時,驅(qū)動程序關閉中斷并釋放DMA緩存。
          4.4 驅(qū)動程序調(diào)試
          本文采用Microsoft隨DDK一起發(fā)布的調(diào)試工具WinDbg調(diào)試驅(qū)動程序。WinDbg是一種內(nèi)核模式和用戶模式調(diào)試器,可以用來分析故障轉(zhuǎn)儲文件和執(zhí)行驅(qū)動程序代碼。調(diào)試需要兩臺計算機:目標機(數(shù)據(jù)器)和主機(運行Windbg的機器),它們用串口線連接,主機控制和監(jiān)視目標機上的活動。設置好主機和目標機后,通過WinDbg的命令窗口可以設置斷點、觀察調(diào)試輸出信息或分析目標機藍屏后產(chǎn)生的故障轉(zhuǎn)儲文件。
          測試時:外部中斷頻率可以提高到200Hz以上,每次中斷讀取512KB數(shù)據(jù)。通過分析,測試數(shù)據(jù)完全正確。經(jīng)反復測試,器穩(wěn)定速度可達100MB/S以上。
          由于只采用了兩個SCSI硬盤以及系統(tǒng)運行效率的限制,數(shù)據(jù)記錄速度沒有達到PEX8311的理論傳輸速度。若增加SCSI硬盤數(shù)量和升級硬件,記錄速度還有很大提升空間。
          5 總結
          本文詳細的介紹了PCI 總線的數(shù)據(jù)記錄器驅(qū)動程序的開發(fā)。本文創(chuàng)新點為:針對雷達數(shù)據(jù)記錄器和PEX8311的特點設計了高效的驅(qū)動程序,它具有易操作、移植性強的優(yōu)點。該驅(qū)動程序已成功地應用于某雷達原始數(shù)據(jù)記錄器中。
          合成孔徑雷達相關文章:合成孔徑雷達原理

          上一頁 1 2 下一頁

          評論


          相關推薦

          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();