第4章設(shè)備驅(qū)動(dòng)《Vxworks設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》_第1頁(yè)
第4章設(shè)備驅(qū)動(dòng)《Vxworks設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》_第2頁(yè)
第4章設(shè)備驅(qū)動(dòng)《Vxworks設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》_第3頁(yè)
第4章設(shè)備驅(qū)動(dòng)《Vxworks設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》_第4頁(yè)
第4章設(shè)備驅(qū)動(dòng)《Vxworks設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》_第5頁(yè)
已閱讀5頁(yè),還剩5頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、FAR專(zhuān)業(yè)始于專(zhuān)注卓識(shí)源于遠(yuǎn)見(jiàn)帶 JT 毒 JCPllSf I嵌入式培訓(xùn)專(zhuān)家年碑積累,成功培養(yǎng)50000夢(mèng)名研發(fā)工程師,痔就專(zhuān)業(yè)品牌形象華濟(jì)遠(yuǎn)見(jiàn)的企業(yè)理念杲不僅賈榊良劭敦育、齟專(zhuān)業(yè)敦氏,更慕血受人尊敬前歆業(yè)教盲&VXWORKS備驅(qū)動(dòng)開(kāi)發(fā)詳解辛國(guó)免尊替洵電話(huà):400-706-T8B0雙休日及E假m為便手機(jī):15010的伯88巧01越90966FAR專(zhuān)業(yè)始于專(zhuān)注卓識(shí)源于遠(yuǎn)見(jiàn)作者:華清遠(yuǎn)見(jiàn)禺比琳手專(zhuān)左卓底凍手運(yùn)St第4章設(shè)備驅(qū)動(dòng)本章簡(jiǎn)介簡(jiǎn)單地說(shuō),驅(qū)動(dòng)程序就是設(shè)置某個(gè)硬件完成其固有功能的程序,如網(wǎng)卡設(shè)備驅(qū)動(dòng)程序就是設(shè)置網(wǎng)卡相關(guān)寄存器,使其能夠正常收發(fā)網(wǎng)絡(luò)數(shù)據(jù)包的程序。驅(qū)動(dòng)程序直接與硬件設(shè)備交互

2、,其大多數(shù)的工作就是操作 硬件相關(guān)寄存器。首先,寄存器也是一種 RAM,在系統(tǒng)下電后,寄存器中的內(nèi)容都會(huì)丟失,系統(tǒng)上電復(fù)位過(guò)程中,硬件 寄存器一般都復(fù)位到一個(gè)默認(rèn)值,默認(rèn)狀態(tài)下,硬件是不能正常工作的,如中斷使能被屏蔽,工作使能位 也被屏蔽,還有一些決定硬件工作情況的關(guān)鍵控制寄存器也需要被重新配置。而這些工作都有賴(lài)于設(shè)備驅(qū) 動(dòng)的完成。驅(qū)動(dòng)一般都作為操作系統(tǒng)內(nèi)核組成的一部分,即便現(xiàn)在很多系統(tǒng)支持驅(qū)動(dòng)的動(dòng)態(tài)加載,但是驅(qū) 動(dòng)代碼在執(zhí)行時(shí),依然是以?xún)?nèi)核代碼模式進(jìn)行執(zhí)行的。換句話(huà)說(shuō),驅(qū)動(dòng)代碼具有系統(tǒng)特權(quán)級(jí),除了其自身 資源對(duì)應(yīng)的硬件設(shè)備資源,其還對(duì)操作系統(tǒng)資源具有完全的訪問(wèn)權(quán)。所以,一個(gè)驅(qū)動(dòng)程序如果存在B

3、UG,將直接會(huì)導(dǎo)致整個(gè)操作系統(tǒng)的崩潰。故調(diào)試驅(qū)動(dòng)是一項(xiàng)十分關(guān)鍵的工作,必須對(duì)驅(qū)動(dòng)進(jìn)行仔細(xì)檢查,并需 要經(jīng)受長(zhǎng)時(shí)間的運(yùn)行考驗(yàn)。應(yīng)用層程序員往往對(duì)屬于內(nèi)核編程的外設(shè)驅(qū)動(dòng)心存敬畏,認(rèn)為驅(qū)動(dòng)編程是一項(xiàng) 非常復(fù)雜的工作。實(shí)際上,底層驅(qū)動(dòng)編程往往比應(yīng)用層編程具有更大的靈活性,就如沒(méi)有調(diào)試不出來(lái)的硬 件,也沒(méi)有調(diào)試不出來(lái)的底層驅(qū)動(dòng),但是應(yīng)用層BUG有時(shí)就是無(wú)法調(diào)試出來(lái)。底層驅(qū)動(dòng)的調(diào)試過(guò)程是同時(shí)對(duì)硬件和驅(qū)動(dòng)進(jìn)行驗(yàn)證的過(guò)程。底層驅(qū)動(dòng)很多時(shí)候用來(lái)定位硬件設(shè)計(jì)錯(cuò)誤或者硬件芯片本身可能的問(wèn) 題,故底層驅(qū)動(dòng)程序員必須對(duì)所要驅(qū)動(dòng)的硬件設(shè)備有一個(gè)比較充分的了解,以及對(duì)與硬件交互的其他硬件 或外界環(huán)境也需要有一個(gè)比較清楚的理

