中文字幕 另类精品,亚洲欧美一区二区蜜桃,日本在线精品视频免费,孩交精品乱子片免费

<sup id="3hn2b"></sup>

    1. <sub id="3hn2b"><ol id="3hn2b"></ol></sub><legend id="3hn2b"></legend>

      1. <xmp id="3hn2b"></xmp>

      2. 新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > LonWorks現(xiàn)場總線設(shè)備驅(qū)動設(shè)計與實現(xiàn)

        LonWorks現(xiàn)場總線設(shè)備驅(qū)動設(shè)計與實現(xiàn)

        作者:劉 廣 石婷婷 時間:2008-06-04 來源:中國測控網(wǎng) 收藏

          (2) 設(shè)備標(biāo)識方式

        本文引用地址:http://www.antipu.com.cn/article/83666.htm

          設(shè)備由一個主設(shè)備號和一個次設(shè)備號標(biāo)識。主設(shè)備號唯一標(biāo)識了設(shè)備類型,即設(shè)備驅(qū)動程序類型,它是塊設(shè)備表或字符設(shè)備表中相應(yīng)表項的索引。次設(shè)備號僅由設(shè)備驅(qū)動程序解釋,一般用于識別在若干可能的硬件設(shè)備中,I/O請求所涉及到的那個設(shè)備。值得一提的是次設(shè)備號還可以被分成幾個部分用來區(qū)分子設(shè)備驅(qū)動程序和具體的設(shè)備。

          (3) 設(shè)備驅(qū)動程序組成部分

          設(shè)備驅(qū)動程序可以分為三個主要組成部分:

          ●自動配置和初始化子程序。負(fù)責(zé)檢測所要驅(qū)動的硬件設(shè)備是否存在和是否能正常工作。如果該設(shè)備正常,則對這個設(shè)備及其相關(guān)的、設(shè)備驅(qū)動程序需要的軟硬件進(jìn)行初始化。
          
          ● 服務(wù)于I/O請求的子程序。它們主要是對file_operations結(jié)構(gòu)的各個入口點的實現(xiàn)。這部分的實現(xiàn)支持了文件系統(tǒng)的調(diào)用(如open,close, read等等)。
          
          ●中斷服務(wù)子程序。在Linux系統(tǒng)中,并不是直接從中斷向量表中調(diào)用設(shè)備驅(qū)動程序的中斷服務(wù)子程序,而是由Linux系統(tǒng)來接收硬件中斷,再由系統(tǒng)來調(diào)用中斷服務(wù)子程序。

          但是,這三個部分不是必須在每個驅(qū)動程序中必須具有的。

          3.3  現(xiàn)場總線網(wǎng)卡驅(qū)動程序

          研究了Linux的設(shè)備管理以及設(shè)備驅(qū)動程序?qū)崿F(xiàn)方法后,我們來設(shè)計現(xiàn)場總線設(shè)備驅(qū)動程序,并對實現(xiàn)中的一些關(guān)鍵問題進(jìn)行探討。

          (1) 現(xiàn)場總線網(wǎng)卡驅(qū)動程序

          在驅(qū)動程序設(shè)計和開發(fā)中,我們一定要注意的問題是機制(Mechanism)與策略(Policy)的分離。這里所謂的機制是指我們的驅(qū)動程序提供的接口應(yīng)該很忠實地反映設(shè)備的原始功能(bare function),而與應(yīng)用無關(guān)。而策略是指一旦這個設(shè)備驅(qū)動程序為設(shè)備機制提供了相應(yīng)的軟件接口,那么應(yīng)用程序開發(fā)人員就能按照特定的方式使用機制接口??梢哉f,在內(nèi)核驅(qū)動程序開發(fā)過程中,所設(shè)計的數(shù)據(jù)結(jié)構(gòu),以及確定的接口命令都是為以后的應(yīng)用策略提供的一種機制。而如前所述,這種機制在Unix類系統(tǒng)內(nèi)部是通過一組固定的入口點來提供的。由于我們要開發(fā)的設(shè)備驅(qū)動程序是一個字符型的設(shè)備,所以接下來我們首先分析字符型設(shè)備驅(qū)動程序中常用的入口點:

          ● open入口點
          
          打開設(shè)備準(zhǔn)備I/O操作。對字符設(shè)備文件進(jìn)行打開操作,都會調(diào)用設(shè)備的open入口點。open子程序必須對將要進(jìn)行的I/O操作做好必要的準(zhǔn)備工作,如清除緩沖區(qū)等。如果設(shè)備是獨占的,即同一時刻只能有一個程序訪問此設(shè)備,則open子程序必須設(shè)置一些標(biāo)志以表示設(shè)備處于忙狀態(tài)。

          ●release入口點
          
          關(guān)閉一個設(shè)備。當(dāng)最后一次使用設(shè)備終結(jié)后,調(diào)用release子程序。獨占設(shè)備必須改變前由open子程序設(shè)置的標(biāo)志,以便設(shè)備可再次被使用。

          ●read入口點

          從設(shè)備上讀數(shù)據(jù)。對于有緩沖區(qū)的I/O操作,一般是從緩沖區(qū)里讀數(shù)據(jù)。對字符設(shè)備文件進(jìn)行讀操作將調(diào)用read子程序。

          ●write入口點

          往設(shè)備上寫數(shù)據(jù)。對于有緩沖區(qū)的I/O操作,一般是把數(shù)據(jù)寫入緩沖區(qū)里。對字符設(shè)備文件進(jìn)行寫操作將調(diào)用write子程序。

          ● ioctl入口點

          執(zhí)行讀、寫之外的一些硬件控制操作。

          ●poll入口點

          把對許多非阻塞操作的設(shè)備描述符集合起來,等待事件的發(fā)生,以便于集中檢查,看數(shù)據(jù)是否可從設(shè)備讀取或設(shè)備是否可用于寫數(shù)據(jù),這樣就做到了所謂的多路復(fù)用。

          以上入口點構(gòu)成了設(shè)備驅(qū)動程序的三大組成部分中I/O請求的部分,在Linux中它們由file_operations結(jié)構(gòu)來封裝,并不是所有的字符設(shè)備驅(qū)動程序都必須提供以上每一個入口點的實現(xiàn),如果設(shè)備驅(qū)動程序沒有提供上述入口點中的某幾個,系統(tǒng)會用缺省的子程序來代替。

          由上面的描述可見,在內(nèi)核設(shè)備驅(qū)動程序的設(shè)計中,相應(yīng)的機制的提供主要是對設(shè)備入口點的選擇和設(shè)計。

                針對LonWorks現(xiàn)場總線網(wǎng)卡的特點,我們選擇并實現(xiàn)了五個入口點,即open, release, read,write, ioctl。

          對于open和release入口點由于設(shè)備特點,我們只需要控制設(shè)備驅(qū)動模塊在使用時,不被異常釋放即可。

          接下來,我們將描述以上設(shè)計實現(xiàn)中與Linux內(nèi)核相關(guān)的一些調(diào)用和問題。

            (2) 對file_operations結(jié)構(gòu)的初始化

          file_operations結(jié)構(gòu)是Linux操作系統(tǒng)中用于實現(xiàn)驅(qū)動程序的最重要的數(shù)據(jù)結(jié)構(gòu),我們已經(jīng)在前面提到過,它對Linux提供I/O請求的子程序的一系列入口點進(jìn)行了封裝。該結(jié)構(gòu)貫穿在整個驅(qū)動程序中,故我們在文件作用域內(nèi)定義了它的一個變量,并對本程序中用到的入口點做了初始化,其代碼如下:

          struct file_operations lmdev_fops= {
             NULL,
             lmdev_read,
          //把實現(xiàn)的lmdev_read函數(shù)指針賦給read入口點。
             lmdev_write,
          //把實現(xiàn)的lmdev_write函數(shù)指針賦給write入口點。
              NULL,
              NULL,
             lmdev_ioctl,
          //把實現(xiàn)的lmdev_ioctl函數(shù)指針賦給ioctl入口點。
              NULL,
              lmdev_open,
          //把實現(xiàn)的lmdev_ open函數(shù)指針賦給open入口點。
          lmdev_release,
          //把實現(xiàn)的lmdev_release函數(shù)指針賦給release入口點。
          NULL,
          NULL,
          NULL,
          NULL,
          }; 
          對于lmdev-*函數(shù)的實現(xiàn)方法,我們將在后面做詳細(xì)的討論。 

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


        評論


        相關(guān)推薦

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

        關(guān)閉