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

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 實(shí)時(shí)嵌入式操作系統(tǒng)VxWorks設(shè)備驅(qū)動(dòng)程序的設(shè)計(jì)

          實(shí)時(shí)嵌入式操作系統(tǒng)VxWorks設(shè)備驅(qū)動(dòng)程序的設(shè)計(jì)

          作者: 時(shí)間:2011-06-10 來(lái)源:網(wǎng)絡(luò) 收藏


          2
          為了實(shí)現(xiàn)應(yīng)用程序的可移植性,將應(yīng)用程序從直接操作硬件中解放出來(lái),為應(yīng)用程序操作硬件提供一個(gè)一致的接口。這個(gè)接口就是由的I/O系統(tǒng)提供的。I/O系統(tǒng)將應(yīng)用程序的I/O請(qǐng)求傳遞給設(shè)備專用的I/O函數(shù)。這些設(shè)備專用的I/0函數(shù)就是由設(shè)備提供的。本章從功能、接口與結(jié)構(gòu)3個(gè)角度闡述設(shè)備。
          2.1 設(shè)備驅(qū)動(dòng)程序的功能
          1)對(duì)設(shè)備進(jìn)行初始化 初始化的目的是使設(shè)備處于某種工作狀態(tài),以便用戶程序訪問(wèn)該設(shè)備。
          2)打開(kāi)設(shè)備操作 打開(kāi)設(shè)備操作實(shí)際上是查詢用戶指定的設(shè)備,并查看用戶是否可以使用該設(shè)備。因?yàn)樵O(shè)備是共享資源,當(dāng)設(shè)備正在被使用時(shí),系統(tǒng)要對(duì)它進(jìn)行保護(hù),禁止其他任務(wù)對(duì)設(shè)備進(jìn)行操作,直到設(shè)備資源被釋放。
          3)關(guān)閉設(shè)備操作 關(guān)閉設(shè)備操作就是釋放設(shè)備資源。任務(wù)對(duì)設(shè)備完成操作后,必須進(jìn)行關(guān)閉設(shè)備操作,否則設(shè)備總是處于被占用狀態(tài),其他任務(wù)無(wú)法使用。與打開(kāi)設(shè)備操作相對(duì)應(yīng),有打開(kāi)操作就應(yīng)該有關(guān)閉操作。
          4)從設(shè)備上接收數(shù)據(jù)并提交給系統(tǒng) 這項(xiàng)功能通常就是所說(shuō)的讀操作,接收外部傳輸來(lái)的數(shù)據(jù)。接收數(shù)據(jù)采用的方式有查詢方式、中斷方式和DMA方式。
          5)把數(shù)據(jù)從主機(jī)上發(fā)送給設(shè)備 這項(xiàng)功能對(duì)應(yīng)通常的寫操作,把主機(jī)上的數(shù)據(jù)傳送給外界。通常系統(tǒng)主動(dòng)調(diào)用該操作進(jìn)行數(shù)據(jù)發(fā)送,有時(shí)也采取中斷方式發(fā)送數(shù)據(jù)。
          6)對(duì)設(shè)備進(jìn)行控制操作 在使用設(shè)備過(guò)程中,有時(shí)根據(jù)應(yīng)用的需要對(duì)設(shè)備進(jìn)行控制(例如改變?cè)O(shè)備某個(gè)狀態(tài)),而控制操作就能提供這種功能。
          2.2 設(shè)備驅(qū)動(dòng)程序的接口
          通用設(shè)備驅(qū)動(dòng)程序基本都是通過(guò)I/O系統(tǒng)來(lái)存取的,這樣做的好處是可以屏蔽底層硬件,對(duì)上層應(yīng)用程序提供統(tǒng)一的接口。Vx-Works的I/O系統(tǒng)由基本I/O及含buffer的I/O組成,它提供標(biāo)準(zhǔn)的C庫(kù)函數(shù),基本I/O庫(kù)與Unix兼容,而含buffer的I/O則與ANSI C兼容。VxWorks的I/O系統(tǒng)有其獨(dú)特的特性,使得它比其他I/O系統(tǒng)更快速、靈活,這在系統(tǒng)中非常重要。還有一些特殊的通用IO設(shè)備驅(qū)動(dòng)程序如串行通用IO設(shè)備驅(qū)動(dòng)程序由于其自身的特性,雖然不是通過(guò)標(biāo)準(zhǔn)I/O來(lái)進(jìn)行存取的,但是也都有它們各自相關(guān)的規(guī)范。下面只介紹通過(guò)I/O系統(tǒng)存取的通用IO設(shè)備驅(qū)動(dòng)程序。
          VxWorks作為為了能夠更快、更靈活地進(jìn)行I/O操作,提供了若干庫(kù)來(lái)支持標(biāo)準(zhǔn)的字符設(shè)備和塊設(shè)備。一個(gè)字符設(shè)備的驅(qū)動(dòng)程序和I/O系統(tǒng)直接作用,調(diào)用驅(qū)動(dòng)程序安裝函數(shù)iosDrvInstall()在VxWorks中安裝驅(qū)動(dòng)程序。它執(zhí)行7個(gè)基本的I/O操作:create,rem-ove,open,close,read,write和ioctl。如果設(shè)備不支持某些I/O操作,則相應(yīng)的程序可以被省略。iosDrvInstall()只是為驅(qū)動(dòng)程序在驅(qū)動(dòng)程序表中分配了一個(gè)位置,要運(yùn)行驅(qū)動(dòng)程序還需要調(diào)用設(shè)備安裝函數(shù)iosDevAdd()。iosDevAdd()把設(shè)備名和驅(qū)動(dòng)程序號(hào)寫到數(shù)據(jù)結(jié)構(gòu)DEV_ HDR中,并把它加到系統(tǒng)的設(shè)備列表中。
          一個(gè)塊設(shè)備的驅(qū)動(dòng)掛在文件系統(tǒng)上比直接掛在I/O系統(tǒng)上使用起來(lái)更方便。它先和文件系統(tǒng)作用,再由文件系統(tǒng)與I/O系統(tǒng)作用。塊設(shè)備驅(qū)動(dòng)程序不使用iosDrvlnstall()來(lái)安裝驅(qū)動(dòng)程序,而是通過(guò)初始化塊設(shè)備描述結(jié)構(gòu)BLK_DEV或順序設(shè)備描述結(jié)構(gòu)SEQ_DEV來(lái)實(shí)現(xiàn)驅(qū)動(dòng)程序提供給文件系統(tǒng)的功能。類似的,塊設(shè)備驅(qū)動(dòng)程序不使用iosDevAdd()來(lái)將驅(qū)動(dòng)程序裝入I/O系統(tǒng),而是使用文件系統(tǒng)設(shè)備初始化函數(shù),如dos-FsDevInit()來(lái)完成。實(shí)際上,文件系統(tǒng)把自己作為一個(gè)驅(qū)動(dòng)程序裝到I/O系統(tǒng)中,并把請(qǐng)求轉(zhuǎn)發(fā)給實(shí)際的設(shè)備驅(qū)動(dòng)程序。
          2.3 設(shè)備驅(qū)動(dòng)程序的組成
          設(shè)備驅(qū)動(dòng)程序包括3部分:初始化部分、函數(shù)功能部分和中斷服務(wù)程序ISR。
          1)初始化部分初始化硬件,分配設(shè)備所需的資源,完成所有與系統(tǒng)相關(guān)的設(shè)置。如果是字符設(shè)備,首先調(diào)用iosDrvInstall()來(lái)安裝驅(qū)動(dòng)程序,把中斷向量和ISR掛上,然后調(diào)用iosDevAdd()將驅(qū)動(dòng)程序加入I/O系統(tǒng)中;如果是塊設(shè)備,首先把中斷向量和ISR掛上,在內(nèi)存中分配一個(gè)設(shè)備結(jié)構(gòu),然后初始化該結(jié)構(gòu)。用戶要使用該設(shè)備時(shí),先調(diào)用設(shè)備初始化函數(shù)xxlnit(),再調(diào)用設(shè)備創(chuàng)建函數(shù)xxDevCreate(),返回一個(gè)BLK_DEV結(jié)構(gòu)的指針,供文件系統(tǒng)初始化函數(shù)使用。
          2)函數(shù)功能部分完成系統(tǒng)指定的功能。對(duì)于字符設(shè)備,這些函數(shù)就是指定的7個(gè)標(biāo)準(zhǔn)的I/O函數(shù);對(duì)于塊設(shè)備,則是在BLK_DEV或SEQ_DEV結(jié)構(gòu)中指定的功能函數(shù)。
          3)中斷服務(wù)程序是系統(tǒng)的重要組成部分,系統(tǒng)通過(guò)中斷機(jī)制來(lái)了解外部事件,并作出響應(yīng)。實(shí)時(shí)系統(tǒng)的反應(yīng)速度取決于系統(tǒng)對(duì)中斷的響應(yīng)速度和中斷處理程序的處理速度。因此,中斷服務(wù)程序的處理時(shí)間應(yīng)盡量短。所有的中斷服務(wù)程序共享一個(gè)堆棧,沒(méi)有任務(wù)控制塊,所以,在中斷服務(wù)程序中不能使用可導(dǎo)致阻塞的函數(shù),如printf(…)、semTake(…)等。中斷服務(wù)程序中可以使用semGive(…)與其他的非中斷服務(wù)程序進(jìn)行通信。理想的情況,一個(gè)中斷服務(wù)程序僅調(diào)用一個(gè)semGive(…)系統(tǒng)調(diào)用,也就是說(shuō),中斷服務(wù)程序的主要功能應(yīng)該是發(fā)起一個(gè)任務(wù)來(lái)完成必要的處理。為提高中斷服務(wù)程序與任務(wù)的合作性能,最好的機(jī)制是信號(hào)量。

          3 END網(wǎng)口驅(qū)動(dòng)開(kāi)發(fā)
          經(jīng)過(guò)上述論述,本章通過(guò)END網(wǎng)口驅(qū)動(dòng)的實(shí)例具體說(shuō)明設(shè)備驅(qū)動(dòng)程序的開(kāi)發(fā)過(guò)程。
          1)驅(qū)動(dòng)程序的設(shè)備安裝函數(shù) 在BSP中對(duì)confidh,configNeth文件進(jìn)行修改。首先在configh中增加#define INCLUDE_END,其次在configNeth文件中endTb1中添加一行:
          b.JPG
          其中每行的第1項(xiàng)是設(shè)備的單元號(hào);第2項(xiàng)是驅(qū)動(dòng)程序的endLoad()入口點(diǎn);第3項(xiàng)是要傳給該入口點(diǎn)的字符串,該字符串通常表示內(nèi)存地址、I/O地址和中斷號(hào)等參數(shù);第4項(xiàng)表示是否支持緩沖區(qū)借出;第5項(xiàng)表示BSP私有數(shù)據(jù);第6項(xiàng)是執(zhí)行標(biāo)志,為FALSE表示該入口點(diǎn)還未被執(zhí)行,在系統(tǒng)成功裝載一個(gè)驅(qū)動(dòng)程序后,該值被改為True。設(shè)置該值為True是為了防止系統(tǒng)自動(dòng)裝載該驅(qū)動(dòng)。做完上述工作后,驅(qū)動(dòng)程序就可以添加到VxWorks中。
          linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)


          評(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); })();