閆航,劉亞斌,張秀磊
(北京航空航天大學自動化科學與電氣工程學院,北京100191)
圖像采集測試系統(tǒng)在測試與控制領域應用的十分頻繁,圖像采集的質量和速度在很大程度上直接影響著控制的精度與速度,而其中很多地方用到了以LVDS通信協(xié)議來傳輸信號的圖像采集系統(tǒng)。在高速數據傳輸方面,PXI總線結構作為傳輸總線在很多領域都已經運用過,具備很好的傳輸性能與穩(wěn)定性[1-3]。因此,基于PXI總線的驅動程序開發(fā)就顯得尤為重要。為了測試某型號空空導彈位標器工作時圖像信號,而研發(fā)了圍邊跑特性評估系統(tǒng),而這套系統(tǒng)的核心便是四通道LVDS圖像采集卡[4-6]。因此,在PXI總線下開發(fā)出穩(wěn)定快速的驅動程序成為這個系統(tǒng)中尤為重要的部分。
為了滿足某型號位標器特性評估系統(tǒng)設備要求,研發(fā)出的四通道圖像采集卡具有以下具體功能:實現(xiàn)PXI總線接口,同時滿足LVDS通信協(xié)議的要求;緩存大小為512 K*16 bit;數據帶寬40 Mb/s;具備自檢功能。
在過去的驅動開發(fā)中,主流的開發(fā)框架是基于WDM的,但是其繁瑣的電源管理功能的實現(xiàn),以及即插即用等模塊來說,相對于最新的WDF框架,其開發(fā)的復雜程度都是很高的。同時隨著微軟不在更新xp系統(tǒng),掌握對win7甚至是win10支持更加完美的WDF框架變得勢在必行。本文正式基于WDF框架,對于某型號位標器特性評估系統(tǒng)所需要的LVDS圖像采集卡進行驅動的開發(fā)。微軟的WDF框架,并不是對WDM框架的否定與推翻,而是在WDM的基礎上進行了更加人性化的封裝,從很多方面降低了開發(fā)的難度、縮短了開發(fā)周期。文中采用的是WDF中的KMDF(內核模式驅動程序框架)。圖1的簡圖中展示了IO請求從用戶程序下發(fā)到IO管理器,之后被轉換成為IRP之后再派發(fā)給底層的設備;用戶程序工作在用戶層,在與內核進行交互時只能使用部WIN32 API來實現(xiàn);內核子系統(tǒng)的主要功能是將用戶的請求包裝成IRP并發(fā)送給相應的設備進行處理;WDF內核框架從功能上可以分為兩個部分,上半部分負責接收IRP包,下半部分負責發(fā)送IRP包,同時WDF內核框架還實現(xiàn)了3個在驅動開發(fā)中十分重要的模塊:對象模塊、IO模塊和PNP/電源模塊[7]。
圖1 KMDF內核框架
驅動對象在整個驅動編寫的過程中占著極其重要的地位,在很多地方的優(yōu)化和處理都離不開驅動對象。調用WdfDriverCreate函數就可以創(chuàng)建一個全局的驅動對象;對于同一個設備文件,在同時運行多個設備時,驅動對象是唯一的。在整個WDF驅動程序中,只需要調用WdfGetDriver()函數,就可以從一個全局結構體中,獲得同一個驅動的句柄。
在以往的WDM驅動框架中,設備對象是整個驅動框架的核心,但是在微軟新推出的WDF驅動框架中,設備對象在如今的驅動開發(fā)中已經不再貫穿整個驅動的始終,很多地方都由其他的對象來實現(xiàn)和完成[8]。在WDF驅動框架中,使用EvtDriverDeviceAdd()函數來創(chuàng)建設備對象。在四通道LVDS圖像卡中,BMKLvds_EvtDeviceAdd()函數主要實現(xiàn)了以下功能:
1)WdfDeviceInitSetIoType()函數設置驅動中 IO的類型,參數設置的不同導致讀寫數據時所訪問的內存地址的不同。
2)WDF_PNPPOWER_EVENT_CALLBACKS_INI T()函數進行即插即用的初始化以及電源管理例程配置結構。
3)WDF_FILEOBJECT_CONFIG_INIT()函數設置相應的create和close相應的例程。
4)WDF_OBJECT_ATTRIBUTES_INIT_CONTEX T_TYPE()函數初始化設備對象環(huán)境變量結構。
5)deviceAttributes.Synchronization Scope=Wdf SynchronizationScopeDevice函數實現(xiàn)了設備對象下的同步。
6)WdfDeviceCreate()函數創(chuàng)建設備對象并通過GetDeviceContext()函數獲得設備對象環(huán)境變量結構地址指針。
7)WDF_INTERRUPT_CONFIG_INIT()函數通過函數指針的方式設置中斷服務例程和延遲過程調用,并通過WdfInterruptCreate()函數創(chuàng)建中斷對象;在4通道LVDS圖像卡中,圖像數據的采集是使用DMA實現(xiàn)的,調用BMKLvds_InitializeDMA()可以初始化LVDS圖像卡的DMA模塊。
8) WDF_IO_QUEUE_CONFIG_INIT_DEFAUL T_QUEUE()函數配置IO隊列,同時對EvtIoRead、EvtIoWrite、EvtIoDeviceControl進 行 配 置 ;使 用WdfIoQueueCreate()函數創(chuàng)建隊列。
9)最后一步,使用Wdf Device Create Device Interface()創(chuàng)建設備驅動接口 GUID[9-11]。
與WDM驅動框架相同,WDF框架在對系統(tǒng)的IO請求方面做了相同的處理。IO管理器將IO請求封裝成IRP結構體,然后轉發(fā)給內核驅動,WDF框架收到IRP請求之后,通過判斷IRP的類型,根據不同的請求調用事件回調或是直接在框架內部處理。圖2表示驅動程序對I/O請求如何進行處理[12-14]。
圖2 IRP執(zhí)行路徑
在LVDS圖像卡驅動中,主要通過4個函數來實現(xiàn)板卡所有的I/O請求,分別是Create處理程序、Close處理程序、Read處理程序和DeviceControl處理例程。在Create處理程序中,驅動程序會在框架接收到IRP_MJ_CREATE的請求之后調用BMKLvds_EvtDeviceFileCreate()回調函數函數。在Close處理程序中,驅動程序會釋放在驅動中所使用的的內核事件,同時不在接收新的中斷。DeviceControl處理例程實現(xiàn)了大部分驅動的I/O功能,在應用程序中調用DeviceControl函數后,框架會調用回調函數BMKLvds_EvtIoDeviceControl(),并將這個I/O請求打包為IRP轉發(fā)給相應的設備。對于4通道LVDS圖像采集卡驅動程序,擁有以下I/O功能。1)BMK_LVDS_REGISTER_DATA_ARR_EVEN T,中斷到來時,會創(chuàng)建一個通知用戶程序的信號量;2)BMK_LVDS_UNREGISTER_DATA_ARR_EVENT,將上述創(chuàng)建的信號量刪除;3)BMK_LVD S_REGISTER_WAITDMASTART_EVENT,創(chuàng)建一個用來等待DMA啟動的事件;4)BMK_LVDS_UNRE GISTER_WAITDMASTART_EVENT,刪除上述創(chuàng)建的事件;5)BMK_LVDS_SEND_DATA,以 LVDS協(xié)議將上位機所設定的數據發(fā)送出去;6)BMK_LVDS_STOP_SEND,停止發(fā)送數據;7)BMK_LVDS_RECV_DATA,以LVDS協(xié)議接收傳進板卡的數據;
8)BMK_LVDS_STOP_RECV,停止中斷方式接收數據;
9)BMK_LVDS_DMA_SEND,以 DMA 方式發(fā)送LVDS數據。
10)BMK_LVDS_DMA_RECV,以DMA方式接收LVDS數據。
11)BMK_LVDS_CHANAL_CHANGE,切換圖像卡接收數據的通道。
四通道LVDS圖像采集板卡能夠產生兩類中斷:Local中斷和DMA中斷。其中Local中斷是由板卡的Local端產生的,Local中斷在4通道LVDS圖像卡中分為FIFO中斷、數據傳輸完成中斷。在板卡上的硬件FIFO資源達到上位機設定的值之后,會產生FIFO中斷,通知上位機程序來取走數據;數據傳輸完成中斷表示底層數據采集結束,且所有采集的數據都轉移到FIFO中,從而產生中斷告訴上位機,上位機一次性將FIFO中數據取走便完成了本次的采集任務。
驅動程序在處理中斷時,并不是直接處理,因為中斷的優(yōu)先級很高,占用這個優(yōu)先級進行相應的數據處理對于整個系統(tǒng)來說會造成不良的影響;故先判斷中斷的類型,然后屏蔽該類型的中斷,緊接著在DPC延遲處理程序中對相應的中斷進行處理[15]。
圖3 驅動程序中斷處理流程圖
在現(xiàn)場的測試過程中,很多時候需要做高低溫實驗,高溫加溫到60度保溫兩個小時,低溫降溫到零下40度保溫兩個小時,因此如果一次只測試一發(fā)產品的話對于人力和物理來說都是很大的浪費,所以在結合現(xiàn)場的實際條件,提出了基于PXI的四通道LVDS圖像采集卡,圖像采集卡中,通過4片DS90LV048A芯片可以獨立的采集四路圖像信號,通過上位機給底層FPGA發(fā)送控制命令,來選擇采集哪一路數據,實現(xiàn)四路獨立的LVDS圖像采集功能。四路圖像數據之間獨立性十分好,互不干擾,經過長期的測試,效果很好,達到了預期想要實現(xiàn)的效果。
2.2.1 液料比對樹舌靈芝多糖提取率的影響。由圖1可知,液料比在15∶1~35∶1范圍內,GASP提取率與液料比呈正相關;在35∶1時最大,提取率可達2.18%;而液料比超過35∶1以后,隨著液料比的增大GASP提取率呈下降趨勢。這可能是因為在一定范圍內,隨著液料比的增大可以提高植物細胞內外溶劑的濃度差,從而使水溶性多糖迅速溶出從而提高多糖提取率[16],但液料比達到一定值后,液料比太大,濃縮時間延長,導致多糖損失[17]。綜合考慮,選擇35∶1為BBD(Box-Behnken Design)試驗液料比的中心點。
在通過WDF框架編寫完驅動程序之后,首先通過windbg程序進行了初步的調試,驗證驅動程序中對于fpga的指令能夠成功的發(fā)送下去,同時使用雙機聯(lián)調的方式調試驅動程序,在確保驅動程序的正確性。在VC++6.0的環(huán)境下針對之前開發(fā)的驅動程序,進行測試用動態(tài)鏈接庫的編寫,測試用的動態(tài)鏈接庫主要包含以下幾個功能:
1)打開板卡,在內存中聲明相應的對象;
2)配置通道,通過FPGA指令的形式對四通道LVDS板卡的采集通道進行選擇,這一步必須發(fā)生在數據采集步驟之前,因為在FPGA中,如果不對板卡的通道進行配置,默認的是一個通道也不選擇的情況;
3)開始采集,這個功能并不是真正意義上的開始采集數據,而是在動態(tài)鏈接庫層根據上位機軟件傳遞的值,對動態(tài)鏈接庫層接收數據的緩沖區(qū)FIFO進行初始化和配置,準備接受來自底層驅動的數據,以及接收數據之后如何將數據以一定的格式、協(xié)議傳遞給上位機軟件,最后存儲在計算機的內存或者是本地數據庫中。在本測試軟件中,在動態(tài)鏈接庫層暫時聲明了一個10M的FIFO,當LVDS圖像采集卡開始采集數據,底層的驅動程序將數據以驅動程序中規(guī)定的格式以及協(xié)議傳送的動態(tài)鏈接庫層中的FIFO中,而FIFO中只要有數據,就通知上位機軟件動態(tài)鏈接庫層已經接收導數據,此時,上位機開始從動態(tài)鏈接庫層得FIFO中取數據。這樣便實現(xiàn)了LVDS圖像數據從底層硬件到驅動程序,然后到動態(tài)鏈接庫,在到上位機軟件,最后到達計算機的硬盤或者本地的數據庫中這樣一個數據的傳輸過程。最后在檢查計算機硬盤中的數據的正確性就能夠確定驅動的正確性。
4)采集數據,在開始采集之后就可以以一定的數據量、格式、協(xié)議采集數據了;
5)停止采集;
圖4為測試結果,讓四通道LVDS圖像采集卡接收0x0000~0xff的數據。
圖4 測試結果
圖4的測試結果只是很多次測試中的一組,在測試完之后會自動驗算測試結果,顯示丟幀數。通過實際測量300組測試,發(fā)現(xiàn)采集結果正確,沒有出現(xiàn)丟幀錯幀的情況,同時采集速度也能夠滿足需求。
通過使用WDF驅動框架對4通道LVDS圖像采集卡的開發(fā),發(fā)現(xiàn)相對于WDM
驅動框架,WDF對于很多功能的封裝更加晚上,更加人性化,大大加快了開發(fā)的效率。文中基于WDF框架實現(xiàn)了整個驅動程序的開發(fā),在實際的測試任務重運行穩(wěn)定,能夠很好的采集位標器穿回來的圖像數據。
參考文獻:
[1]郝賢鵬,張然峰,陶宏江.基于FPGA的高速圖像傳輸系統(tǒng)設計[J].紅外與激光工程,2015,44(11):3-4.
[2]馬志剛,朱思敏,劉文怡.基于LVDS的高速圖像數據存儲系統(tǒng)設計[J].數據采集與處理,2013,28(3):1-4.
[3]張小軍,廖風強,王錄濤,王文平.多通道高速串行LVDS信號解串器設計[J].電子測量技術,2013(4):1-3.
[4]范旭東,沈三民,劉建梁,等.基于LVDS和68013A的數據控制傳輸系統(tǒng)設計[J].計算機測量與控制,2016,39(6):14-16.
[5]竇維治.基于高速并行LVDS總線在視頻處理系統(tǒng)中的應用研究[J].電子器件,2013,31(3):11-13.
[6]李斌,張會新,劉文怡.基于LVDS的高速圖像數據存儲器的設計與實現(xiàn)[J].電視技術,2013,31(3):3-5.
[7]周歡,宋征宇.基于BMU/LVDS總線的閉環(huán)總檢查測試技術研究[J].航天控制,2013,31(3):1-4.
[8]張?zhí)煳模瑒⑽拟?基于LVDS和PCI接口的高速圖像傳輸系統(tǒng)設計[J].電子技術應用,2014,40(7):1-4.
[9]肖文君,劉萬松,劉伍豐,等.基于WDF的PCIe總線驅動程序設計與實現(xiàn)[J].測控技術,2015,34(7):3-6.
[10]何帥,王文基,狄衛(wèi)國.基于WDF的航天測控數字基帶板驅動程序設計[J].無線電工程,2016,46(4):9-11.
[11]賈玉姣,劉亞斌,張秀磊.基于高速多通道采集模塊的數字化儀軟件設計[J].科學技術與工程,2016,24(12):1-3
[12]李世建.基于FPGA的PCI Express接口設計及WDF驅動程序開發(fā)[D].西安:西安電子科技大學,2013.
[13]黃華華,魏豐,鄧林杰.基于PCI設備的DMA傳輸建模與分析[J].數字技術與應用,2015(5):1-4.
[14]李木國,黃影,劉于之.基于WDF過濾驅動的監(jiān)控系統(tǒng)的設計與實現(xiàn)[J].計算機光盤軟件與應用,2014(11):2-5.
[15]黎順杰,張艷榮.基于WDF的PCI-CAN設備驅動程序設計[J].電子測試,2013(5):2-4.