在Windows2000下用多線(xiàn)程實(shí)現1394串行總線(xiàn)通信
作者Email: zhaoyn2001@163.net 摘 要:基于Windows2000環(huán)境開(kāi)發(fā)了1394主控機與1394設備機間進(jìn)行串行總線(xiàn)通信的軟硬件系統,其中采用了多線(xiàn)程技術(shù),并利用臨界區實(shí)現線(xiàn)程間共享資源的同步,從而有效地解決了串行通信中的實(shí)時(shí)響應問(wèn)題,降低了數據的丟失率,提高了系統的可靠性。 關(guān)鍵詞:多線(xiàn)程;1394總線(xiàn);線(xiàn)程同步 1 引言 為了便于LS-1394物理層、鏈路層芯片設計課題的研究,我們采用FPGA和ISA總線(xiàn)開(kāi)發(fā)了基于TI公司的TSB41AB3和TSB12LV01的ISA-1394的1394總線(xiàn)接口卡,并在Windows2000環(huán)境下開(kāi)發(fā)了一套利用多線(xiàn)程技術(shù)實(shí)現1394主控機與1394設備機之間進(jìn)行串行通信的軟件系統。 2 硬件部分 硬件部分主要包括:1394主控機、1394設備機、PCI-1394卡、ISA-1394卡。其中,PCI-1394卡是TI公司的1394總線(xiàn)接口芯片控制卡,該卡插在1394主控機的PCI插槽中;ISA-1394卡是利用一塊型號為EPM7256AETC144-5的FPGA、一塊TI公司的TSB12LV01鏈路層芯片和一塊TSB41AB3物理層芯片自行設計的1394總線(xiàn)接口芯片控制卡,該卡插在1394設備機的ISA插槽中。1394主控機和1394設備機之間通過(guò)1394接口進(jìn)行串行通信,傳輸介質(zhì)為1394線(xiàn)纜。硬件結構圖如圖1所示。 3 軟件部分 軟件設計主要包括1394主控機端和1394設備機端兩大部分,由于1394主控機端有現成的demo應用程序,所以軟件設計主要針對1394設備機端。1394設備機端的編程環(huán)境是WinDriver 5.0 和VC++6.0。 3.1軟件設計思想 1394串行總線(xiàn)有兩種通信方式:等時(shí)通信和異步通信。異步通信采用的是請求/應答模式,數據傳輸可靠性較高,因此這里主要討論異步通信。1394串行總線(xiàn)異步通信的原理為:發(fā)送數據包時(shí),等待發(fā)送器空閑,將數據包寫(xiě)到1394鏈路層芯片的發(fā)送FIFO中發(fā)送出去;接收數據包時(shí),一旦有數據包到達,接收器會(huì )將數據包放到1394鏈路層芯片的接收FIFO,接收到數據包后必須立即發(fā)送一個(gè)應答包,否則,對方會(huì )重發(fā)此數據包,直到重發(fā)次數到。需注意的是,用戶(hù)必須自行訪(fǎng)問(wèn)接收FIFO查看是否有數據包并及時(shí)地取出數據包,否則就會(huì )使接收FIFO溢出,丟失數據,造成通信出錯。 在串行通信程序設計中,通常采用定時(shí)查詢(xún)或中斷來(lái)解決上述問(wèn)題,其中采用中斷的方法比定時(shí)查詢(xún)法擁有更高的工作效率和可靠性,因此本系統采用中斷法來(lái)完成1394串行總線(xiàn)的數據通信。 為了實(shí)現數據處理和數據接收及發(fā)送的分離,本系統引入了多線(xiàn)程技術(shù)。在應用程序的主線(xiàn)程之外再創(chuàng )建一個(gè)用戶(hù)線(xiàn)程,即中斷處理線(xiàn)程,在中斷處理線(xiàn)程中實(shí)現數據包的接收和發(fā)送。如果接收中斷到來(lái),中斷處理線(xiàn)程就負責取出接收FIFO中的數據,放到用戶(hù)定義的接收緩沖區rBuf中;如果發(fā)送中斷到來(lái),中斷處理線(xiàn)程就負責從用戶(hù)定義的發(fā)送緩沖區sBuf中取出數據放到發(fā)送FIFO中發(fā)送出去。主線(xiàn)程負責調用解釋處理程序對rBuf中的數據包進(jìn)行解釋處理,或者調用其它程序給sBuf中寫(xiě)請求數據包。 由于多個(gè)線(xiàn)程可以訪(fǎng)問(wèn)同一進(jìn)程中的公共數據,所以使用多線(xiàn)程的過(guò)程中需要注意的問(wèn)題是如何防止兩個(gè)或兩個(gè)以上的線(xiàn)程同時(shí)訪(fǎng)問(wèn)同一個(gè)數據,以免破壞數據的完整性。在本系統中,當中斷處理線(xiàn)程從發(fā)送緩沖區sBuf取數據包,此時(shí)若有一個(gè)線(xiàn)程正給發(fā)送緩沖區sBuf寫(xiě)數據包,這樣就存在訪(fǎng)問(wèn)發(fā)送緩沖區sBuf資源的沖突,即所謂的線(xiàn)程不同步問(wèn)題。針對該問(wèn)題,系統中采用臨界區來(lái)加以解決。它可保證在某一個(gè)時(shí)間只有一個(gè)線(xiàn)程可以訪(fǎng)問(wèn)sBuf,通過(guò)在不同的線(xiàn)程中設置一個(gè)共享的臨界區對像,無(wú)論哪個(gè)線(xiàn)程占有臨界區對像,都可以訪(fǎng)問(wèn)受保護的sBuf,這時(shí)候其它的線(xiàn)程需要等待,直到該線(xiàn)程釋放臨界區對像為止。臨界區被釋放后,另外的線(xiàn)程可以強占這個(gè)臨界區,以便訪(fǎng)問(wèn)sBuf。 3.2軟件結構 基于多線(xiàn)程技術(shù)的1394串行總線(xiàn)通信系統軟件結構如圖2所示。 各模塊的功能如下: 1)主線(xiàn)程:響應用戶(hù)的輸入,提供前端的人機交互界面;完成線(xiàn)程的創(chuàng )建、終止及線(xiàn)程間的同步;接收線(xiàn)程發(fā)來(lái)的消息,并調用相應的線(xiàn)程處理程序; 2)中斷處理線(xiàn)程:當接收中斷到來(lái)時(shí),接收GRF中的數據包放到接收緩沖區rBuf,并向主線(xiàn)程發(fā)送接收到數據包的消息,當發(fā)送中斷到來(lái)時(shí),從發(fā)送緩沖區sBuf中取出數據包寫(xiě)到ATF中; 3)解釋處理程序:從接收緩沖區rBuf中取出數據包進(jìn)行解釋處理后放到dataBuf,并構造響應包放到發(fā)送緩沖區sBuf中; 4)初始化程序:初始化串口資源及程序設置; 5)其他程序:從數據緩沖區dataBuf中取數據進(jìn)行進(jìn)一步處理,或者給發(fā)送緩沖區sBuf中寫(xiě)請求數據包。 該軟件采用多線(xiàn)程技術(shù),使前端人機交互部分、中間處理部分和后臺的串口通信部分并行處理,讓耗時(shí)的I/O通信在后臺運行,在大數據量通信的情況下對改善程序的響應速度是相當有效的。 3.3程序內容 1394設備機端的程序主要由ISA接口卡的驅動(dòng)程序、初始化程序、中斷處理程序及解釋處理程序四大主要部分組成。 3.3.1驅動(dòng)程序 由于WinDriver具有強大的設備驅動(dòng)開(kāi)發(fā)能力,支持用戶(hù)模式下直接對硬件進(jìn)行訪(fǎng)問(wèn),并且WinDriver提供的驅動(dòng)程序開(kāi)發(fā)向導DriverWizard可以自動(dòng)生成驅動(dòng)程序框架,大大降低了設備驅動(dòng)程序的開(kāi)發(fā)難度,減少了開(kāi)發(fā)時(shí)間,所以ISA接口卡的驅動(dòng)程序在WinDriver下開(kāi)發(fā)。驅動(dòng)程序主要完成對ISA接口卡的I/O地址讀寫(xiě)及對硬件中斷的處理。該ISA卡的I/O端口地址為:0x300~0x510;中斷號為9。 3.3.2初始化程序 在開(kāi)始通信前,首先要對串口資源、鏈路層寄存器及程序設置進(jìn)行初始化,其中包括鏈路層寄存器初始化、打開(kāi)驅動(dòng)設備、打開(kāi)硬件中斷、定義臨界區對像及收發(fā)緩沖區等工作。 CCriticalSection m_cs; file://定義臨界區對像 鏈路層寄存器初始化是1394串行總線(xiàn)能正常工作的基礎,下圖是鏈路層寄存器初始化的流圖。復位中斷寄存器IntFlagReg,使其為零;寫(xiě)中斷屏蔽寄存器IntMaskReg,打開(kāi)中斷允許使能位、發(fā)送中斷位及接收中斷位;寫(xiě)FIFO控制寄存器FifoCtrlReg,清除接收和發(fā)送FIFO,并設置接收和發(fā)送FIFO的大??;寫(xiě)物理層芯片訪(fǎng)問(wèn)寄存器PhyAccessReg,初始化總線(xiàn)復位;寫(xiě)控制寄存器ControlReg,打開(kāi)發(fā)送,接收使能位等。 3.3.3中斷處理程序 InterruptHandle()是一個(gè)全局的中斷處理函數,它一直在等待硬件中斷,一旦有中斷到來(lái)就立即響應。具體形式如下: UINT InterruptHandle (LPVOID wParam) 3.3.4 解釋處理程序 解釋處理程序實(shí)際上是用戶(hù)自定義的一個(gè)消息處理函數,它一直在等待中斷處理程序發(fā)來(lái)的接收到數據包的消息。如果有消息到達,就從rBuf中取出數據包進(jìn)行解釋。如果是自標識包,將接收到的數據放到自標識緩沖區SelfIDbuf中;如果是讀請求包,從dataBuf中取出數據,并根據讀請求數據包的包頭構造相應的讀響應包放到sBuf中;如果是寫(xiě)請求包,從rBuf中取出數據部分放到數據緩沖區dataBuf中等待做進(jìn)一步的處理,并根據寫(xiě)請求數據包的包頭構造相應的寫(xiě)響應包放到sBuf中。 4 結束語(yǔ) 本文針對實(shí)際應用中對1394串行總線(xiàn)通信實(shí)時(shí)性和可靠性的要求 ,采用中斷的方法來(lái)接收和發(fā)送數據,并提出了在Windows2000下運用多線(xiàn)程技術(shù)來(lái)實(shí)現1394串行總線(xiàn)異步通信的方法,有效的解決了在串口通信中出現的數據丟失和不穩定問(wèn)題,提高了系統的執行效率和資源的利用率,實(shí)踐證明這是一種有效的途徑。 |
評論