<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > LonWorks現場(chǎng)總線(xiàn)設備驅動(dòng)設計與實(shí)現

LonWorks現場(chǎng)總線(xiàn)設備驅動(dòng)設計與實(shí)現

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

  (2) 設備標識方式

本文引用地址:http://dyxdggzs.com/article/83666.htm

  設備由一個(gè)主設備號和一個(gè)次設備號標識。主設備號唯一標識了設備類(lèi)型,即設備驅動(dòng)程序類(lèi)型,它是塊設備表或字符設備表中相應表項的索引。次設備號僅由設備驅動(dòng)程序解釋?zhuān)话阌糜谧R別在若干可能的硬件設備中,I/O請求所涉及到的那個(gè)設備。值得一提的是次設備號還可以被分成幾個(gè)部分用來(lái)區分子設備驅動(dòng)程序和具體的設備。

  (3) 設備驅動(dòng)程序組成部分

  設備驅動(dòng)程序可以分為三個(gè)主要組成部分:

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

  但是,這三個(gè)部分不是必須在每個(gè)驅動(dòng)程序中必須具有的。

  3.3  現場(chǎng)總線(xiàn)網(wǎng)卡驅動(dòng)程序

  研究了Linux的設備管理以及設備驅動(dòng)程序實(shí)現方法后,我們來(lái)設計現場(chǎng)總線(xiàn)設備驅動(dòng)程序,并對實(shí)現中的一些關(guān)鍵問(wèn)題進(jìn)行探討。

  (1) 現場(chǎng)總線(xiàn)網(wǎng)卡驅動(dòng)程序

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

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

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

  ●read入口點(diǎn)

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

  ●write入口點(diǎn)

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

  ● ioctl入口點(diǎn)

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

  ●poll入口點(diǎn)

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

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

  由上面的描述可見(jiàn),在內核設備驅動(dòng)程序的設計中,相應的機制的提供主要是對設備入口點(diǎn)的選擇和設計。

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

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

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

    (2) 對file_operations結構的初始化

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

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

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


評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>