新聞中心

        EEPW首頁 > 測試測量 > 設計應用 > VxWorks下數據采集卡驅動程序開發

        VxWorks下數據采集卡驅動程序開發

        作者:楊 揚,楊智慧,李 序,李正熙 時間:2008-06-16 來源:現代電子技術 收藏

          1 引 言

        本文引用地址:http://www.104case.com/article/84271.htm

          隨著技術的發展,廣泛應用于現場設備中。本文根據實際項目需求,開發了卡在操作系統下的驅動程序,以方便應用程序開發。

          本文采用的卡為盛博協同公司基于PC/104總線的ADT700采集卡,他通過總線與PC/104系統構成一個高性能的數據采集與控制系統。ADT700具有如下特點:

          模擬輸入 16單端/8差分輸入;12位分辨率;100 kHz最大A/D采樣率;0~+10 V,-5~+5 V,-10~+10 V雙極性或單極性輸入量程;1,2,4,8倍可編程增益;DMA實現數據的高速傳輸。

          模擬輸出 4通道輸出;-5~+5 V,-10~+10 V,0~5 V,0~10 V量程可選;通道單獨置數或4通道同時置數。

          數字量I/O 可編程外圍接口,24通道TTL/CMOS兼容;I/O接口上拉或下拉限流電阻。

          定時/計數器 6個16位、10 MHz(最大)定時/計

          2 及其字符設備驅動

          是一個基于搶占式的實時操作系統,他以其高度的可靠性、優秀的實時性、靈活的可裁性廣泛應用到許多行業中。在VxWorks中,I/O系統提供了與設備無關的用戶接口,應用程序可以通過標準的接口函數如:create(),remove(),open(),close(),read(),write(),ioctl()等來訪問設備驅動程序,而不用關心驅動程序是如何實現的。ADT700屬于字符型設備,他的驅動程序需要支持以上接口函數。

          下面以字符設備中open()操作為例,說明字符設備驅動程序結構。

          如圖1所示,當應用程序調用fd=open("/xx0",ORDONLY,0)時,I/O系統根據文件名"/xx0"在設備列表中查找設備(設備是以文件形式存在的,文件名即設備名)(如①所示);查找到相應設備后根據驅動號定位到驅動表中(如②所示);I/O系統在文件描述表中預留一個表項fd=3(如③所示);然后I/O系統調用驅動程序中的xxoOpen()函數,返回需要保留的值,即設備描述指針(如④所示);I/O系統將驅動號和驅動返回值填到文件描述符表中(如⑤所示);最后,I/O系統返回新opeh()的文件在文件描述符表中的索引,應用程序得到文件描述符fd=3(如⑥所示)。用戶可以通過操作文件來訪問I/O設備。

          3驅動實現

          3.1 功能分類

          ADT700具有A/D,D/A轉換,數字I/O,定時/計數等功能,對其進行分析,可分為3類:

          (1)A/D轉換為只讀,而D/A轉換為只寫;
          (2)數字I/O既可讀又可寫;
          (3)定時/計數器基本無需讀寫,只設置即可。

          根據以上功能,得出需要實現3個驅動,分別為:

          (1)adtDrv驅動,用于讀入A/D轉換后的數據,寫出D/A轉換的數據,設備描述符為"/adt";
          (2)ppiDrv驅動,用于讀入或寫出數字I/O的數字,設備描述符為"/ppi";
          (3)pitDrv驅動,用于設置定時/計數器,設備描述符為"/pit"。

          3.2基本流程

          (1)安裝驅動

          I/O系統的功能是將用戶的I/O請求轉換成對相應驅動程序具體操作函數的調用,他通過維護一個包括所有驅動程序操作函數的地址表來實現的。通過調用ios-DrvInstall()可以動態安裝驅動程序,該函數的參數就是7種基本I/O操作函數指針。iosDrvInstall()函數將這些地址寫入驅動表中的一塊空閑存儲區中,并返回這塊存儲區的編號,編號即驅動程序號,可被與驅動程序相關聯的設備使用。iosDrvInstall()的原型是:

          int iosDrvtnstall(FUNCPTR pCreate,FUNCPTRpDelete, FUNCPTR pOpen, FUNCPTR pClose,FUNCPTR pRead,FUNCPTR pWrite,FUNCPTR pI-octl);

          當調用iosDrvInstall()注冊I/O函數成功后,在shell下用iosDrvShow命令可以觀察驅動表中ADT700的驅動入口。

          (2)創建設備

          創建設備過程即是調用設備創建函數iosDevAdd()將此設備加入到I/O系統的設備列表中。iosDevAdd()的原型為:

          STATUS iosDevAdd(DEV_HDR*pDevHdr,char*name,int drvnum);

          其中:DEV_HDR是一個指向該設備的描述符指針;而DEV_HDR結構中的第一項則指向下一個設備的描述符指針。

          設備創建成功后,在shell下用devs命令可以觀察設備列表中ADT700的設備描述符。

          以ADT700中adtDrv驅動為例,以上兩步的完成過程如圖2所示。

          (3)實現I/O函數

          安裝驅動和創建設備完成后,就需要實現I/O函數,即填充驅動表中的函數了。對于字符型設備而言,打開設備操作與創建設備操作通常使用相同的函數,底層驅動中都用xxOpen()完成;而設備驅動一旦安裝,就無需刪除,remove()無效,因此在底層驅動中xxRemove()為空。下面給出了ppiDrv驅動中ppiRead()的實現模板。
         
               
               

          完成以上3步,就基本實現了驅動程序,此時,在應用程序中可以用標準接口函數進行操作了。以打開ADT700中定時/計數器(驅動為pitDrv)為例。
               
          此時,在shell用iosFdShow命令可以觀察到新創建的文件描述符"/pit/timer"。

          4 結 語

          本文以數據采集卡驅動程序為例,詳細介紹了Vx-Works操作系統下字符設備驅動程序的開發過程。本驅動程序封裝了ADT700幾乎所有功能,支持標準的I/O系統接口函數。用戶可將ADT700當作文件,只需定義文件名建立文件描述符,而無需關心底層實現,即可完成對他的操作,從而縮短了應用程序開發時間,提高了效率。

        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)


        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 定日县| 博野县| 大石桥市| 昭觉县| 贺州市| 景泰县| 玉林市| 手机| 河津市| 来安县| 资中县| 噶尔县| 鄯善县| 镇沅| 收藏| 西城区| 合作市| 读书| 名山县| 武冈市| 兰西县| 铁岭市| 龙门县| 延寿县| 葫芦岛市| 嘉鱼县| 明水县| 黔西县| 漠河县| 乌恰县| 华容县| 新绛县| 始兴县| 皮山县| 乌兰浩特市| 曲周县| 林甸县| 鄂托克旗| 于都县| 筠连县| 白玉县|