VxWorks下數據采集卡驅動(dòng)程序開(kāi)發(fā)
1 引 言
本文引用地址:http://dyxdggzs.com/article/84271.htm隨著(zhù)嵌入式技術(shù)的發(fā)展,數據采集廣泛應用于現場(chǎng)設備中。本文根據實(shí)際項目需求,開(kāi)發(fā)了數據采集卡在VxWorks操作系統下的驅動(dòng)程序,以方便應用程序開(kāi)發(fā)。
本文采用的數據采集卡為盛博協(xié)同公司基于PC/104總線(xiàn)的ADT700采集卡,他通過(guò)總線(xiàn)與PC/104嵌入式系統構成一個(gè)高性能的數據采集與控制系統。ADT700具有如下特點(diǎn):
模擬輸入 16單端/8差分輸入;12位分辨率;100 kHz最大A/D采樣率;0~+10 V,-5~+5 V,-10~+10 V雙極性或單極性輸入量程;1,2,4,8倍可編程增益;DMA實(shí)現數據的高速傳輸。
模擬輸出 4通道輸出;-5~+5 V,-10~+10 V,0~5 V,0~10 V量程可選;通道單獨置數或4通道同時(shí)置數。
數字量I/O 可編程外圍接口,24通道TTL/CMOS兼容;I/O接口上拉或下拉限流電阻。
定時(shí)/計數器 6個(gè)16位、10 MHz(最大)定時(shí)/計
2 VxWorks及其字符設備驅動(dòng)
VxWorks是一個(gè)基于搶占式的實(shí)時(shí)操作系統,他以其高度的可靠性、優(yōu)秀的實(shí)時(shí)性、靈活的可裁性廣泛應用到許多行業(yè)中。在VxWorks中,I/O系統提供了與設備無(wú)關(guān)的用戶(hù)接口,應用程序可以通過(guò)標準的接口函數如:create(),remove(),open(),close(),read(),write(),ioctl()等來(lái)訪(fǎng)問(wèn)設備驅動(dòng)程序,而不用關(guān)心驅動(dòng)程序是如何實(shí)現的。ADT700屬于字符型設備,他的驅動(dòng)程序需要支持以上接口函數。
下面以字符設備中open()操作為例,說(shuō)明字符設備驅動(dòng)程序結構。
如圖1所示,當應用程序調用fd=open("/xx0",ORDONLY,0)時(shí),I/O系統根據文件名"/xx0"在設備列表中查找設備(設備是以文件形式存在的,文件名即設備名)(如①所示);查找到相應設備后根據驅動(dòng)號定位到驅動(dòng)表中(如②所示);I/O系統在文件描述表中預留一個(gè)表項fd=3(如③所示);然后I/O系統調用驅動(dòng)程序中的xxoOpen()函數,返回需要保留的值,即設備描述指針(如④所示);I/O系統將驅動(dòng)號和驅動(dòng)返回值填到文件描述符表中(如⑤所示);最后,I/O系統返回新opeh()的文件在文件描述符表中的索引,應用程序得到文件描述符fd=3(如⑥所示)。用戶(hù)可以通過(guò)操作文件來(lái)訪(fǎng)問(wèn)I/O設備。
3驅動(dòng)實(shí)現
3.1 功能分類(lèi)
ADT700具有A/D,D/A轉換,數字I/O,定時(shí)/計數等功能,對其進(jìn)行分析,可分為3類(lèi):
(1)A/D轉換為只讀,而D/A轉換為只寫(xiě);
(2)數字I/O既可讀又可寫(xiě);
(3)定時(shí)/計數器基本無(wú)需讀寫(xiě),只設置即可。
根據以上功能,得出需要實(shí)現3個(gè)驅動(dòng),分別為:
(1)adtDrv驅動(dòng),用于讀入A/D轉換后的數據,寫(xiě)出D/A轉換的數據,設備描述符為"/adt";
(2)ppiDrv驅動(dòng),用于讀入或寫(xiě)出數字I/O的數字,設備描述符為"/ppi";
(3)pitDrv驅動(dòng),用于設置定時(shí)/計數器,設備描述符為"/pit"。
3.2基本流程
(1)安裝驅動(dòng)
I/O系統的功能是將用戶(hù)的I/O請求轉換成對相應驅動(dòng)程序具體操作函數的調用,他通過(guò)維護一個(gè)包括所有驅動(dòng)程序操作函數的地址表來(lái)實(shí)現的。通過(guò)調用ios-DrvInstall()可以動(dòng)態(tài)安裝驅動(dòng)程序,該函數的參數就是7種基本I/O操作函數指針。iosDrvInstall()函數將這些地址寫(xiě)入驅動(dòng)表中的一塊空閑存儲區中,并返回這塊存儲區的編號,編號即驅動(dòng)程序號,可被與驅動(dòng)程序相關(guān)聯(lián)的設備使用。iosDrvInstall()的原型是:
int iosDrvtnstall(FUNCPTR pCreate,FUNCPTRpDelete, FUNCPTR pOpen, FUNCPTR pClose,FUNCPTR pRead,FUNCPTR pWrite,FUNCPTR pI-octl);
當調用iosDrvInstall()注冊I/O函數成功后,在shell下用iosDrvShow命令可以觀(guān)察驅動(dòng)表中ADT700的驅動(dòng)入口。
(2)創(chuàng )建設備
創(chuàng )建設備過(guò)程即是調用設備創(chuàng )建函數iosDevAdd()將此設備加入到I/O系統的設備列表中。iosDevAdd()的原型為:
STATUS iosDevAdd(DEV_HDR*pDevHdr,char*name,int drvnum);
其中:DEV_HDR是一個(gè)指向該設備的描述符指針;而DEV_HDR結構中的第一項則指向下一個(gè)設備的描述符指針。
設備創(chuàng )建成功后,在shell下用devs命令可以觀(guān)察設備列表中ADT700的設備描述符。
以ADT700中adtDrv驅動(dòng)為例,以上兩步的完成過(guò)程如圖2所示。
(3)實(shí)現I/O函數
安裝驅動(dòng)和創(chuàng )建設備完成后,就需要實(shí)現I/O函數,即填充驅動(dòng)表中的函數了。對于字符型設備而言,打開(kāi)設備操作與創(chuàng )建設備操作通常使用相同的函數,底層驅動(dòng)中都用xxOpen()完成;而設備驅動(dòng)一旦安裝,就無(wú)需刪除,remove()無(wú)效,因此在底層驅動(dòng)中xxRemove()為空。下面給出了ppiDrv驅動(dòng)中ppiRead()的實(shí)現模板。
完成以上3步,就基本實(shí)現了驅動(dòng)程序,此時(shí),在應用程序中可以用標準接口函數進(jìn)行操作了。以打開(kāi)ADT700中定時(shí)/計數器(驅動(dòng)為pitDrv)為例。
此時(shí),在shell用iosFdShow命令可以觀(guān)察到新創(chuàng )建的文件描述符"/pit/timer"。
4 結 語(yǔ)
本文以數據采集卡驅動(dòng)程序為例,詳細介紹了Vx-Works操作系統下字符設備驅動(dòng)程序的開(kāi)發(fā)過(guò)程。本驅動(dòng)程序封裝了ADT700幾乎所有功能,支持標準的I/O系統接口函數。用戶(hù)可將ADT700當作文件,只需定義文件名建立文件描述符,而無(wú)需關(guān)心底層實(shí)現,即可完成對他的操作,從而縮短了應用程序開(kāi)發(fā)時(shí)間,提高了效率。
linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)
評論