4、解。專(zhuān)業(yè)儲(chǔ)于住強(qiáng)卓職猱于込葩驅(qū)動(dòng)程序?qū)ι闲枰ヅ洳僮飨到y(tǒng)提供的一套規(guī)范接口,對(duì)下必須驅(qū)動(dòng)硬件設(shè)備進(jìn)行工作,其起著一個(gè)關(guān)鍵的中間轉(zhuǎn)換角色,將操作系統(tǒng)的具體請(qǐng)求轉(zhuǎn)換為對(duì)硬件的某種操作。VxWorks BSP移植的主要工作就是編寫(xiě)平臺(tái)特定硬件設(shè)備的驅(qū)動(dòng)程序,可以說(shuō),驅(qū)動(dòng)程序編寫(xiě)能力對(duì)于BSP的移植具有重要的影響。我們從本章開(kāi)始詳細(xì)介紹VxWorks下各種外設(shè)的驅(qū)動(dòng)程序的基本設(shè)計(jì)原理、框架及內(nèi)核相關(guān)代碼,使讀者能夠?qū)xWorks下驅(qū)動(dòng)程序的編寫(xiě)做到胸有成竹。在各種類(lèi)型的外設(shè)驅(qū)動(dòng)介紹中,盡量在交代清楚驅(qū)動(dòng)結(jié)構(gòu)和內(nèi)核接口之后,借助具體的例子幫助讀者理解,但是基于每種設(shè)備 的一個(gè)實(shí)際驅(qū)動(dòng)代碼動(dòng)輒上千行(網(wǎng)

5、口驅(qū)動(dòng)可達(dá)3千多行),且無(wú)法對(duì)一個(gè)具體設(shè)備交代其所有的方面,故只能以一種代碼片段示例的方式進(jìn)行講述,著重加深讀者對(duì)某些概念的理解。了解一個(gè)操作系統(tǒng)最好的方式不是一開(kāi)始就去閱讀操作系統(tǒng)源代碼。在這個(gè)操作系統(tǒng)下編寫(xiě)設(shè)備驅(qū)動(dòng)應(yīng)該是最直接、最有效的方式。編寫(xiě)驅(qū)動(dòng)可以讓你直接對(duì)操作系統(tǒng)的某個(gè)子系統(tǒng)有詳細(xì)的了解,明白為何代 碼并不像你想象的那么工作,當(dāng)你完全掌握一個(gè)驅(qū)動(dòng)(無(wú)論多么簡(jiǎn)單)的調(diào)用后,你對(duì)原先學(xué)習(xí)的一些理 論和概念會(huì)有一個(gè)全新的認(rèn)識(shí)。設(shè)備驅(qū)動(dòng)的功能辛國(guó)免尊替洵電話(huà):400-706-T8B0雙休日及E假m為便手機(jī):15010的伯88巧01越90966FAR專(zhuān)業(yè)始于專(zhuān)注卓識(shí)源于遠(yuǎn)見(jiàn)辛國(guó)免尊替洵電話(huà):

6、400-706-T8B0雙休日及E假m為便手機(jī):15010的伯88巧01越90966FAR專(zhuān)業(yè)始于專(zhuān)注卓識(shí)源于遠(yuǎn)見(jiàn)作為一個(gè)驅(qū)動(dòng)程序員,你在驅(qū)動(dòng)編寫(xiě)時(shí)間和驅(qū)動(dòng)所提供的靈活性之間有很大的決定權(quán)進(jìn)行選擇。一個(gè) 驅(qū)動(dòng)可以設(shè)計(jì)為只提供基本的功能或者實(shí)現(xiàn)一種非常靈活的底層機(jī)制供用戶(hù)使用,完全由驅(qū)動(dòng)程序員自己 決定。值得提出的是,驅(qū)動(dòng)僅僅提供了一種機(jī)制,如何使用這個(gè)驅(qū)動(dòng)則是用戶(hù)的策略。驅(qū)動(dòng)程序中包括主 動(dòng)和被動(dòng)兩個(gè)方面的因素,其主動(dòng)性體現(xiàn)在對(duì)所驅(qū)動(dòng)的硬件上,一個(gè)典型的例子就是網(wǎng)卡驅(qū)動(dòng),其平時(shí)不 間斷地從網(wǎng)卡主動(dòng)接收數(shù)據(jù)包,而不需要用戶(hù)的任何干預(yù);被動(dòng)性則體現(xiàn)在對(duì)上層用戶(hù)的響應(yīng)上,如果用 戶(hù)不提出請(qǐng)求,底層驅(qū)

