基于USB總線的數(shù)據(jù)采集設(shè)備的設(shè)計與實現(xiàn)
3 設(shè)備驅(qū)動程序設(shè)計
USB設(shè)備驅(qū)動程序的設(shè)計是基于WDM(Windows Driver Model,Windows驅(qū)動程序模型)的4。WDM采用分層驅(qū)動程序模型,對于USB設(shè)備來說,可分為USB總線驅(qū)動程序和USB功能驅(qū)動程序(見圖2)。
USB總線驅(qū)動程序由操作系統(tǒng)提供,它位于USB功能驅(qū)動程序的下面,負責(zé)與實際的硬件打交道,實現(xiàn)煩瑣的低層通信。USB功能驅(qū)動程序由設(shè)備開發(fā)者編寫,位于USB總線驅(qū)動程序的上面,不與實際的硬件打交道,而是通過向USB總線驅(qū)動程序發(fā)送包含URB(USB Request Block,USB請求塊)的IRP(I/O Request Packet,I/O請求包),來實現(xiàn)對USB設(shè)備信息的發(fā)送或接收。采用這種分層驅(qū)動程序的設(shè)計方法有兩個優(yōu)點:(1)多個USB設(shè)備可以通過USB總線驅(qū)動程序來協(xié)調(diào)它們的工作;(2)編寫分層驅(qū)動程序較之編寫單一驅(qū)動程序相對簡單,且可以節(jié)省內(nèi)存和資源,不易出錯。 USB設(shè)備驅(qū)動程序的工作原理可以通過圖2簡單描述。
若應(yīng)用程序想對設(shè)備進行I/O操作,它便使用Windows API 函數(shù)(如DeviceloControl 函數(shù))對WIN32子系統(tǒng)進行WIN32調(diào)用。此調(diào)用由I/O系統(tǒng)服務(wù)接收并通知I/O管理器,I/O管理器將此請求構(gòu)造成一個合適的I/O請求包(I/O Request Packet,IRP)并把它傳遞給USB功能驅(qū)動程序。USB功能驅(qū)動程序接收到這個IRP以后,根據(jù)IRP中包含的具體操作代碼,構(gòu)造相應(yīng)的USB請求塊并把此URB放到一個新的IRP中,然后把此IRP傳遞到USB總線驅(qū)動程序,USB總線驅(qū)動程序根據(jù)IRP中所含的URB執(zhí)行相應(yīng)的操作(如從USB設(shè)備讀取數(shù)據(jù)),并把操作結(jié)果通過IRP返還給USB功能驅(qū)動程序。USB功能驅(qū)動程序接收到此IRP后,將操作結(jié)果通過IRP返還給I/O管理器,最后I/O管理器將此IRP中操作結(jié)果返還給應(yīng)用程序,至此應(yīng)用程序?qū)SB設(shè)備的一次I/O操作完成。
USB功能驅(qū)動程序除負責(zé)處理應(yīng)用程序的I/O請求外,還要處理PnP管理器發(fā)送給它的PnP請求(如設(shè)備啟動請求IRP_MN_START_DEVICE,設(shè)備刪除請求IRP_MN_REMOVE_DEVICE等)。通過對這些PnP請求的處理,USB功能驅(qū)動程序可支持設(shè)備的熱插拔和即插即用功能。
驅(qū)動程序的入口函數(shù)是DriverEntry( ),所有對各種IRP的處理例程都在此入口函數(shù)中做出定義。
開發(fā)USB設(shè)備驅(qū)動程序的工具有Microsoft公司的Win98DDK,Compuware公司的Numega DriverStudio等。筆者在實際開發(fā)中使用了Win98DDK。
4 應(yīng)用軟件的設(shè)計
用戶態(tài)的軟件設(shè)計由兩個部分組成:動態(tài)鏈接庫和應(yīng)用程序。動態(tài)連接庫負責(zé)與內(nèi)核態(tài)的USB功能驅(qū)動程序通信并接受應(yīng)用程序的各種操作請求,而應(yīng)用程序負責(zé)對所采集的數(shù)據(jù)進行實時顯示、分析和存盤。
動態(tài)鏈接庫的工作原理如下:當它收到應(yīng)用程序開始采樣的請求后,便創(chuàng)建兩個線程:采樣線程和顯示存盤線程。采樣線程負責(zé)將采集數(shù)據(jù)寫到應(yīng)用程序提交的內(nèi)存;而顯示存盤線程由多媒體定時器控制(每隔一段時間多媒體定時器就調(diào)用一次此線程),此線程負責(zé)給應(yīng)用程序發(fā)送顯示和存盤消息。當應(yīng)用程序接收到此消息后,便從它提交的內(nèi)存中讀取數(shù)據(jù)并顯示和存盤。此處需要注意的是采樣線程和顯示存盤線程在讀寫應(yīng)用程序提交的內(nèi)存時要保持同步(如當采樣線程正在向內(nèi)存進行寫操作時顯示存盤線程就不能對此段內(nèi)存進行讀操作,否則就有可能導(dǎo)致讀寫錯誤)。保持線程同步的方法很多,如互斥量(Mutex)、信號量(Semiphore)和事件(Event)。此處使用了互斥量。
USB總線的特點使其非常適合于作為醫(yī)療儀器與主機之間的通訊接口,實現(xiàn)主機和醫(yī)學(xué)儀器之間的簡單、快速和可靠的連接。
基于USB總線的醫(yī)學(xué)數(shù)據(jù)采集設(shè)備,在實際應(yīng)用中取得了良好的效果。同時,它也為數(shù)據(jù)采集提供了一種新穎的、方便的和可靠的解決方案。
參考文獻
1 USB1.1. Universal serial bus specification S
2 曾樂朋,高小榕,李明毅. 12導(dǎo)聯(lián)同步心電采集測量系統(tǒng)及QT/QTd分析J. 清華大學(xué)學(xué)報2000;4095~8
3 李全政 高小榕 歐陽婧. 胸阻抗信號中的呼吸波的去除J. 清華大學(xué)學(xué)報200040 9 13~16
4 Chris Cant著,孫義譯.Windows WDM 設(shè)備驅(qū)動程序開發(fā)指南M. 北京:機械工業(yè)出版社 2000
評論