美章網 資料文庫 LXI和GPIB編程儀器通用接口設計范文

    LXI和GPIB編程儀器通用接口設計范文

    本站小編為你精心準備了LXI和GPIB編程儀器通用接口設計參考范文,愿這些范文能點燃您思維的火花,激發您的寫作靈感。歡迎深入閱讀并收藏。

    LXI和GPIB編程儀器通用接口設計

    摘要:如果開發出可編程臺式儀器通用接口模塊,那么只要更換儀器功能模塊便可迅速實現各類可編程臺式儀器。目前LXIGPIB是這類儀器常用接口,且兩種接口各有優勢,鑒于此,本文應用嵌入式系統開發了具有LXI和GPIB的可編程臺式儀器通用接口模塊。介紹了其總體設計方案;移植了boa服務器,實現了LXI總線的Web接口;給出了Linux下GPIB驅動開發方法,其中在中斷服務中提出了頂半部底半部設計思想,引入了非原子隊列實現底半部,提高了驅動運行效率。結合儀器功能模塊進行了測試,此接口模塊工作正常,具有較高的工程應用價值。

    關鍵詞:通用接口;LXI;GPIB;TNT48820

    引言

    如果在研發可編程臺式儀器方面借鑒模塊化儀器思路,將總線接口功能獨立出來,做成通用接口模塊,然后結合儀器功能模塊實現產品,這樣就能縮短研發周期,降低研發成本,同時也方便對儀器進行升級。LXI是LAN面向儀器的擴展總線,此時儀器可以認為是物聯網,此接口模塊又具有GPIB接口,所以一般利用嵌入式系統來滿足多接口多用戶的需求。本文提出了利用S5P4418處理器結合Linux的嵌入式系統來開發通用接口模塊的技術方案。由于boa是小巧高效的Web服務器,支持CGI(Com-monGatewayInterface)并且對Linux兼容性很好,因此通過移植boa來實現LXI協議規定的Web接口,為了能夠實現Linux下GPIB驅動,給出了開發方法。但有了操作系統就會存在系統中斷信號、進程間分配調度等情況,這樣就帶來了儀器監聽命令實時性有時降低的問題,所以在GPIB中斷服務中提出了頂半部底半部設計思想,引入了非原子隊列實現底半部,增加了驅動運行效率,監聽命令實時性有時降低的情況得到了一定改善。

    1通用接口模塊總體設計

    具有LXI和GPIB的可編程臺式儀器接口模塊硬件系統除了要有LAN接口和GPIB接口外,還要有儀器復位按鈕、儀器狀態指示燈,為此采用嵌入式系統進行構建,具體硬件原理[1]框圖如圖1所示。三星公司的S5P4418基于ARMCortex-A9、主頻為1.4GHz,內部集成了4GB/8GB/16GB的EMMC、SDRAM控制器,支持RTL8211E千兆以太網控制器,擁有5通道UART、4通道DMA、USB主機接口和設備接口及24路外部中斷源。綜合考慮功能和性能需求、成本、功耗等因素,選擇S5P4418作為嵌入式MCU。對于GPIB接口,需要外加一塊GPIB控制器芯片,NI公司提供的TNT4882芯片是一款高速且聽講功能兼備的GPIB接口專用芯片,因此GPIB控制器選擇了TNT4882芯片。圖2接口模塊軟件原理框圖接口模塊軟件系統如圖2所示。由于boa[2]是一個成熟的嵌入式Web服務器,能夠高效依次完成用戶的請求,最為關鍵的是boa支持CGI[3];CGI是一種Web服務器用戶接口規范,是運行在Web服務器上的一段程序,它能夠實現Web服務器與底層操作系統交互,從而可以實現網絡配置[4],因此利用boa實現Web接口。對于GPIB通信,需要開發出Linux下GPIB驅動程序,主要包括初始化函數、中斷處理函數、讀寫操作函數。

    2接口的實現

    Web服務器利用boa來實現,但由于通用接口模塊的平臺是基于Linux操作系統和ARM9處理器,所以要對其進行移植。具體方法如下:自帶的makefile文件是針對一般環境,需要對其進行修改,找到CC=gcc,將其改成CC=arm-linux-gcc,再找到CPP=gcc–E,將其改成CPP=arm-linux-gcc-E。這樣是為了把編譯器指定為Linux和ARM處理器平臺下的,最后在終端的目錄src下輸入make命令,并輸入arm-linux-stripboa剝去調試信息,生成boa執行文件。在配置文件boa.conf中將bind調用的IP地址綁定到INAD-DR_ANY;Usernobody修改為User0,Groupno-group修改為Group0,需建立/var/log/boa目錄,UseLocaltime使用本地時間,ServerName為服務器名字,此參數必須賦值,DocumentRoot需要設置成自己的HT-ML文檔的主目錄;DirectoryIndex為HTML目錄索引的文件名,一般寫index.html。如果DirectoryIndex不存在,該目錄必須是boa能讀寫,一般填/var/spool/boa/dircache,KeepAliveTimeout為HTTP持續作用中服務器在兩次請求之間等待的時間數,超時將關閉連接,可以根據自身需求設定;需要指明mime.types文件位置;CGI-Path〈string〉提供CGI程序的PATH環境變量值,可寫/bin:/usr/bin:/usr/local/bin;ScriptAlias〈/cgi-bin/〉非常重要,指明CGI腳本的虛擬路徑對應的實際路徑。

    3Linux下GPIB驅動開發

    3.1初始化函數設計

    初始化函數需要完成向內核注冊GPIB驅動[5]、GPIB控制器的寄存器硬地址映射[6]到內存、啟動TNT4882[7]芯片工作,要對實現讀寫互斥的信號量和實現阻塞的等待隊列進行初始化。由于在中斷處理函數中引入了非原子隊列,在這里也需進行初始配置。具體開發方法如下:向內核注冊GPIB驅動直接調用內核提供的register_chrdev函數;映射是通過調用內核函數ioremap來實現的,此函數第一個參數需要設置為TNT4882芯片的首地址,TNT4882芯片的首地址由硬件設計的片選信號線決定,函數返回內存映射首地址,因為芯片手冊給出了每個寄存器的偏移量,這樣TNT4882的首地址加上偏移量就可以得到每個寄存器在內存的地址,然后就可以對TNT4882芯片使能。具體流程為:將TNT4882芯片中的Turbo電路復位,并將TNT4882設置成Turbo+7210式,同時設置成單芯片模式,使能Local_PowerOn信號,設置TNT4882的GPIB主地址,將副地址取消以及對GPIB握手參數進行配置開始GPIB操作,讀寫操作可能會同時訪問同一資源,這種情況就變成了臨界區,會產生競態,導致系統內核的崩潰,信號量就是產生互斥的機制,信號量在使用前要對其進行初使化,通過調用內核函數init_MUTEX完成;對于中斷響應,如果任務需要耗時比較長,可以把中斷處理分割為頂半部和底半部,頂半部只用來響應中斷,從而快速完成中斷響應,而底半部單獨進行任務的處理,非原子隊列開辟內核進程還支持休眠,底半部利用非原子隊列處理任務,這樣使中斷處理部分變成內核進程,可以和用戶態進程同時執行,從而提高驅動效率,使用前,它通過調用init_WORK函數完成初始化;阻塞可以讓進程睡眠,進程在運行時如果需要等待另一個事件來到才能繼續運行,這種情況可以用阻塞來使進程睡眠,由于應用層的進程需要等待數據來到才能繼續處理,所以在內核的讀函數里需要添加阻塞,內核提供了等待隊列機制,使用前調用內核函數init_waitqueue_head進行初始化。圖3中斷函數流程圖

    3.2中斷服務設計

    GPIB主設備發來注意命令(ATN),TNT4882產生中斷,在GPIB接口處是已遠控使能(REN)和聽者作用狀態(LACS),那么GPIB接口就準備接收數據。如果GPIB接口處是已遠控使能和講者作用狀態(TACS),那么GPIB接口就可以發送數據。中斷函數流程圖如圖3所示,具體開發方法如下:request_irq[8]函數是Linux字符設備驅動中斷注冊接口,利用此函數將中斷服務注冊到內核里,中斷號配置成硬件原理圖占用中斷向量表的中斷號,將參數*device獲取的GPIB設備名記錄在/proc/inter_rupts文件中,分割中斷,利用中斷響應屬性flags將中斷底半部分割運行,把TNT4882中斷使能寄存器中有關的ATN、REN、LACS、TACS利用內核函數iowrite8全部使能,在中斷服務程序中,讀TNT4882中斷響應信息寄存器的信息,出現與LACS相同的值后,調用收操作,出現與TACS一致的值,調用發操作。對于收操作和發操作,自定義了兩個函數(shortRe-ceive(void)和shortSend(void))來實現,在接收操作方面,因TNT4882的FIFO為16字節深,不僅提供了它的全滿標志位,而且還提供了半滿標志位,本設計中沒有使用傳統的全滿位作判斷位,而是利用了FIFO半滿位。好處是,FIFO中數據取到內核緩沖區和FIFO繼續接收數據可以同時進行,如果用全滿位,則只有滿了將數據取走后,有了空間FIFO才能收數據,因此這樣可以提高數據接收速率。Receive函數實現具體是:在傳輸寄存器里配置傳輸參數,完成設置后,再用ioread8函數讀取該寄存器傳輸準備位,傳輸就緒后,最后使能傳輸工作位;設置收到字符計數變量,判斷中斷使能寄存器的聽狀態位,出現聽狀態以及FIFO已經超過了半滿,然后循環從FIFO中取數,聽狀態結束,FIFO中還存在數據,用ioread8函數將數據全部接收,結束收流程。在發送操作方面,它不像收操作直接調用Receive函數,而是間接調用。通過調用非原子隊列來調用發函數,這樣隊列和用戶態的進程可同時運行,從而使驅動開銷時間減少,提高了運行效率。用creat_workque創建隊列,將該創建的隊列賦給queue_work函數第一個參數,將Send函數指針賦給queue_work函數第二個參數,從而將Send函數插入隊列,并將workque_struct類型的結構體變量中的屬性成員配置成非原子操作,中斷服務程序運行到queue_work接口處,內核將自動開辟進程執行Send函數。Send函數實現具體是:進行傳輸初始化,初始化過程與Receive函數一樣,設置要傳輸字符計數變量,讀取FIFO狀態寄存器,判斷是否FIFO為滿,不為滿時往里面循環傳輸數據,直到計數變量到達此次發送字符數,退出發送操作,在發送完畢后一定要對開辟線程做結束處理,通過調用內核函數destroy_workqueue完成。

    3.3設備文件操作—讀寫函數設計

    read和write是Linux字符設備驅動標準接口,其完成用戶態和內核態數據交互,在read和write里分別調用內核的copy_to_user和copy_from_user函數來實現。對于讀寫操作,需要實現互斥,這里采用Linux內核機制信號量來完成。具體實現方法是:設置一個驅動全局變量為信號量,通過內核宏MUTEX將初始值置為1,在read和write的入口處[9]調用內核函數down,將信號量的值變0,結束處調用up函數再使信號量的值恢復。這樣讀寫操作有一個操作進入了臨界區,取走了信號量,類似上了鎖,另一個操作將無法訪問,只有一個操作完成,還了信號量,另一個操作才能訪問臨界區,從而實現了互斥。除此之外,為了實現應用程序在數據沒有到來的時候能夠被掛起,內核的讀函數還要實現阻塞。具體實現的思路是:在讀函數里的開始處可以通過調用wait_event_in-terruptible函數來使讀函數進入睡眠狀態,但要注意wait_event_interruptible要放到down函數前面,否則會產生死鎖,在GPIB中斷函數是已遠控使能和聽者作用狀態結束處通過wake_up_interruptible函數來喚醒睡眠狀態,這樣就實現了讀阻塞。

    4測試與驗證

    接口模塊上電開機,把描述儀器信息的HTML文檔放置到Web服務器的主目錄下,在上位機IE瀏覽器輸入接口模塊的IP地址192.168.0.224,便可訪問到儀器信息,如圖4所示,測試表明Web服務器工作正常。對于GPIB驅動器的測試,接口模塊結合上儀器模塊,在上位機打開GPIB調試軟件GPIB資源管理器和網口調試軟件SOCKET通信助手,通過以上兩個應用程序向儀器發送命令,從圖5中可以看到命令結果正常返回,說明GPIB驅動工作正常。

    5結語

    為了能夠快速實現各類可編程臺式儀器,利用S5P4418處理器和Linux開發出了具有LXI和GPIB的可編程臺式儀器通用接口模塊。通過移植boa實現了Web接口,并對Linux下GPIB驅動和可編程儀器命令通用解析服務器進行了開發,最終實現了該通用接口模塊。但發現儀器具有操作系統后,帶來了監聽命令實時性有時降低的情況,為了改善這種情況,將GPIB中斷服務分割成頂半部底半部,底半部引入非原子隊列來實現,從而提高驅動運行效率。最后結合儀器功能模塊進行了測試,該通用接口模塊工作正常,達到了預期的工程目標。

    作者:趙昕 郭恩全 朱健 單位:中國船舶集團公司第705研究所 陜西海泰電子有限責任公司

    主站蜘蛛池模板: 国产视频福利一区| 亚洲中文字幕丝袜制服一区| 制服丝袜一区二区三区| 亚洲综合色自拍一区| 久久福利一区二区| 国产内射999视频一区| 中文字幕在线看视频一区二区三区| 亚洲色精品aⅴ一区区三区| 久久婷婷色一区二区三区| 色窝窝无码一区二区三区 | 国产一区二区三区小说| 国产精品熟女视频一区二区| 日韩AV无码一区二区三区不卡| 日本一区二区三区精品国产| 国产剧情国产精品一区| 国产福利日本一区二区三区| 国产乱码精品一区三上| 久久国产免费一区| 丰满岳乱妇一区二区三区| 日韩精品无码一区二区三区四区| 成人免费区一区二区三区| 精品乱人伦一区二区三区| 国产91精品一区二区麻豆网站| 精品一区精品二区| 一区二区无码免费视频网站| 国产精品一区二区av不卡| 亚洲色偷精品一区二区三区| 色狠狠色噜噜Av天堂一区| 国产精品无码一区二区在线| 久久久精品一区二区三区| 四虎精品亚洲一区二区三区| 无码人妻精一区二区三区 | 无码一区二区三区亚洲人妻| 国产免费无码一区二区| 国产一区二区在线|播放| 精品视频一区二区三区四区| 久久精品国产一区| 日本精品高清一区二区| www一区二区三区| 免费一区二区无码视频在线播放| 竹菊影视欧美日韩一区二区三区四区五区 |