7、動(dòng)是不會(huì)主動(dòng)進(jìn)行服務(wù)的,如網(wǎng)卡驅(qū)動(dòng)在接收網(wǎng)絡(luò)數(shù)據(jù)包后只是將數(shù)據(jù)包交給操作 系統(tǒng)本身進(jìn)行管理,而并非交給某個(gè)用戶(hù)。只當(dāng)用戶(hù)進(jìn)行數(shù)據(jù)請(qǐng)求時(shí),這些數(shù)據(jù)才遞交給用戶(hù)。底層驅(qū)動(dòng) 這兩個(gè)方面的表現(xiàn)正好體現(xiàn)了驅(qū)動(dòng)僅僅是提供了一種服務(wù)機(jī)制,而如何使用這種機(jī)制就完全由用戶(hù)決定。驅(qū)動(dòng)程序員在編寫(xiě)底層驅(qū)動(dòng)代碼時(shí),必須注意的一點(diǎn)是:不可以對(duì)用戶(hù)使用該驅(qū)動(dòng)強(qiáng)加某種前提條件。換句話(huà)說(shuō),不能將驅(qū)動(dòng)設(shè)計(jì)為將硬件固定為某種工作方式,用戶(hù)只能通過(guò)該方式進(jìn)行服務(wù)請(qǐng)求。驅(qū)動(dòng)僅僅 是驅(qū)動(dòng)硬件工作,至于如何工作,則應(yīng)該完全交由用戶(hù)決定。 我們將這種驅(qū)動(dòng)稱(chēng)為具有靈活性的驅(qū)動(dòng)程序。如前文所述,驅(qū)動(dòng)程序是位于用戶(hù)和硬件之間的一個(gè)軟件層,驅(qū)動(dòng)程

8、序員完全有權(quán)決定一個(gè)硬件設(shè)備 以何種形式呈現(xiàn)給用戶(hù),不同的驅(qū)動(dòng)程序可以使得同一個(gè)硬件設(shè)備以不同的方式對(duì)用戶(hù)可見(jiàn)。我們可以將 一個(gè)實(shí)際的塊設(shè)備以字符設(shè)備對(duì)用戶(hù)可見(jiàn),將一個(gè)實(shí)際的Flash設(shè)備以硬盤(pán)設(shè)備對(duì)用戶(hù)可見(jiàn),以何種形式表現(xiàn)一個(gè)實(shí)際的設(shè)備完全由底層驅(qū)動(dòng)控制。驅(qū)動(dòng)程序員可以提供一系列方式讓用戶(hù)對(duì)設(shè)備進(jìn)行控制,甚至 可以讓用戶(hù)直接操作硬件設(shè)備的每一個(gè)寄存器,由用戶(hù)在寄存器層次對(duì)硬件設(shè)備進(jìn)行操作;或者只提供一 個(gè)讀或?qū)懖僮?,屏蔽其他所有的操作等。故從宏觀角度而言,驅(qū)動(dòng)程序?qū)崿F(xiàn)的功能即提供一種底層服務(wù)機(jī)制供用戶(hù)進(jìn)行選擇。從微觀角度而言,驅(qū)動(dòng)程序需要向下配置硬件寄存器,完成對(duì)設(shè)備數(shù)據(jù)的讀寫(xiě),對(duì)設(shè)備本身的

