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