基于USB和多線(xiàn)程的實(shí)時(shí)數據采集系統
關(guān)鍵詞:USB PDIUSBD12 多線(xiàn)程 實(shí)時(shí)數據采集
1 問(wèn)題的提出
隨著(zhù)信息技術(shù)的飛速發(fā)展,各種數據的實(shí)時(shí)采集和處理在現代工業(yè)控制中已成為必不可少的。這就為我們的設計提出了兩個(gè)方面的要求:一方面,要求接口簡(jiǎn)單靈活且有較高的數據傳輸率;另一方面,由于數據量通常都較大,要求主機能夠對實(shí)時(shí)數據做出快速響應,并及時(shí)進(jìn)行分析和處理。
傳統的外設與主機的通信接口難以滿(mǎn)足上述第一個(gè)方面的要求。這些接口一般采用PCI部線(xiàn)或RS-232串行總線(xiàn)。PCI總線(xiàn)雖然有很高的傳輸率(可達132Mbps),還能“即插即用”,但是它們的擴充槽相當有限,且插拔并不方便。RS-232串行總線(xiàn)雖然連接方便,可是它的帶寬非常有限,傳輸速度太慢,而且1條RS-232串口通信電纜只能連接1個(gè)物理設備。USB技術(shù)正是順序這一要求提出的,它集PCI和RS-232的優(yōu)點(diǎn)于一身:具有較高的傳輸速率(USB協(xié)議1.1支持最高傳輸速度達12Mbps,USB協(xié)議2.0支持最高傳輸速度可達148Mbps),實(shí)現了真正意義上的“即插即用”(Plug Play),同時(shí)USB上最多可以連接127個(gè)外設。因此,將USB技術(shù)應用于數據的實(shí)時(shí)采集是非常適合的。
實(shí)時(shí)系統對多任務(wù)的要求比較普遍。往往在后臺采集數據、進(jìn)行數據顯示的同時(shí),還要在前臺界面對用戶(hù)的操作做出響應。在實(shí)時(shí)系統中,對實(shí)時(shí)數據做出及時(shí)而準確的反應是十分重要的。由于受A/D采集速度等因素的限制,從硬件上采用USB接口技術(shù)的確可以提高速度,但畢竟潛力有限,因此在現有硬件設計基礎上充分發(fā)揮軟件的作用就能進(jìn)一步提升速度。使用傳統的單線(xiàn)程編程技術(shù)效率較低,無(wú)法及時(shí)處理,必須充分利用Windows的多任務(wù)處理功能,采用多線(xiàn)程編程技術(shù)來(lái)處理數據。
在這個(gè)實(shí)時(shí)采集系統的設計上,我們將這兩種技術(shù)結合起來(lái):在硬件上采用USB技術(shù);軟件用VC++進(jìn)行開(kāi)發(fā),采用多線(xiàn)程編程,使系統的效率從這兩方面都得到提升。
2 系統體系結構
2.1 硬件結構
整個(gè)系統硬件結構如圖1所示。
實(shí)時(shí)數據采集系統主要由多路選擇開(kāi)關(guān)、A/D轉換、單片機系統、PDIUSBD12、微機組成。多路選擇開(kāi)關(guān)對多路信號進(jìn)行選擇,使其分時(shí)輸入;A/D轉換實(shí)現模擬信號的數字化;單片機系統主要完成信號采集、數據通信;PDIUSBD12實(shí)現USB接口;微機完成數據接收、存入數據庫、數據處理、計算、顯示等功能。
其中PDIUSBD12是系統USB技術(shù)得以實(shí)現的關(guān)鍵。它是Philips公司的一個(gè)帶并行總線(xiàn)的USB接口器件,支持本地的DMA傳輸。它完全符合USB1.1版的規范,同時(shí)集成了SIE(串行接口引擎)、FIFO存儲器、收發(fā)器以及電壓調整器。其主端點(diǎn)的雙緩沖配置增加了數據吞吐量并輕松實(shí)現實(shí)時(shí)數據傳輸,功能框圖如圖2所示。
在這個(gè)系統中,單片機采用的是80C52。PDIUSBD12與80C52的接口有2種方式:多路地址/數據總線(xiàn)方式、單地址/數據總線(xiàn)方式。我們采用的是前一種方式:使用了80C52的INT0、ALE、WR、RD和P0口,當PDIUSBD12接收到主機的有效信息時(shí),會(huì )產(chǎn)生一個(gè)中斷通知80C52進(jìn)行處理。在此種方式下,PDIUSBD12在A(yíng)LE下降沿的時(shí)候,對單片機的輸出地址進(jìn)行鎖存。若輸出地址為奇數,則表示對PDIUSBD12發(fā)送指令;若輸出地址為偶數,則表示對PDIUSBD12進(jìn)行數據傳輸。接口電路如圖3所示。
80C52將A/D采集的數據經(jīng)PDIUSBD12的并行接口送入FIFO存儲器。當USB的傳輸速率達到12Mbps時(shí),MMU(存儲器管理單元)和集成RAM作為USB之間速度差異的緩沖區,這就允許單片機以它自己的速率對USB信息包進(jìn)行讀寫(xiě)。若FIFO中數據已滿(mǎn),SIE會(huì )立即對數據做處理:同步模式的識別、并行/串行轉換、位填充/解除填充、CRC校驗/產(chǎn)生、PID校驗/產(chǎn)生、地址識別和握手評估/產(chǎn)生。SIE實(shí)現了全部的USB協(xié)議層,完全由硬件實(shí)現而不需要固件的參與。數據經(jīng)處理后由收發(fā)器通過(guò)數據線(xiàn)D+、D-傳送到主機。對一個(gè)單片機而言,PDIUSBD12看起來(lái)就像1個(gè)帶8位數據總線(xiàn)和1個(gè)地址位的存儲器件。
2.2 軟件結構
USB的軟件系統包括三部分:客戶(hù)應用軟件、設備固件以及USB設備驅動(dòng)程序。其中,設備固件和USB設備驅動(dòng)程序又被稱(chēng)為主機軟件。軟件層次如圖4所示。
2.2.1 固件設備
設備固件(firmware)是儲存在程序內存中的代碼。它使得USB接口芯片與主機和外設中其它電路能夠通信。固件由USB驅動(dòng)程序(USBD)、主控制器驅動(dòng)程序(HCD)兩部分組成。USBD的功能可以概括為:配置管理、總線(xiàn)管理、數據傳輸管理、提供客戶(hù)服務(wù)。USBD把IRP劃分為USB和設備需要大小的塊,確保每一個(gè)設備能分配到它所要求的USB資源,這樣它就可以支持USB設備配置。USBD提供了一個(gè)編程接口USBDI(USB驅動(dòng)程序接口),給客戶(hù)驅動(dòng)程序一種方式,用于傳輸請求,傳輸的方向可以是來(lái)自或發(fā)往USB的功能單元。大量的客戶(hù)服務(wù)是由USB的驅動(dòng)程序提供的,它幫助USB的客戶(hù)控制和訪(fǎng)問(wèn)它們的功能單元。HCD提供了對USB的低級支持,通過(guò)把IRP轉換成為單獨的事務(wù)處理后在USB上執行。
基于這種結構,主循環(huán)不關(guān)心數據是來(lái)自USB、串口還是并口,只檢查循環(huán)緩沖區內需要處理的新數據。這樣,主循環(huán)程序專(zhuān)注于數據的處理而ISR能夠以盡可能高的可能高的速度進(jìn)行數據的傳輸。
這部分程序結構可包括:
主循環(huán)程序――發(fā)送USB請求,處理USB總線(xiàn)事件和用戶(hù)功能處理等;
硬件提以層――對單片機的I/O口、數據總線(xiàn)等硬件接口進(jìn)行操作;
PDIUSBD12命令接口――對PDIUSBD12器件進(jìn)行操作的模塊子程序集;
請求處理程序――對USB的標準設備請求進(jìn)行處理和對用戶(hù)添加的廠(chǎng)商請求進(jìn)行處理;
中斷服務(wù)程序――當PDIUSBD12向單片機發(fā)出中斷請求時(shí),讀取PDIUSBD12的中斷傳輸來(lái)的數據,并設定事件標志和Setup包數據緩沖區,傳輸給主循環(huán)。
2.2.2 USB設備驅動(dòng)設計
在Windows下,與USB外設的任何通信必須通過(guò)USB設備驅動(dòng),這個(gè)驅動(dòng)知道如何與系統的USB驅動(dòng)和訪(fǎng)問(wèn)設備的應用程序通信。設備驅動(dòng)是保證應用程序訪(fǎng)問(wèn)硬件設備的軟件組件,使得應用程序不必知道物理連接、信號和與一個(gè)設備通信需要的協(xié)議等的細節,可以保證應用程序代碼只通過(guò)外設名字訪(fǎng)問(wèn)外設或端口目的地。應用程序不需要知道外設連接端口的物理地址,不需要精確監視和控制外設需要的交換信號。
設備驅動(dòng)通過(guò)在應用層和硬件專(zhuān)用代碼之間的轉化來(lái)完成它的任務(wù)。應用層代碼一般使用一套操作系統支持的函數,硬件代碼則處理那些訪(fǎng)問(wèn)外設電路的必要協(xié)議。設備驅動(dòng)能與應用程序之間相互通信是通過(guò)Windows提供的API函數,這些函數使應用程序能夠控制顯示器、處理信息、訪(fǎng)問(wèn)存儲器、讀寫(xiě)磁盤(pán)和其它設備。對于一些標準設備,Windows提供通用驅動(dòng);不過(guò),這個(gè)實(shí)時(shí)數據采集系統是自定義的設備,對此Windows并不提供通用的驅動(dòng),需要對設備編寫(xiě)自定義的驅動(dòng),并且必須遵循微軟在Windows98和更新版本中為用戶(hù)定義的Win32驅動(dòng)模式。Windows98和Windows2000中,USB總線(xiàn)驅動(dòng)是WDM驅動(dòng),擴展名為.sys。編寫(xiě)USB設備驅動(dòng)需要使用Visual C++,此外還需要Windows 98或2000設備開(kāi)發(fā)包(98DDK/NTDDK)。USB設備驅動(dòng)的編寫(xiě)通常不是一項簡(jiǎn)單的任務(wù),驅動(dòng)開(kāi)發(fā)包就提供一種途徑,通過(guò)做盡可能多的工作為跳過(guò)驅動(dòng)開(kāi)發(fā),這些開(kāi)發(fā)庫有Blue Water Systems的WinDK和Compuware NuMega的DriverWorks。這些工具包能夠集成到Visual C++編程環(huán)境中。運用這些工具包只需很少的時(shí)間就能生成一個(gè)高效的驅動(dòng)程序。
這一部分可以包括4個(gè)模塊:初始化模塊、即插即用管理模塊、電源管理模塊和I/O功能模塊。初始化模塊提供一個(gè)DriverEntery入口點(diǎn)來(lái)執行大量的初始化函數。即插用模塊實(shí)現USB設備的動(dòng)態(tài)插拔及配置。當硬件檢測到USB設備接入時(shí),Windows查找相應的驅動(dòng)程序,并且調用它的DriverEntery例程,PnP(即插即用)管理器調用驅動(dòng)程序的AddDevice例程,通知它添加了一個(gè)設備。驅動(dòng)程序會(huì )收到一個(gè)包含有設備分配資源信息的啟動(dòng)設備的IRP,在對設備進(jìn)行正確配置后,開(kāi)始與硬件的對話(huà)。在運行過(guò)程中,如果設備被拔除,PnP會(huì )發(fā)出相應的IRP,驅動(dòng)程序會(huì )進(jìn)行盯應處理。USB設備的掛起和喚醒是由電源管理模塊進(jìn)行管理的。I/O功能模塊完成I/O請求的工作。
2.2.3 應用程序設計
固件程序和USB設備驅動(dòng)程序的設計是USB設備開(kāi)發(fā)者的工作,對于廣大用戶(hù)而言,與系統的交互是通過(guò)應用程序實(shí)現,而且整個(gè)實(shí)時(shí)采集系統的主要數據處理都是在這里完成的。因此,運行效率高、界面友好、具有強大數據分析和處理的應用程序的設計,也是系統設計上一個(gè)不容忽視的關(guān)鍵因素。應用程序的主要功能有:?jiǎn)?dòng)/關(guān)閉USB設備,檢測USB設備,設置USB數據傳輸管道/端口,設置A/D,采集數據,顯示/分析數據。這里,我們采用Visual C++6.0作為程序的開(kāi)發(fā)環(huán)境,并且充分運用了多線(xiàn)程的編程思想。
在這個(gè)設備中,設置4個(gè)線(xiàn)程:首先是1個(gè)主線(xiàn)程,負責用戶(hù)界面,并保持中樞地位。它的生存周期也就是整個(gè)用戶(hù)程序的主存期,用戶(hù)的動(dòng)作(例如鼠標事件、鍵盤(pán)事件)都會(huì )觸發(fā)主線(xiàn)程的消息機制,從而完成對用戶(hù)的響應;而3個(gè)分離的輔助線(xiàn)程分別負責數據的采集、數據的分析處理以及數據的顯示這3個(gè)不同的任務(wù)。輔助線(xiàn)程是在主線(xiàn)程運行過(guò)程中產(chǎn)生的,它的生命就是線(xiàn)程函數本身,函數一旦return,線(xiàn)程就結束了。因此,輔助線(xiàn)程的生存周期只是整個(gè)程序生存期的一部分。
MFC程序只會(huì )有一個(gè)CwinApp對象,而CwinApp派生自CwinThread,即產(chǎn)生了應用程序的主線(xiàn)程。每當需要一個(gè)額外的線(xiàn)程時(shí),應先產(chǎn)生一個(gè)CwinThread對象,再調用全局函數AfxBeginThread(),將線(xiàn)程產(chǎn)生出來(lái)。
對于輔助線(xiàn)程(worker thread),要為它準備一個(gè)線(xiàn)程函數,然后調用AfxBeginThread()。例如:CWinThread* pThread=AfxBeginThread(ThreadFunc,param);
UINT ThreadFunc(LPVOID pParam); //線(xiàn)程函數
對于用戶(hù)界面線(xiàn)程(UI thread),不能夠光由一個(gè)線(xiàn)程函數來(lái)代表,因為它要處理消息,它需要一個(gè)消息循環(huán)。應該先從CWinThread派生一個(gè)自己的類(lèi),再調用AfxBeginThread()產(chǎn)生一個(gè)CWinThread對象。具體程序見(jiàn)本刊網(wǎng)站(http://www.dpj.com.cn)。
結語(yǔ)
基于USB技術(shù)的實(shí)時(shí)數據采集系統,在編程上運用了多線(xiàn)程思想;從硬件和軟件兩方面錄求較佳的解決途徑,并將二者結合起來(lái),在實(shí)際中取得了良好的運行效果。
評論