9、控制,對(duì)上使設(shè)備能夠響應(yīng)用 戶(hù)的服務(wù)請(qǐng)求,這些服務(wù)請(qǐng)求包括:打開(kāi)設(shè)備、讀寫(xiě)設(shè)備、控制設(shè)備和關(guān)閉設(shè)備。11設(shè)備驅(qū)動(dòng)的結(jié)構(gòu)13(下品牌 vwvw(厳人畫(huà)學(xué)眈wWw.farSighLCWrt.Crt (帝彷辛琉辛國(guó)免尊替洵電話(huà):400-706-T8B0雙休日及E假m為便手機(jī):15010的伯88巧01越90966專(zhuān)業(yè)始于專(zhuān)注卓識(shí)源于遠(yuǎn)見(jiàn)可以說(shuō),所有的設(shè)備驅(qū)動(dòng)都具有相同的結(jié)構(gòu)組織。這或許可以從用戶(hù)層進(jìn)行理解:所有的設(shè)備在用戶(hù) 層都以同一套標(biāo)準(zhǔn)的接口對(duì)用戶(hù)可見(jiàn)。這些標(biāo)準(zhǔn)的用戶(hù)請(qǐng)求經(jīng)過(guò)層層傳遞,最后到達(dá)底層驅(qū)動(dòng),對(duì)于每個(gè) 標(biāo)準(zhǔn)請(qǐng)求,底層驅(qū)動(dòng)都必須有一個(gè)對(duì)應(yīng)的響應(yīng)函數(shù),這就決定了幾乎所有的底層驅(qū)動(dòng)都具有相同的

10、結(jié)構(gòu)。 然而對(duì)用戶(hù)請(qǐng)求進(jìn)行響應(yīng)并非驅(qū)動(dòng)全部,這僅僅是構(gòu)成底層驅(qū)動(dòng)被動(dòng)的一面,其主動(dòng)的一面則體現(xiàn)在對(duì)硬 件的操作上。設(shè)備驅(qū)動(dòng)被動(dòng)和主動(dòng)兩個(gè)方面的特性決定了設(shè)備驅(qū)動(dòng)基本的架構(gòu):對(duì)上提供一套內(nèi)核標(biāo)準(zhǔn)接 口響應(yīng)函數(shù),對(duì)下提供硬件驅(qū)動(dòng)和硬件中斷響應(yīng)函數(shù)。為了實(shí)現(xiàn)用戶(hù)層調(diào)用的標(biāo)準(zhǔn)化,操作系統(tǒng)對(duì)每種類(lèi)型設(shè)備的驅(qū)動(dòng)都有一套標(biāo)準(zhǔn)的接口函數(shù),底層驅(qū)動(dòng) 必須實(shí)現(xiàn)這些函數(shù),并將這些函數(shù)的地址注冊(cè)給操作系統(tǒng),如此當(dāng)用戶(hù)請(qǐng)求某項(xiàng)服務(wù)時(shí),操作系統(tǒng)可以調(diào) 用底層驅(qū)動(dòng)對(duì)應(yīng)的函數(shù)進(jìn)行響應(yīng)。此時(shí)操作系統(tǒng)作為主動(dòng)方主動(dòng)調(diào)用底層驅(qū)動(dòng)提供的函數(shù),以達(dá)到用戶(hù)與 底層驅(qū)動(dòng)的交互。另一方面,為了與實(shí)際硬件設(shè)備進(jìn)行交互,底層驅(qū)動(dòng)也需要一種通知機(jī)

11、制,這種機(jī)制通 常就是中斷。一個(gè)用戶(hù)的請(qǐng)求到來(lái)時(shí),底層驅(qū)動(dòng)某個(gè)函數(shù)被操作系統(tǒng)調(diào)用進(jìn)行響應(yīng),該函數(shù)配置硬件相關(guān) 寄存器服務(wù)該請(qǐng)求。硬件完成該請(qǐng)求后,必須反過(guò)來(lái)通知底層驅(qū)動(dòng)表示服務(wù)已經(jīng)完成。硬件通過(guò)的方式一 般就是中斷。故底層驅(qū)動(dòng)必須有一個(gè)針對(duì)驅(qū)動(dòng)硬件中斷發(fā)生的中斷響應(yīng)函數(shù)。底層驅(qū)動(dòng)中斷響應(yīng)函數(shù)一旦 被調(diào)用,就表示用戶(hù)請(qǐng)求的某項(xiàng)服務(wù)已經(jīng)完成,大多數(shù)時(shí)候,這個(gè)完成的狀態(tài)需要通知給用戶(hù),故從這個(gè) 方面來(lái)看,內(nèi)核本身也需要提供一個(gè)回調(diào)函數(shù)給底層驅(qū)動(dòng),從而完成底層驅(qū)動(dòng)向用戶(hù)的主動(dòng)通知,用戶(hù)在 得到通知后可以采取下一步的操作。由此,我們可以總結(jié)設(shè)備驅(qū)動(dòng)的通用架構(gòu):一套需要提供給操作系統(tǒng)的標(biāo)準(zhǔn)操作函數(shù)。一個(gè)硬

12、件中斷響應(yīng)函數(shù)。一個(gè)(或一套)由內(nèi)核提供給底層驅(qū)動(dòng)的回調(diào)函數(shù)指針,用以存儲(chǔ)內(nèi)核回調(diào)函數(shù)的地址。設(shè)備驅(qū)動(dòng)注冊(cè)和初始化函數(shù)。以上四點(diǎn)基本構(gòu)成了所有設(shè)備驅(qū)動(dòng)的結(jié)構(gòu)組織。至于對(duì)前三個(gè)方面如何進(jìn)行封裝,則由具體的設(shè)備類(lèi) 型決定。對(duì)于第一個(gè)方面底層驅(qū)動(dòng)提供給操作系統(tǒng)的標(biāo)準(zhǔn)操作函數(shù),我們可以進(jìn)一步細(xì)化,細(xì)化的基本依 據(jù)就是用戶(hù)層標(biāo)準(zhǔn)接口。這些函數(shù)包括:設(shè)備打開(kāi)函數(shù):完成設(shè)備的初始化,注冊(cè)底層驅(qū)動(dòng)硬件中斷響應(yīng)函數(shù),使能設(shè)備工作。設(shè)備讀寫(xiě)函數(shù):完成與設(shè)備數(shù)據(jù)的交互。設(shè)備關(guān)閉函數(shù):禁止設(shè)備工作,注銷(xiāo)底層驅(qū)動(dòng)硬件中斷響應(yīng)函數(shù)。設(shè)備控制函數(shù):對(duì)設(shè)備的工作方式進(jìn)行控制。以上討論中,將設(shè)備的初始化作為設(shè)備打開(kāi)函數(shù)實(shí)現(xiàn)的一

13、部分,這通常是不準(zhǔn)確的。底層驅(qū)動(dòng)是作為 操作系統(tǒng)映像的一部分存在的,即其屬于內(nèi)核代碼,設(shè)備初始化通常在操作系統(tǒng)啟動(dòng)過(guò)程中完成。換句話(huà) 說(shuō),設(shè)備初始化將作為一個(gè)獨(dú)立的函數(shù)被實(shí)現(xiàn),在操作系統(tǒng)啟動(dòng)過(guò)程中作為啟動(dòng)的一部分被調(diào)用。此時(shí)設(shè) 備打開(kāi)函數(shù)實(shí)現(xiàn)中將剔除設(shè)備初始化的代碼,一般只需要完成中斷函數(shù)的注冊(cè)和設(shè)備的使能。另外,很多 開(kāi)發(fā)者將中斷注冊(cè)也作為設(shè)備初始化的一部分,這并非是一個(gè)錯(cuò)誤,但基于現(xiàn)在中斷號(hào)一般都是共享的, 故推薦只有在設(shè)備真正工作時(shí),才注冊(cè)中斷處理函數(shù)。 設(shè)備打開(kāi)函數(shù)中注冊(cè)中斷基本上已經(jīng)成為一個(gè)約定。以上列出的四個(gè)函數(shù)需要注冊(cè)給內(nèi)核,這個(gè)注冊(cè)的過(guò)程以及設(shè)備節(jié)點(diǎn)的創(chuàng)建通常也是在設(shè)”備初始化

14、函數(shù)中完成的。這樣操作系統(tǒng)啟動(dòng)完成后,用戶(hù)才有機(jī)會(huì)通過(guò)這些函數(shù)對(duì)設(shè)備進(jìn)行操*作。所以基于這些考慮,我們還需要為設(shè)備驅(qū)動(dòng)通用架構(gòu)再加上一條:設(shè)備驅(qū)動(dòng)注冊(cè)和初始化函數(shù),這即是上面第 4點(diǎn)的由來(lái)。11設(shè)備驅(qū)動(dòng)的基本特點(diǎn)4.3.1驅(qū)動(dòng)代碼執(zhí)行環(huán)境任務(wù)和中斷上下文辛闖H割替曲電詒:400-706-168C雙諱日及書(shū)叫日但班手扌1:估01039093已IS0103閤能6設(shè)備驅(qū)動(dòng)代碼是執(zhí)行在內(nèi)核環(huán)境下的,這是籠統(tǒng)的說(shuō)法。實(shí)際上,驅(qū)動(dòng)代碼具有兩個(gè)執(zhí)行環(huán)境,一個(gè) 是任務(wù)上下文,一個(gè)是中斷上下文。除了中斷響應(yīng)函數(shù)執(zhí)行在中斷上下文之外,其他所有的函數(shù)均執(zhí)行在 任務(wù)上下文。這個(gè)任務(wù)上下文對(duì)應(yīng)的任務(wù)就是當(dāng)前對(duì)設(shè)備進(jìn)行某

15、種服務(wù)請(qǐng)求的用戶(hù)任務(wù)或內(nèi)核任務(wù)。在 VxWorks下處于一個(gè)任務(wù)的上下文中僅僅是指在執(zhí)行驅(qū)動(dòng)代碼時(shí)可以被掛起,代碼使用的棧是任務(wù)棧,代 碼可被中斷搶斷,包括其自身中斷。所以,如果驅(qū)動(dòng)中某個(gè)函數(shù)與驅(qū)動(dòng)中斷處理程序共享同一資源,則要 避免形成資源的破壞,在這種情況下,大多使用intLock+taskLock組合保護(hù)任務(wù)上下文。內(nèi)核提供的回調(diào)函數(shù)雖然不是驅(qū)動(dòng)自身的代碼,但是也是在驅(qū)動(dòng)中被調(diào)用, 這些回調(diào)函數(shù)一般由底層驅(qū)動(dòng)中斷響應(yīng)函數(shù)進(jìn)行調(diào)用,故是執(zhí)行在中斷上下文中的。內(nèi)核在實(shí)現(xiàn)這些回調(diào)函數(shù)時(shí)已經(jīng)注意到這一點(diǎn),故在中斷上下文中執(zhí) 行不會(huì)造成問(wèn)題。關(guān)于內(nèi)核回調(diào)函數(shù)的具體實(shí)例,讀者可參考本書(shū)“串口驅(qū)動(dòng)”

16、一章。432設(shè)備基本分類(lèi)根據(jù)設(shè)備的工作方式和數(shù)據(jù)存儲(chǔ)或者來(lái)源不同,可以將設(shè)備分為三大類(lèi)型。(1)字符設(shè)備類(lèi)型字符設(shè)備即以字節(jié)流的方式被訪問(wèn),就如同一個(gè)文件,但不同于文件之處是字符設(shè)備一般不可以移動(dòng) 文件偏移指針,而只能順序地訪問(wèn)數(shù)據(jù)。終端設(shè)備以及串口設(shè)備都屬于字符設(shè)備類(lèi)型。字符設(shè)備驅(qū)動(dòng)至少 需要實(shí)現(xiàn)open、close、read和write四個(gè)系統(tǒng)調(diào)用底層實(shí)現(xiàn)函數(shù)。(2)塊設(shè)備類(lèi)型塊設(shè)備一般通過(guò)文件系統(tǒng)訪問(wèn),而塊設(shè)備使用最多的方式也是文件方式。塊設(shè)備一般不能對(duì)單個(gè)字節(jié) 進(jìn)行訪問(wèn),而是以一個(gè)塊的方式(如硬盤(pán)以一個(gè)扇區(qū)(512B )為單元進(jìn)行訪問(wèn))進(jìn)行。塊設(shè)備允許同一數(shù)據(jù)的反復(fù)讀取和寫(xiě)入。最典型的

17、塊設(shè)備就是硬盤(pán),F(xiàn)lash設(shè)備也是一種塊設(shè)備。Jr(3)網(wǎng)絡(luò)設(shè)備類(lèi)型這是比較特殊的一類(lèi)設(shè)備,這類(lèi)設(shè)備用于與網(wǎng)絡(luò)上其他主機(jī)進(jìn)行通信,其數(shù)據(jù)讀取方式類(lèi)似于字符設(shè) 備,不可以對(duì)同一數(shù)據(jù)進(jìn)行反復(fù)讀寫(xiě),只能順序讀寫(xiě)數(shù)據(jù),且該類(lèi)型設(shè)備區(qū)別于字符設(shè)備和塊設(shè)備的一個(gè) 很大的不同是,其不提供文件節(jié)點(diǎn),任務(wù)若要訪問(wèn)一個(gè)網(wǎng)絡(luò)設(shè)備,必須使用另一套網(wǎng)絡(luò)套接字接口函數(shù)進(jìn) 行,與文件系統(tǒng)則完全不相關(guān)。網(wǎng)絡(luò)設(shè)備底層數(shù)據(jù)傳輸上以塊的方式進(jìn)行,但是又不同于塊設(shè)備中數(shù)據(jù)塊 的概念,網(wǎng)絡(luò)設(shè)備中塊的大小可以改變,但是有一個(gè)區(qū)間范圍。以上只是設(shè)備類(lèi)型的劃分方式之一,事實(shí)上,按以上的劃分標(biāo)準(zhǔn),某些設(shè)備接口在某些情況下可以表 現(xiàn)為以上三種形

18、式的任意一種,如USB接口;可以是一個(gè)字符設(shè)備,如USB串口;也可以是一個(gè)塊設(shè)備,如USB內(nèi)存卡;還可以是一個(gè)網(wǎng)絡(luò)設(shè)備,如USB網(wǎng)絡(luò)接口。4.3.3驅(qū)動(dòng)代碼安全性一一參數(shù)合法性檢查VxWorks不支持驅(qū)動(dòng)程序的動(dòng)態(tài)加載,驅(qū)動(dòng)程序一般實(shí)現(xiàn)為內(nèi)核代碼的一部分,故安全性方面的問(wèn)題 出現(xiàn)較少,但是在編程時(shí)應(yīng)遵循的基本安全規(guī)則必須牢記:對(duì)于用戶(hù)輸入的任何參數(shù)都必須經(jīng)過(guò)檢查后方 可使用,且對(duì)于不合法或不合理的參數(shù),必須終止服務(wù)。在某些特殊情況下,對(duì)于一個(gè)外設(shè)硬件的控制,可能通過(guò)一個(gè)用戶(hù)層任務(wù)進(jìn)行,此時(shí)可以認(rèn)為這個(gè)驅(qū) 動(dòng)實(shí)現(xiàn)在用戶(hù)層,這時(shí)就需要特別注意。對(duì)于VxWorks這樣一個(gè)不區(qū)分運(yùn)行級(jí)別的操作系統(tǒng)而言

19、,不存在通用操作系統(tǒng)下的用戶(hù)層和內(nèi)核層的概念。通常,我們?cè)赩xWorks下講到用戶(hù)層,僅僅是指任務(wù)運(yùn)行的代碼是用戶(hù)代碼,而非內(nèi)核代碼,且僅此而已。事實(shí)上,在VxWorks下,用戶(hù)可以直接調(diào)用任意的內(nèi)核函數(shù)而不會(huì)出現(xiàn)調(diào)用權(quán)限不夠的情況,這主要是由VxWorks操作系統(tǒng)應(yīng)用環(huán)境決定的。 故安全性在VxWorks下更多的是指盡量排除代碼中固有的 BUG, 而不是防止某些用戶(hù)惡意的行為。忙京| .二海|逅tji |威科|南京|武渭|西安|廣州4.3.4驅(qū)動(dòng)基本工作模式輪詢(xún)和中斷隼務(wù)通屯林育團(tuán):如林Arhmjam施下品牌wvvw.由rribftdueQ【巌入直學(xué)底)www.farsight (i設(shè)備驅(qū)動(dòng)

20、從總體上分為兩種工作模式:輪詢(xún)模式和中斷模式。輪詢(xún)模式通過(guò)檢測(cè)相關(guān)寄存器狀態(tài)位來(lái) 決定是否進(jìn)行下一步操作;而中斷則用以通知某個(gè)操作已經(jīng)完成,可以進(jìn)行下一個(gè)操作了。二者的根本區(qū) 別在于輪詢(xún)方式在等待操作完成的過(guò)程中需要CPU等待,而中斷則將 CPU從等待中解放出來(lái),在硬件完成一個(gè)用戶(hù)請(qǐng)求的過(guò)程中, CPU可以運(yùn)行其他任務(wù),當(dāng)硬件完成請(qǐng)求后,發(fā)出一個(gè)中斷,再次引起驅(qū)動(dòng)的 注意,驅(qū)動(dòng)可以在中斷響應(yīng)函數(shù)中啟動(dòng)下一個(gè)操作。從CPU使用的效率而言,好像中斷方式一定優(yōu)于輪詢(xún)方式,其實(shí)不然。輪詢(xún)方式被使用在很多場(chǎng)合,即便這些場(chǎng)合支持中斷模式,如串口、SPI 口等速率較低的設(shè)備,實(shí)際工作中,很多都是通過(guò)查詢(xún)狀態(tài)

21、位來(lái)進(jìn)行讀寫(xiě)的。以串口為例,其支持中斷工作模式,但是使用中斷有如下缺點(diǎn):如果每發(fā)送或者接收一個(gè)字節(jié)就產(chǎn)生 一個(gè)中斷,由于中斷響應(yīng)需要消耗資源,頻繁地中斷不但不能加快數(shù)據(jù)收發(fā)速率,而且會(huì)極大地影響著整 個(gè)系統(tǒng)的性能。為了更好地服務(wù)中斷, 現(xiàn)在串口設(shè)備大多內(nèi)部集成 FIFO,可以設(shè)置FIFO級(jí)別、控制中斷發(fā)生時(shí) FIFO 的空閑度或者占用度,將串口從單個(gè)字節(jié)的中斷中解放出來(lái),但是這種FIFO 般容量較?。ㄈ绯R?jiàn)的16B),當(dāng)串口進(jìn)行大量數(shù)據(jù)的傳輸時(shí),中斷頻率依然較大,但相比查詢(xún)方式而言,效率還是有很大的提高; 其次,對(duì)于少量數(shù)據(jù),由于沒(méi)有達(dá)到中斷產(chǎn)生的字節(jié)數(shù),這些數(shù)據(jù)一直無(wú)法提供給驅(qū)動(dòng),造成數(shù)據(jù)的

