• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      隨鉆聲波測(cè)井儀維護(hù)系統(tǒng)軟件設(shè)計(jì)

      2012-08-09 08:04:00師奕兵
      中國(guó)測(cè)試 2012年1期
      關(guān)鍵詞:驅(qū)動(dòng)程序端點(diǎn)串口

      陳 鵬,師奕兵,張 偉

      (電子科技大學(xué)自動(dòng)化工程學(xué)院,四川 成都 611731)

      0引言

      隨鉆聲波測(cè)井的數(shù)據(jù)量非常大,受到隨鉆測(cè)井傳輸速率的限制,大量的測(cè)井?dāng)?shù)據(jù)不能實(shí)時(shí)傳輸?shù)降孛嫦到y(tǒng),必須存儲(chǔ)在井下儀器的存儲(chǔ)電路中,待儀器工作起鉆后,再由上位機(jī)讀取[1]。井下儀器工作環(huán)境異常惡劣,對(duì)井下電路必須進(jìn)行橡膠封裝以增強(qiáng)其抗震性能,這導(dǎo)致儀器的拆卸比較困難。為了便于測(cè)井?dāng)?shù)據(jù)的讀取以及對(duì)井下電路程序的在線升級(jí)更新,設(shè)計(jì)了隨鉆聲波測(cè)井儀維護(hù)系統(tǒng)。該系統(tǒng)通過串口和井下儀器進(jìn)行通信,并通過USB或者網(wǎng)線和上位機(jī)進(jìn)行通信,同時(shí)上位機(jī)能夠?qū)聝x器進(jìn)行維護(hù)和程序更新。USB具有速度高、成本低、功耗低、使用方便、支持即插即用等優(yōu)點(diǎn);以太網(wǎng)又可以做到遠(yuǎn)程快速故障分析與處理、設(shè)備的遠(yuǎn)程維護(hù)和數(shù)據(jù)的遠(yuǎn)程傳輸,可以提高工作效率并降低整體成本。

      1 系統(tǒng)總體框圖

      維護(hù)系統(tǒng)與上位機(jī)和井下裝置的連接示意圖如圖1所示。

      隨鉆聲波測(cè)井儀維護(hù)系統(tǒng)的應(yīng)用程序主要采用Qt進(jìn)行開發(fā),應(yīng)用程序主要實(shí)現(xiàn)兩部分功能:

      圖1 系統(tǒng)連接示意圖

      (1)實(shí)現(xiàn)與井下儀器的數(shù)據(jù)通信;

      (2)實(shí)現(xiàn)與上位機(jī)數(shù)據(jù)通信并響應(yīng)上位機(jī)命令。

      2 Qt程序設(shè)計(jì)

      系統(tǒng)軟件采用Qt Creator進(jìn)行開發(fā),Qt Creator是用于Qt開發(fā)的輕量級(jí)跨平臺(tái)集成開發(fā)環(huán)境,它提供一個(gè)專為支持跨平臺(tái)開發(fā)而設(shè)計(jì)的集成開發(fā)環(huán)境(IDE)。

      Qt最獨(dú)特之處在于它的“信號(hào)與槽”機(jī)制[2],簡(jiǎn)言之,“信號(hào)與槽”機(jī)制就是將一個(gè)窗體里面發(fā)生的某一個(gè)事件所產(chǎn)生的信號(hào)與工程中任何一個(gè)窗體里面的任何一個(gè)預(yù)定義的或者程序員自定義的槽函數(shù)進(jìn)行關(guān)聯(lián),關(guān)聯(lián)方法為:

      QObject::connect(signalemitter,SIGNAL(),signalreceiver,SLOT());

      編譯應(yīng)用程序時(shí)應(yīng)使用配置好的Qt-Embeded-Linux交叉編譯環(huán)境進(jìn)行編譯,生成一個(gè)二進(jìn)制可執(zhí)行程序文件,用NFS加載文件系統(tǒng)的方法啟動(dòng)開發(fā)板,然后將Qt的庫(kù)文件復(fù)制到維護(hù)裝置的/lib/文件系統(tǒng)目錄下,再拷貝二進(jìn)制可執(zhí)行程序文件到NFS共享目錄的文件系統(tǒng)中,即可使用命令形式啟動(dòng)程序。

      3 USB從設(shè)備驅(qū)動(dòng)程序

      USB(通用串行總線)的結(jié)構(gòu)等在很多文獻(xiàn)中已有提及,該文主要涉及到USB從設(shè)備驅(qū)動(dòng)程序的開發(fā)。

      系統(tǒng)是建立在Linux操作系統(tǒng)上的USB從設(shè)備,一方面需要遵循Linux設(shè)備驅(qū)動(dòng)程序模型,另一方面需要配合USB Gadget設(shè)備規(guī)范。

      USB從設(shè)備驅(qū)動(dòng)程序分為3個(gè)層次,USB從設(shè)備驅(qū)動(dòng)程序體系圖如圖2所示,從底層向上分別是設(shè)備控制器(UDC)驅(qū)動(dòng)程序?qū)印adget API和Gadget驅(qū)動(dòng)程序?qū)覽3]。

      設(shè)備控制器驅(qū)動(dòng)程序?qū)又苯雍陀布ㄐ?,不同的設(shè)備控制器硬件有不同的設(shè)備控制器驅(qū)動(dòng)程序。Gadget API是對(duì)硬件控制的抽象層,是Gadget驅(qū)動(dòng)程序的編程接口,它將Gadget驅(qū)動(dòng)程序的控制傳遞給具體的設(shè)備控制器硬件驅(qū)動(dòng)程序。

      圖2 USB從設(shè)備驅(qū)動(dòng)程序?qū)哟螆D

      系統(tǒng)采用三星公司的s3c2440芯片,其中集成了USB從設(shè)備控制器,通過對(duì)Gadget驅(qū)動(dòng)程序進(jìn)行編寫并通過USB從設(shè)備控制器與USB主機(jī)連接,實(shí)現(xiàn)設(shè)備功能。

      在驅(qū)動(dòng)程序激活之前需要對(duì)各個(gè)端點(diǎn)進(jìn)行配置[4],在用戶空間端點(diǎn)初始化的方法為:

      fd=open(“/dev/gadget/$ENDPOINT”,0_RDWR);

      status=write(fd,descriptors,sizeof(descriptors));

      此處的write函數(shù)通過調(diào)用文件操作函數(shù)集ep_config_operations中的ep_config函數(shù)建立端點(diǎn)配置。函數(shù)主要功能是使控制器端點(diǎn)有合適的最大包尺寸等配置,以分別適應(yīng)批量、中斷、同步傳輸?shù)膫鬏敯蟆?/p>

      端點(diǎn)配置完成后,即可通過端點(diǎn)文件的文件操作函數(shù)集file_operations來對(duì)端點(diǎn)進(jìn)行控制實(shí)現(xiàn)數(shù)據(jù)的傳輸操作,其中主要用到的重點(diǎn)函數(shù)有read、write、ioctl、release等,在實(shí)現(xiàn)時(shí)將這些函數(shù)分別實(shí)例化為ep_read、ep_write等。

      其中ep_read和ep_write函數(shù)實(shí)現(xiàn)端點(diǎn)數(shù)據(jù)與用戶空間數(shù)據(jù)之間的傳輸,ioctl函數(shù)實(shí)現(xiàn)端點(diǎn)的各種控制操作。

      在USB的傳輸方式中,批量傳輸可以保證數(shù)據(jù)的可靠性,當(dāng)出現(xiàn)錯(cuò)誤時(shí),會(huì)要求發(fā)送方重發(fā)[5]。因而為了保證測(cè)井?dāng)?shù)據(jù)傳輸?shù)臏?zhǔn)確性,采用批量傳輸方式。

      端點(diǎn)寫操作函數(shù)ep_write的主體是USB從設(shè)備,將USB從設(shè)備的用戶空間的數(shù)據(jù)通過端點(diǎn)傳給USB主設(shè)備,ep_write用于處理一個(gè)bulk批量傳輸,函數(shù)聲明如下:

      static ssize_t ep_write(struct file*fd,const char_user*buf,size_t len,loff_t*ptr)

      函數(shù)實(shí)現(xiàn)中主要涉及參數(shù)的初始化以及內(nèi)核空間的分配等工作,在write函數(shù)中調(diào)用ep_io()函數(shù)。此處的ep_io調(diào)用Gadget API函數(shù)usb_ep_queue()將讀寫請(qǐng)求放到端點(diǎn)上進(jìn)行排隊(duì),在端點(diǎn)上進(jìn)行數(shù)據(jù)的發(fā)送和接收。

      s3c2440芯片包含了5個(gè)終端,其中包括一個(gè)控制端點(diǎn)即端點(diǎn)0和4個(gè)數(shù)據(jù)端點(diǎn),控制端點(diǎn)的FIFO最大為16Byte,數(shù)據(jù)端點(diǎn)的FIFO最大為64Byte。端點(diǎn)進(jìn)行寫操作時(shí),大于64Byte的數(shù)據(jù)都分包發(fā)送,發(fā)送時(shí)先將發(fā)送寄存器設(shè)為只發(fā)狀態(tài),向端點(diǎn)對(duì)應(yīng)的FIFO中不斷寫入64 Byte的數(shù)據(jù)包,發(fā)送完成后即將發(fā)送寄存器恢復(fù)為可用狀態(tài)。

      端點(diǎn)讀操作函數(shù)ep_read和ep_write有類似的操作,只是數(shù)據(jù)操作方向相反。在端點(diǎn)進(jìn)行讀操作時(shí),先通過ep_read函數(shù)中傳入的用戶空間接收數(shù)據(jù)的地址,一直等待數(shù)據(jù)接收,接收完成后便喚醒等待,重新進(jìn)入可用狀態(tài)。

      4 基于Linux的網(wǎng)絡(luò)編程

      測(cè)井儀維護(hù)系統(tǒng)與PC通過網(wǎng)絡(luò)連接時(shí),使用socket套接字編程,系統(tǒng)將作為服務(wù)器端,PC將作為客戶端進(jìn)行通信。

      系統(tǒng)中要求測(cè)井?dāng)?shù)據(jù)的傳輸準(zhǔn)確無誤,所以選用TCP/IP協(xié)議族傳輸層上的TCP協(xié)議。相對(duì)于UDP協(xié)議,TCP為應(yīng)用程序提供可靠的通信連接,通過各種機(jī)制來減少錯(cuò)誤發(fā)生的概率[6],可靠性比較高。使用基于TCP協(xié)議的流式socket(SOCK_STREAM)進(jìn)行網(wǎng)絡(luò)編程,保證了測(cè)井?dāng)?shù)據(jù)傳輸?shù)恼_性和順序性。

      網(wǎng)絡(luò)通信的程序流程圖如圖3所示。

      首先,建立自己的套接口:

      s=socket(AF_INET,SOCK_STREAM,0)

      該函數(shù)建立指定地址格式、數(shù)據(jù)類型和協(xié)議下的套接口。

      bind(s,(struct sockaddr*)&server,sizeof(server))

      該函數(shù)將建立服務(wù)器本地的半相關(guān),其中,server是sockaddr_in結(jié)構(gòu),其成員描述了本地端口號(hào)和本地主機(jī)地址,經(jīng)過bind()將服務(wù)器進(jìn)程在網(wǎng)絡(luò)上標(biāo)識(shí)出來。

      然后建立連接。首先調(diào)用listen()函數(shù)表示開始監(jiān)聽,再通過accept()調(diào)用等待接收連接。

      ns=accept(s,(struct sockaddr*)&client,&namelen))

      圖3 網(wǎng)絡(luò)通信服務(wù)器端流程圖

      accept()阻塞等待請(qǐng)求隊(duì)列中的請(qǐng)求,一旦有連接請(qǐng)求,該函數(shù)就建立一個(gè)和s有相同屬性的新的套接口。

      接下來,就可以按照以下格式接收和發(fā)送數(shù)據(jù)了。

      recv(ns,buf,1024,0)

      send(ns,buf,pktlen,0)

      recv從ns(建立連接的套接口)接收數(shù)據(jù)放入buf中,send則將buf中的數(shù)據(jù)發(fā)送給ns。

      最后,調(diào)用close()關(guān)閉套接口。

      5 串口通信

      在該設(shè)計(jì)中,UART口與井下儀器電路板的SCI口相連,讀取井下儀器的測(cè)井?dāng)?shù)據(jù),將數(shù)據(jù)讀入緩存。在Linux系統(tǒng)中,串口屬于字符型設(shè)備,位于“/dev”目錄下,設(shè)備名分別為“/dev/ttyS0”,“/dev/ttyS1”,“/dev/ttyS2”。在Linux下對(duì)設(shè)備的操作方法與對(duì)文件的操作方法是一樣的,對(duì)串口的讀寫可以使用簡(jiǎn)單的 open()、read()和 write()函數(shù)來完成,但是對(duì)串口的其他參數(shù)需要另作配置[7]。對(duì)struct termios結(jié)構(gòu)體的各成員值進(jìn)行設(shè)置,波特率設(shè)置為115.2kb/s,傳輸協(xié)議為:1個(gè)起始位+8個(gè)數(shù)據(jù)位+1個(gè)停止位,無奇偶校驗(yàn)位。

      6 系統(tǒng)工作流程

      應(yīng)用程序工作流程圖如圖4所示。維護(hù)系統(tǒng)接收上位機(jī)傳送過來的命令并將命令傳給井下儀器。

      命令分為以下兩種:

      (1)讀取數(shù)據(jù);

      (2)井下儀器在線升級(jí)。

      6.1 上位機(jī)讀取數(shù)據(jù)

      井下儀器在接收到維護(hù)系統(tǒng)通過串口發(fā)送的數(shù)據(jù)傳輸命令后,就開始將存儲(chǔ)在存儲(chǔ)器中的測(cè)井?dāng)?shù)據(jù)通過SCI上傳。維護(hù)系統(tǒng)用串口讀取到數(shù)據(jù)后,經(jīng)過串口接收單元把串口幀還原出數(shù)據(jù),存儲(chǔ)到數(shù)據(jù)緩沖區(qū),然后讀取數(shù)據(jù)緩沖區(qū)的數(shù)據(jù),經(jīng)過USB口或網(wǎng)口發(fā)送至上位機(jī)。

      6.2 井下儀器在線升級(jí)

      PC可以通過維護(hù)系統(tǒng)直接對(duì)井下儀器進(jìn)行必要的維護(hù),實(shí)現(xiàn)對(duì)CPLD的快速在線配置,并使用串口模擬JTAG口燒寫DSP程序。

      6.2.1 配置CPLD

      基于ARM的嵌入式Linux中對(duì)CPLD進(jìn)行JTAG配置,必須使用.jam或者.jbc格式的配置文件和標(biāo)準(zhǔn)測(cè)試與編程語言(Standard Test And Programming Language,STAPL)標(biāo)準(zhǔn)。由于用 Altera 公司的QuartusⅡ集成開發(fā)環(huán)境生成配置文件,默認(rèn)產(chǎn)生.sol和.pof格式的配置文件,必須進(jìn)行必要的轉(zhuǎn)換。

      Jam STAPI是Altera公司提供的支持STAPL的套件。使Jam STAPI進(jìn)行配置包含兩部分,Jam Player(Jam解釋器或者稱為Jam虛擬機(jī))和Jam配置文件。Jam Player運(yùn)行在微處理器中,讀取Jam文件并解析Jam文件表達(dá)的內(nèi)容,在JTAG接口上產(chǎn)生用于配置的二進(jìn)制數(shù)據(jù)流并讀取反饋數(shù)據(jù)。

      Altera公司提供的Jam Player源程序文件包含了DOS、Windows和Unix 3種平臺(tái)的代碼。在類似Unix的Linux平臺(tái)中使用,必須進(jìn)行定制和移植。

      將Jam Player移植到嵌入式Linux中,主要進(jìn)行下列的定制:

      (1)更改平臺(tái)預(yù)定義環(huán)境,添加預(yù)處理語句,去除不必要的源代碼;

      (2)將JTAG信號(hào)映射到具體硬件引腳;

      (3)定制錯(cuò)誤信息輸出方式;

      (4)根據(jù)具體微處理器的處理能力,定制延時(shí)函數(shù)。

      6.2.2 燒寫DSP

      井下儀器電路部分的DSP采用的是TI公司的TMS320F28335,傳統(tǒng)方式是基于JTAG的燒寫技術(shù),但在隨鉆聲波測(cè)井儀中,欲使用JTAG接口則需對(duì)測(cè)井儀進(jìn)行拆卸,難以實(shí)現(xiàn)在線燒寫。所以在此處利用該系統(tǒng)通過串口燒寫技術(shù)來實(shí)現(xiàn)DSP的程序更新[8-9]。

      DSP程序更新示意圖如圖5所示。

      圖4 應(yīng)用程序流程圖

      圖5 DSP程序更新示意圖

      遠(yuǎn)程燒寫的過程分為以下3個(gè)步驟:

      (1)上位機(jī)軟件端將CCS開發(fā)環(huán)境中的通用目標(biāo)文件(COFF文件)轉(zhuǎn)化為測(cè)井儀升級(jí)系統(tǒng)特定格式的二進(jìn)制文件(BIN文件)。

      (2)測(cè)井儀維護(hù)系統(tǒng)將二進(jìn)制文件下發(fā)至測(cè)井儀,這個(gè)過程等同于維護(hù)系統(tǒng)向測(cè)井儀發(fā)送采集命令和采集參數(shù)。

      (3)測(cè)井儀中由CPLD實(shí)現(xiàn)的中控模塊對(duì)傳輸來的二進(jìn)制文件進(jìn)行變壓耦合、解碼并緩存到FIFO中,DSP讀取FIFO中的數(shù)據(jù)并存到外部RAM內(nèi),底層軟件負(fù)責(zé)控制Flash的燒寫,完成更新。

      7 結(jié)束語

      隨鉆聲波測(cè)井儀在井下采集的測(cè)井?dāng)?shù)據(jù)數(shù)據(jù)量大,數(shù)據(jù)結(jié)構(gòu)復(fù)雜,通過USB或者網(wǎng)線進(jìn)行數(shù)據(jù)傳輸將大大提高傳輸速度以及傳輸?shù)臏?zhǔn)確性,確保井下數(shù)據(jù)的不失真回顯。隨鉆測(cè)井儀的維護(hù)問題一直是困擾測(cè)井相關(guān)項(xiàng)目的難題,該文提出采用維護(hù)系統(tǒng)利用單一的串口線對(duì)井下儀器進(jìn)行數(shù)據(jù)傳輸和在線升級(jí),避免了對(duì)井下儀器的拆卸,直接在上位機(jī)端進(jìn)行必要的操作就可以完成數(shù)據(jù)的傳輸以及系統(tǒng)的在線升級(jí)等維護(hù)工作,極大地提高了測(cè)井儀維護(hù)人員的工作效率,在實(shí)際應(yīng)用中具有較高的現(xiàn)實(shí)意義和應(yīng)用前景。

      [1]肖紅兵,鞠曉東,楊錦舟.隨鉆聲波測(cè)井?dāng)?shù)據(jù)存儲(chǔ)技術(shù)研究[J].科學(xué)技術(shù)工程,2009,6(9):3065-3068.

      [2] 成潔,盧紫毅.Linux窗口程序設(shè)計(jì)-Qt4精彩實(shí)例分析[M].北京:清華大學(xué)出版社,2008.

      [3] 閆婷婷,龍卓群.基于Linux的USB從設(shè)備驅(qū)動(dòng)研究[J].電子元器件應(yīng)用,2009,11(10):55-57.

      [4] Linux內(nèi)核USB從設(shè)備驅(qū)動(dòng)程序-shangshuwu[DB/OL].[2010-11-20].http://www.shangshuwu.cn/index.php/.

      [5] 李俊.嵌入式Linux設(shè)備驅(qū)動(dòng)開發(fā)詳解[M].北京:人民郵電出版社,2008.

      [6] Donahoo M J,Calvert K L,陳宗斌,等.TCP/IP Sockets編程:C語言實(shí)現(xiàn)[M].2版.北京:清華大學(xué)出版社,2009.

      [7] 華清遠(yuǎn)見嵌入式培訓(xùn)中心.嵌入式Linux應(yīng)用程序開發(fā)標(biāo)準(zhǔn)教程[M].北京:人民郵電出版社,2009.

      [8] 韓紅霞,耿愛輝.DSP外部Flash燒寫的兩種方法[J].微計(jì)算機(jī)信息,2009,23(2):170-171.

      [9] 孫秋生,陳尚峰.基于CCS的DSP片外Flash直接燒寫設(shè)計(jì)[J].電子設(shè)計(jì)工程,2009,17(1):93-95.

      猜你喜歡
      驅(qū)動(dòng)程序端點(diǎn)串口
      非特征端點(diǎn)條件下PM函數(shù)的迭代根
      淺談AB PLC串口跟RFID傳感器的通訊應(yīng)用
      不等式求解過程中端點(diǎn)的確定
      參數(shù)型Marcinkiewicz積分算子及其交換子的加權(quán)端點(diǎn)估計(jì)
      USB接口的多串口數(shù)據(jù)并行接收方法探索
      基丁能雖匹配延拓法LMD端點(diǎn)效應(yīng)處理
      基于藍(lán)牙串口適配器的GPS接收機(jī)與AutoCAD的實(shí)時(shí)無線通信
      基于并行控制的FPGA多串口拓展實(shí)現(xiàn)
      驅(qū)動(dòng)程序更新與推薦
      驅(qū)動(dòng)程序更新與推薦
      永平县| 集安市| 措勤县| 堆龙德庆县| 崇义县| 康马县| 南和县| 全南县| 宝应县| 巧家县| 台东县| 库车县| 民乐县| 耿马| 精河县| 普兰县| 南康市| 栾川县| 大冶市| 凤庆县| 屏山县| 仁化县| 阿图什市| 石阡县| 德庆县| 自贡市| 信阳市| 成都市| 会昌县| 哈尔滨市| 囊谦县| 平顶山市| 曲麻莱县| 依兰县| 区。| 木兰县| 团风县| 厦门市| 吴忠市| 呼伦贝尔市| 瓮安县|