<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > VxWorks下的同類USB設(shè)備管理方法

          VxWorks下的同類USB設(shè)備管理方法

          作者: 時(shí)間:2013-10-08 來源:網(wǎng)絡(luò) 收藏
            引言

            VxWoAs是美國Wind River System(WRS)公司開發(fā)的嵌入式實(shí)時(shí)操作系統(tǒng)。中的I/O子系統(tǒng)為應(yīng)用程序提供了簡單、統(tǒng)一、與設(shè)備無關(guān)的訪問接口。I/O系統(tǒng)內(nèi)部采用設(shè)備列表、驅(qū)動(dòng)程序列表和文件描述符表來實(shí)現(xiàn)對(duì)不同設(shè)備的管理與訪問,從而為開發(fā)通用外部設(shè)備驅(qū)動(dòng)程序提供了便利。然而在一些專用系統(tǒng)上,為了縮短設(shè)備的響應(yīng)時(shí)間,提高設(shè)備的讀取速度,有必要將設(shè)備與I/O系統(tǒng)獨(dú)立起來。由于屬于微內(nèi)核,所有的程序均運(yùn)行在同一線性地址空間,這也為設(shè)備與I/O系統(tǒng)的獨(dú)立提供了條件。基于的I/O子系統(tǒng)的思想,本文提出了一種在VxWorks下對(duì)多個(gè)設(shè)備進(jìn)行管理的設(shè)計(jì)方案。該方案可使得對(duì)設(shè)備的訪問獨(dú)立于I/O子系統(tǒng)。

            1 VxW0rks的I/O子系統(tǒng)

            VxWorks I/O系統(tǒng)內(nèi)部對(duì)設(shè)備的管理主要通過三張表來實(shí)現(xiàn),即驅(qū)動(dòng)程序列表、設(shè)備列表和文件描述符表。其中驅(qū)動(dòng)程序列表用來管理已注冊的設(shè)備驅(qū)動(dòng)程序,它的大小是固定的,有NUM DRIVERS項(xiàng),每一項(xiàng)對(duì)應(yīng)驅(qū)動(dòng)程序的入口點(diǎn),當(dāng)應(yīng)用程序調(diào)用標(biāo)準(zhǔn)I/O接口函數(shù)時(shí),I/O子系統(tǒng)便可通過驅(qū)動(dòng)程序列表檢索到設(shè)備的驅(qū)動(dòng)程序,從而實(shí)現(xiàn)對(duì)指定設(shè)備的訪問、發(fā)送、接收等操作。系統(tǒng)可利用iosDrvInstall()注冊設(shè)備驅(qū)動(dòng)程序,并將設(shè)備的人口函數(shù)加入到驅(qū)動(dòng)程序列表。同時(shí)返回一個(gè)drvnum驅(qū)動(dòng)程序號(hào),并將其作為設(shè)備描述符的一部分,從而以此把設(shè)備與其驅(qū)動(dòng)程序聯(lián)系起來。I/O子系統(tǒng)采用鏈表對(duì)所有設(shè)備進(jìn)行管理,該鏈表稱之為設(shè)備列表。調(diào)用iosDevAdd ()可向系統(tǒng)添加設(shè)備,添加設(shè)備時(shí),應(yīng)指明設(shè)備名稱及驅(qū)動(dòng)程序索引號(hào),該索引號(hào)就是iosDrvInstall ()返回的索引號(hào)。在VxWorks中,一個(gè)設(shè)備可以被多次打開,但對(duì)于每一次打開,系統(tǒng)將利用一個(gè)文件描述符來區(qū)分,本系統(tǒng)將會(huì)維持一張文件描述符表,該表的每一項(xiàng)記錄了與設(shè)備對(duì)應(yīng)的驅(qū)動(dòng)程序號(hào)和設(shè)備ID,這樣,就會(huì)文件描述符與驅(qū)動(dòng)程序、以及設(shè)備之間建立一種聯(lián)系。這樣,在利用標(biāo)準(zhǔn)I/O函數(shù)進(jìn)行讀寫時(shí),就可以根據(jù)文件描述符從文件描述符表中找到對(duì)應(yīng)的驅(qū)動(dòng)程序的人口與設(shè)備ID。VxWorks中的這三張表的關(guān)系如圖1所示。


            2 USB方案設(shè)計(jì)

            設(shè)計(jì)獨(dú)立于I/O系統(tǒng)的USB設(shè)備驅(qū)動(dòng)程序的設(shè)計(jì)思想主要基于兩點(diǎn),第一是用戶自己管理設(shè)備。第二是通過驅(qū)動(dòng)程序直接向應(yīng)用程序提供可用于讀寫設(shè)備的接口函數(shù)。由于設(shè)備獨(dú)立于I/O系統(tǒng),用戶需要自己設(shè)計(jì)一種設(shè)備管理方法,以便對(duì)多個(gè)接入的USB設(shè)備進(jìn)行合理的管理。然而由于不存在設(shè)備驅(qū)動(dòng)程序列表,故在設(shè)計(jì)時(shí)還需要有一種方法來解決設(shè)備的訪問問題。

            2.1 USB設(shè)備描述符

            設(shè)備描述符實(shí)際上是一個(gè)數(shù)據(jù)結(jié)構(gòu),可在系統(tǒng)中作為一個(gè)邏輯結(jié)構(gòu)體。它是一個(gè)具體設(shè)備的抽象??膳c一個(gè)物理設(shè)備相對(duì)應(yīng),是參與設(shè)備管理、訪問的主要結(jié)構(gòu)體。鑒于I/O子系統(tǒng)對(duì)設(shè)備的管理,在對(duì)多個(gè)USB設(shè)備進(jìn)行管理時(shí),對(duì)于設(shè)備的存儲(chǔ),可采用雙向鏈表來進(jìn)行管理,稱之為設(shè)備列表。鏈表對(duì)USB設(shè)備的管理主要通過設(shè)備頭(USB_BEV_HDR)來實(shí)現(xiàn)。USB設(shè)備頭是一個(gè)與具體設(shè)備無關(guān)的數(shù)據(jù)結(jié)構(gòu),它由一個(gè)鏈表節(jié)點(diǎn)和設(shè)備名稱組成。節(jié)點(diǎn)中包含指向有前一個(gè)和下一個(gè)USB設(shè)備的設(shè)備頭的鏈表節(jié)點(diǎn)。實(shí)際上,每一個(gè)USB設(shè)備都會(huì)有更多的數(shù)據(jù)存儲(chǔ)在更大的數(shù)據(jù)結(jié)構(gòu)中。這個(gè)結(jié)構(gòu)就是設(shè)備描述符,而USB設(shè)備頭只是做為USB設(shè)備描述符的起始部分。設(shè)備頭的數(shù)據(jù)結(jié)構(gòu)(USB_DEV_HDR)如下:


            其中,USB_DL_NODE是一個(gè)鏈表節(jié)點(diǎn),它由兩個(gè)鏈表節(jié)點(diǎn)指針域組成。分別指向前一個(gè)和下一個(gè)設(shè)備的鏈表節(jié)點(diǎn)。其數(shù)據(jù)結(jié)構(gòu)如下:


            這樣,就可以把USB設(shè)備的描述符劃分為兩部分,其中一部分與具體設(shè)備無關(guān),稱為設(shè)備頭:另外一部分是與具體設(shè)備相關(guān)的設(shè)備特殊數(shù)據(jù),設(shè)備相關(guān)部分包括USB設(shè)備的Node ID、USB管道句柄、端點(diǎn)地址、狀態(tài)等信息。其結(jié)構(gòu)如圖2所示。設(shè)備無關(guān)部分主要用于設(shè)備管理,而設(shè)備相關(guān)部分則用于對(duì)設(shè)備的訪問。


          上一頁 1 2 3 下一頁

          關(guān)鍵詞: VxWorks 同類USB 設(shè)備管理

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();