22、延遲,在某 些情況下,這是不可容忍的。所以需要根據(jù)實(shí)際情況選擇工作模式。通常情況下,串口只是用于少量信息傳輸?shù)膶?shí)現(xiàn),VxWorks下,Shell通常也是建立在串口之上,所以需要使用串口傳遞信息量較少的命令,此時(shí)使用FIFO就有些不合適,故大多數(shù)情況下,串口都工作在輪詢(xún)模式下。以發(fā)送為例,每次驅(qū)動(dòng)將一個(gè)字節(jié)的數(shù)據(jù)寫(xiě)入串口數(shù)據(jù)發(fā)送寄存器后,就不斷地檢查狀態(tài)寄存 器,查看這個(gè)字節(jié)是否被發(fā)送出去,如果沒(méi)有,則不斷地進(jìn)行查詢(xún),一旦查詢(xún)到這個(gè)字節(jié)已成功發(fā)送,則 取下一個(gè)待發(fā)送的字節(jié)進(jìn)行發(fā)送,直到當(dāng)前內(nèi)核串口緩存中所有的字節(jié)均已發(fā)送完畢。這種方式可以將寫(xiě) 入串口的數(shù)據(jù)及時(shí)通過(guò)串口打印出來(lái)。只不過(guò)在打印之時(shí)會(huì)

