引言
在當前光電子學系統(tǒng)中,以PC104 作為伺服控制分系統(tǒng),體積龐大,不便于系統(tǒng)管理。 開發(fā)具有伺服控制能力的處理卡,用一塊板卡替代原來的系統(tǒng),能簡化系統(tǒng)結構,提高系統(tǒng) 的集成度,使電子學系統(tǒng)最終成為一個高度集成的控制平臺。
CPCI(CompactPCI)總線在PCI 總線基礎之上,采用了歐洲卡結構,拋棄金手指式互 連方式,改用2mm 密度的針孔連接器,并具有可熱插拔性,使其具有了更高的可靠性和開放 性,并且能適應惡劣的工作環(huán)境,在工業(yè)控制、航空航天等領域得到廣泛應用。自行開發(fā)的 伺服控制卡基于CPCI 總線,以DSP 作為卡上控制CPU,與FPGA 結合實現(xiàn)控制。本論文以該 伺服控制卡為依托,在概述其硬件平臺結構的基礎上,介紹了在Windows 2000 下CPCI 設備 驅動程序的設計與開發(fā),重點闡述了橋接芯片PCI9054 的DMA 數(shù)據(jù)傳輸實現(xiàn)及中斷處理機制。
1.伺服控制卡的系統(tǒng)結構與硬件實現(xiàn)方案
伺服控制卡以 TI 公司的TMS320F2812 DSP 作為核心處理器,與FPGA 結合來實現(xiàn)整 個板卡的控制功能,通過CPCI 總線完成與上位PC 機的通信,其系統(tǒng)功能框圖如圖1 所示:
圖 1 伺服控制卡硬件結構圖
FPGA 選用Altera 公司的EPF10K30A,它內嵌1536Byte 的RAM,此RAM 為主機與DSP 共享,用于上位機與DSP 之間的高速數(shù)據(jù)緩沖,F(xiàn)PGA 負責接收上位機傳遞的命令和參數(shù) 等數(shù)據(jù),經(jīng)處理后發(fā)送給DSP 進行相應的控制操作,同時反饋信息給上位機。 TMS32F2812 的主要任務就是完成復雜的伺服控制算法,特別是位置控制和速度控制。
FPGA 通過2812 的外部中斷XINT1 和XINT2 來觸發(fā)2812 接收控制命令和參數(shù),2812 接收 到命令后,根據(jù)自身定義的工作協(xié)議進入相應的工作狀態(tài)。
系統(tǒng)設計中采用 PLX 公司的PCI9054 作為總線接口芯片,實現(xiàn)CPCI 局部總線與FPGA 的通信。PCI9054 采用C 模式,在該模式下,PCI 的數(shù)據(jù)線與地址線是非復用的,設計時只 需關注9054 的本地端總線。
2.WDM 驅動程序設計
在Windows 環(huán)境下,位于用戶態(tài)的應用程序不能之間訪問硬件資源,而要通過執(zhí)行核 心態(tài)的驅動程序來間接完成對硬件資源的訪問,因此,對于上位機上的應用程序,要對伺服 控制卡進行訪問,必須要為其開發(fā)驅動程序。
WDM 驅動程序是一種Pnp 驅動程序,它能夠實現(xiàn)Windows 98 與Windows 2000 、 Windows XP 之間的源代碼級兼容。Windows 2000 性能穩(wěn)定,在調試自行開發(fā)的板卡時,仍 然是首選的操作系統(tǒng)。在Windows 2000 中,所有對驅動程序的I/O 請求都轉化為I/O 請求 包(IRP)來表示,IRP 是I/O 管理器在響應I/O 請求時從非分頁系統(tǒng)內存中分配的一個可變 大小的數(shù)據(jù)結構,I/O 管理器負責產(chǎn)生代表一次I/O 操作的IRP,并將IRP 傳至正確的設備 驅動程序,并通過分層的驅動程序傳遞給物理設備。設備驅動程序則接收IRP,執(zhí)行相應的 操作,完成后再將IRP 傳送回I/O 管理器,表示I/O 操作的完成或者通過I/O 管理器將其傳 遞給其他的驅動程序進行進一步的處理。
3.伺服控制卡的WDM 驅動程序設計與實現(xiàn)
驅動程序的開發(fā)環(huán)境常用的有微軟的DDK、Jungo 的WinDriver 和Numega 的Driver Studio。Driver Studio 把DDK 封裝成類,包含完善的代碼生成和調試工具,并且提供對WDM 驅動的完全支持,利用它開發(fā)的核心態(tài)驅動程序運行效率也很高。本系統(tǒng)在VC 環(huán)境下利用 Driver Studio 開發(fā)驅動程序。
接口芯片 PCI9054 支持主模式、從模式和DMA 模式三種數(shù)據(jù)傳輸方式。DMA 傳輸不 通過處理器,直接進行數(shù)據(jù)交換,可以節(jié)省CPU 資源;并且DMA 模式還支持CPCI 總線與本 地總線之間的高效突發(fā)。
3.1 DMA 數(shù)據(jù)傳輸實現(xiàn)
PCI9054 集成了兩個互相獨立的DMA 通道,每一個通道由一個DMA 控制器和一個專 用雙向FIFO 組成,都支持塊DMA 和分散/集中DMA 操作,這里選用DMA 通道0,采用塊 DMA 方式實現(xiàn)傳輸。在Driver Works 中提供了三個類來實現(xiàn)DMA傳輸,分別是KDmaAdapter 類、KDmaTransfer 類和KCommonDmaBuffer 類。
3.1.1.DMA 適配器
對于DMA 傳輸,驅動程序需要創(chuàng)建一個DMA 適配器,來表明一個DMA 通道的特性 和提供串行化訪問的服務。KDmaAdapter 類實現(xiàn)對DMA 適配器的操作。在它的初始化函數(shù) Initialize(PDEVICE_DESCRIPTION pDesc,PDEVICE_OBJECT pPdo)中第一個參數(shù)是一個 DEVICE_DESCRIPTION 結構的指針,這個參數(shù)用于對DMA 通道的屬性進行設置。
3.1.2. DMA 控制器
采用 DMA 方式時,CPU 要放棄對系統(tǒng)總線的使用權,主存儲器和外部設備是被控制的對 象,它們之間沒有相互控制的能力,需要利用DMA 控制器來代替CPU 完成控制功能。
在用DriverWorks 開發(fā)驅動時, KDmaTransfer 類用于控制DMA 的傳輸;它可以啟動一個DMA 傳 輸,指定DMA 傳輸?shù)姆较?,DMA 傳輸數(shù)據(jù)緩沖區(qū)的物理地址和要傳輸?shù)淖止?jié)數(shù)。 KDmaTransfer 類的Initiate()函數(shù)用于初始化一個KDmaTransfer 對象;在成功初始化 一個KDmaTransfer 類對象后,將會調用DMA 準備就緒回調例程OnDmaReady,在該例程中獲 取要傳輸?shù)膬却娴牡刂泛妥止?jié)數(shù),并調用StartDMA 例程開始DMA 傳輸。
與中斷結合的DMA 傳輸在一次傳輸結束后會再次調用 KDmaTransfer 類的Continue()函數(shù)發(fā)起下一次的DMA 傳輸操作,直到傳輸完成。
3.1.3. DMA 公共緩沖區(qū)
在DriverWorks 中KCommonDmaBuffer 類實現(xiàn)對公用緩沖區(qū)的操作。在實際使用時,聲 明一個KCommonDmaBuffer 類對象并初始化。在傳輸結束后,釋放公共緩沖區(qū),以防止內存 丟失。
3.1.4. 寄存器設置
PCI9054 在DMA 模式下傳輸,驅動程序要通過I/O 指令設置DMA 控制器內部的寄存器 以實現(xiàn)兩總線間的數(shù)據(jù)傳送,需要設置的內部寄存器及其具體功能如下表1 所示:
3.2 驅動開發(fā)中的中斷處理機制及實現(xiàn)
本系統(tǒng)的驅動程序采用塊DMA 與中斷結合的方式來實現(xiàn)主機與伺服控制卡之間的數(shù) 據(jù)傳輸。以讀操作為例,每次DMA 傳輸完后,都會產(chǎn)生一個DMA 中斷,中斷處理程序應 答中斷,并獲取公共緩沖區(qū)中的數(shù)據(jù),通知主機端有數(shù)據(jù)到達;可以看出,高效的DMA 處 理依賴于高效的中斷處理過程。
中斷處理完成 CPU 與I/O 設備之間的信息交換,在為硬件板卡開發(fā)驅動程序時需要為 中斷配置相應的驅動處理。在處理中斷之前要對中斷資源進行配置,首先定義并初始化一個 中斷對象,在初始化階段,提取IRP 資源中的中斷級別、中斷模式、中斷向量、共享模式 等信息。利用上面獲得的參數(shù)來連接中斷,連接中斷操作的主要目的是注冊設備驅動的中斷 服務例程(ISR),以便在中斷發(fā)生后中斷服務例程能夠被調用。在DriverWorks 中用KInterrupt 類實現(xiàn)對硬件中斷的處理。
status = m_Irq.InitializeAndConnect(pResListTranslated, LinkTo(Isr_Irq), this)
當硬件發(fā)生中斷時,硬件抽象層(HAL)把中斷級別(IRQL)提升到合適的中斷級別, 然后調用中斷服務例程(ISR)。CPCI 總線是中斷共享的,因此,ISR 首先確定是哪一個設 備發(fā)生了中斷, 如果不是當前設備的中斷,立即返回FALSE ,以便HAL 把中斷發(fā)送給其 他設備的驅動程序。如果是當前設備的中斷,則在清除該中斷,并做相應的處理。中斷處理 的整個過程如下圖2 所示:
ISR 執(zhí)行在高于DISPATCH_LEVEL 的IRQL 上,它凍結了其CPU 上所有低于或等于該 IRQL 上的其他活動,為了提高系統(tǒng)性能,ISR 例程應該盡可能快的完成;此外,ISR 中使 用的所有代碼和數(shù)據(jù)必須存在于非分頁內存中,能調用的內核模式函數(shù)也十分有限。
圖2:中斷處理流程圖
Windows 2000 提供了延遲過程調用(DPC)機制來解決這個問題,ISR 決定當前請求的 完成并請求一個DPC,之后,內核在DISPATCH_LEVEL 級上調用這個DPC 例程。當有當 前設備的中斷到來時,把一個DPC 插入到DPC 隊列中。實現(xiàn)代碼如下:
m_DpcFor_Irq.Setup(LinkTo(DpcFor_Irq), this);//創(chuàng)建一個DPC m_DpcFor_Irq.Request(NULL, NULL)// 把一個DPC 插入到DPC 隊列等待執(zhí)行
4. 應用程序與驅動程序的通信
4.1 通信的實現(xiàn)策略
應用程序采用Win32 事件通知的方式與驅動程序進行通信:應用程序調用API 函數(shù) CreatFile 打開設備,調用CreateEvent 創(chuàng)建事件句柄hEvent 并置為無信號態(tài),把hEvent 作為 函數(shù)DeviceIoControl 的參數(shù)傳遞給驅動程序,同時調用CreateThread 創(chuàng)建等待線程;WDM 驅動程序接收事件句柄hEven,初始化KEvent 類對象m_hEvent,當中斷發(fā)生時,在DPC 中 執(zhí)行m_hEvent-》Set(),將事件設置為信號態(tài),喚醒應用程序中的等待線程,然后調用 DeviceIoControl 完成數(shù)據(jù)傳輸。
4.2 數(shù)據(jù)傳輸速率測量
在實際測量時,采用了硬件測量法,應用程序不斷向DSP 處理卡發(fā)送數(shù)據(jù)/接收數(shù)據(jù), 利用示波器來觀測BLAST#和ADS#信號的變化周期,得出每組數(shù)據(jù)的傳輸時間。該DSP 卡本地端總線為8 位,在DMA 模式下,測得的發(fā)送/接收時的測量結果如下表2 所示:
從以上結果可以看出,無限突發(fā) DMA 模式傳輸速率最高,可達26.3Mbyte/s,若本地端總線 為32 位,則數(shù)據(jù)傳輸速率可以達到26.3*4=105.2Mbyte/s ,接近32 位PCI 總線的極限傳輸速率133Mbyte/s,能夠滿足大部分高速數(shù)據(jù)傳輸要求。
結束語
自行開發(fā)的伺服控制卡,基于高速的CPCI 總線,以DSP 作為卡上處理器,以FPGA 實現(xiàn)邏輯處理,能夠作為一個獨立的單元替代原來的工控機子系統(tǒng),大大簡化了當前光電子 學系統(tǒng)結構;利用Driver Studio 為其開發(fā)的底層驅動程序,能使板卡在Windows2000 下穩(wěn) 定地工作,在與中斷結合的DMA 數(shù)據(jù)傳輸模式下,數(shù)據(jù)傳輸速率能夠滿足伺服控制卡的精 度和實時性要求。
-
WDM
+關注
關注
1文章
111瀏覽量
21504 -
CPCI
+關注
關注
7文章
72瀏覽量
33402 -
伺服卡
+關注
關注
0文章
2瀏覽量
7514
發(fā)布評論請先 登錄
TFF型WDM器件技術原理
WINDOWS下PCI接口卡WDM驅動程序的DMA編程技術
基于CPCI的伺服卡的DMA和中斷研究
Windows環(huán)境下開發(fā)PCI接口卡DMA應用的WDM編程技
基于CPCI總線的伺服控制卡的設計和實現(xiàn)
WDM/DWDM技術,什么是WDM/DWDM技術
基于CPCI總線的多網(wǎng)口卡設計

Windows 2000下WDM驅動程序的研究與開發(fā)
CPCI轉PCI載板轉接卡 PCI2CPCI

評論