23、占用CPU資源,不過(guò)從宏觀上來(lái)看,除了對(duì)1進(jìn)行打印的任務(wù)造成一些延遲,并不會(huì)對(duì)整個(gè)系統(tǒng)的性能造成影響。所以從表面上看,中斷好像優(yōu)于輪詢(xún)模式,這只是單從 CPU使用的角度考慮問(wèn)題的,從實(shí)際工作情況出發(fā),二者使用的范圍都比較廣。可以做如下總結(jié):中斷使用在數(shù)據(jù)量較大的場(chǎng)合;輪詢(xún)使用在數(shù)據(jù)量較少的場(chǎng)合。435驅(qū)動(dòng)與硬件數(shù)據(jù)的交互方式一一DMA和直接復(fù)制驅(qū)動(dòng)與硬件之間的數(shù)據(jù)交互方式主要分為兩種: DMA方式和直接復(fù)制方式。 DMA方式將CPU從數(shù) 據(jù)復(fù)制過(guò)程中解放出來(lái),數(shù)據(jù)復(fù)制操作由DMA控制器專(zhuān)門(mén)負(fù)責(zé),最典型的使用實(shí)例即硬盤(pán)數(shù)據(jù)復(fù)制。 DMA 方式不能單獨(dú)工作,一定要借助中斷,所以DMA方式一般使用在

24、大批量數(shù)據(jù)的復(fù)制上,即便數(shù)據(jù)輸入 /輸出速率很大的網(wǎng)口設(shè)備也較少使用 DMA方式,而是驅(qū)動(dòng)直接從網(wǎng)卡設(shè)備硬件緩沖區(qū)中復(fù)制網(wǎng)絡(luò)數(shù)據(jù)包。DMA方式在嵌入式系統(tǒng)下使用的概率較小,因?yàn)榍度胧较到y(tǒng)很少有機(jī)會(huì)進(jìn)行大批量數(shù)據(jù)的傳輸,而且DMA方式從創(chuàng)建數(shù)據(jù)復(fù)制環(huán)境到數(shù)據(jù)復(fù)制完成,再到CPU的后續(xù)處理,都具有較大的延遲,不利于對(duì)速度要求較高的場(chǎng)合。DMA最大的好處是數(shù)據(jù)在復(fù)制過(guò)程中無(wú)須CPU的干預(yù),CPU可以獨(dú)立出來(lái)運(yùn)行其他任務(wù),然而在很多場(chǎng)合,如果數(shù)據(jù)沒(méi)有完成復(fù)制,CPU也沒(méi)有其他什么“活”可以做,這一點(diǎn)在嵌入式系統(tǒng)下就尤為突出。故雖然很多書(shū)中在介紹與硬件之間的數(shù)據(jù)交互方式時(shí),都會(huì)介紹DMA方式,但是實(shí)際上

25、從外設(shè)驅(qū)動(dòng)的角度看, DMA使用的概率比較小。4.3.6 其他注意事項(xiàng) Volatile關(guān)鍵字外設(shè)驅(qū)動(dòng)代碼編寫(xiě)中有一個(gè)問(wèn)題值得注意,不單是外設(shè)驅(qū)動(dòng),所有對(duì)外設(shè)寄存器進(jìn)行操作的代碼都必 須注意一個(gè)問(wèn)題,即對(duì)外設(shè)寄存器的操作必須使用volatile修飾符。雖然可以在VxWorks提供的sysPhysMemDesc數(shù)組初始化時(shí)將外設(shè)寄存器區(qū)間設(shè)置為non-cachable,但是還是要使用 volatile修飾符,因?yàn)镸MU機(jī)制并非在任何條件下都有效,如bootrom運(yùn)行期間就不使用 MMU機(jī)制,且VxWorks啟動(dòng)的忙京| .二海|逅tji |威科|南京|武渭|西安|廣州早期階段也沒(méi)有 MMU機(jī)制的

26、幫助,而在這個(gè)過(guò)程中都需要對(duì)外設(shè)進(jìn)行操作。隼務(wù)通屯林育團(tuán):如林Arhmjam施下品牌wvvw.由rribftdueQ【巌入直學(xué)底)www.farsight (i 辛民企劇遜詢(xún)電諸:400-706-T£60雙休1 S0103S09BB, ISO1O3W96專(zhuān)業(yè)始于專(zhuān)注卓識(shí)源于遠(yuǎn)見(jiàn)很多驅(qū)動(dòng)程序出現(xiàn)一些異常的問(wèn)題,仔細(xì)檢查每個(gè)寄存器的配置都沒(méi)有問(wèn)題,甚至從網(wǎng)上下載一個(gè)針對(duì)該硬件的標(biāo)準(zhǔn)配置程序,在其他平臺(tái)上可用,但是就是在自己的平臺(tái)上運(yùn)行不正常,此時(shí)就需要特別注 意設(shè)備的寄存器區(qū)域是否都定義在volatile型。volatile是一個(gè)C語(yǔ)言規(guī)范中定義的修飾符,當(dāng)一個(gè)變量使用該修飾符進(jìn)行定義時(shí)

27、,就表示 CPU對(duì)該變量的每次訪問(wèn)都從RAM中(寄存器實(shí)際上也是RAM )取,而不要使用CPU內(nèi)部的cache值,或者簡(jiǎn)單地說(shuō),使用volatile修飾符就是從單個(gè)變量的層次上禁止cache。11本章小結(jié)辛岡甕封跡面電話(huà):400-706-TfiBC 雙休日屋宅憫于勺蚱手仏150103S09BB, 1501039096專(zhuān)業(yè)始于專(zhuān)注卓識(shí)源于遠(yuǎn)見(jiàn)辛岡甕封跡面電話(huà):400-706-TfiBC 雙休日屋宅憫于勺蚱手仏150103S09BB, 1501039096專(zhuān)業(yè)始于專(zhuān)注卓識(shí)源于遠(yuǎn)見(jiàn)本章從整體上對(duì)設(shè)備驅(qū)動(dòng)進(jìn)行了闡述,說(shuō)明了設(shè)備驅(qū)動(dòng)的基本功能和特點(diǎn),使得沒(méi)有驅(qū)動(dòng)經(jīng)驗(yàn)的讀者有了大致的了解。當(dāng)然,如此陳述性的“

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論