實(shí)時嵌入式操作系統(tǒng)VxWorks設(shè)備驅(qū)動程序的設(shè)計(jì)
掃描二維碼
隨時隨地手機(jī)看文章
摘要:在嵌入式實(shí)時系統(tǒng)中進(jìn)行軟硬件開發(fā)的關(guān)鍵是編寫高效可靠的設(shè)備驅(qū)動程序,而VxWorks下END網(wǎng)口驅(qū)動程序是設(shè)備驅(qū)動程序中較為復(fù)雜的一類。首先從整體上分析了VxWorks操作系統(tǒng)的特點(diǎn)與結(jié)構(gòu),然后介紹了VxWorks中設(shè)備驅(qū)動程序的功能、結(jié)構(gòu)和開發(fā)方法,并給出了END網(wǎng)口驅(qū)動程序的設(shè)計(jì)實(shí)例。該文時VxWorks設(shè)備驅(qū)動程序開發(fā)者具有參考價(jià)值,通過本文可以方便的進(jìn)行END驅(qū)動的配置和使用。
關(guān)鍵詞:實(shí)時操作系統(tǒng);板級支持包;設(shè)備驅(qū)動程序;END網(wǎng)口驅(qū)動
VxWorks是WindRiver公司開發(fā)的一種高性能的嵌入式實(shí)時操作系統(tǒng)(RTOS),以其優(yōu)良的可靠性、開放性、實(shí)時性和易用性贏得了大量的客戶。VxWorks是目前嵌入式系統(tǒng)領(lǐng)域中使用最廣泛、市場占有率最高的系統(tǒng),被廣泛地應(yīng)用在通信、軍事、航空、航天等高精尖技術(shù)及實(shí)時性要求極高的領(lǐng)域中,如衛(wèi)星通訊、軍事演習(xí)、彈道制導(dǎo)、飛機(jī)導(dǎo)航等。
在目前多數(shù)操作系統(tǒng)中,用戶必須通過驅(qū)動程序才能與設(shè)備進(jìn)行交互,正是設(shè)備驅(qū)動程序?yàn)槠涮峁┝丝稍L問性和可操作性,而設(shè)備驅(qū)動程序本身跟操作系統(tǒng)的相關(guān)性特別密切。本文針對VxWorks操作系統(tǒng)特點(diǎn),分析設(shè)備驅(qū)動程序的功能、組成和開發(fā)過程,并給出END網(wǎng)口驅(qū)動程序的一個設(shè)計(jì)實(shí)例。
1 嵌入式實(shí)時操作系統(tǒng)VxWorks
下面首先圍繞VxWorks的特點(diǎn)和結(jié)構(gòu)這兩個關(guān)鍵問題進(jìn)行闡述。
1.1 VxWorks的特點(diǎn)
1)可靠性 操作系統(tǒng)的用戶希望在一個工作穩(wěn)定、可以信賴的環(huán)境中工作,所以操作系統(tǒng)的可靠性是用戶首先要考慮的問題。而穩(wěn)定、可靠一直是VxWorks的一個突出優(yōu)點(diǎn)。自從對中國的銷售解禁以來,VxWorks以其良好的可靠性在中國贏得了越來越多的用戶。
2)實(shí)時性 實(shí)時性是指能夠在限定時間內(nèi)執(zhí)行完規(guī)定的功能并對外部的異步事件做出響應(yīng)的能力。實(shí)時性的強(qiáng)弱是以完成規(guī)定功能和做出響應(yīng)時間的長短來衡量的。VxWorks的實(shí)時性非常強(qiáng),其系統(tǒng)本身的開銷很小,進(jìn)程調(diào)度、進(jìn)程間通信、中斷處理等系統(tǒng)公用程序精練而有效,它們造成的延遲很短。VxWorks提供的多任務(wù)機(jī)制中對任務(wù)的控制采用了優(yōu)先級搶占(Preemptive Priority Scheduling)和輪轉(zhuǎn)調(diào)度(Round-Robin Scheduling)機(jī)制,也充分保證了可靠的實(shí)時性,使同樣的硬件配置能滿足更強(qiáng)的實(shí)時性要求,為應(yīng)用的開發(fā)留下更大的余地。
3)可裁減性 用戶在使用操作系統(tǒng)時,并不是操作系統(tǒng)中的每一個部件都要用到。例如圖形顯示、文件系統(tǒng)以及一些設(shè)備驅(qū)動在某些嵌入式系統(tǒng)中往往并不使用。VxWorks由一個體積很小的內(nèi)核及一些可以根據(jù)需要進(jìn)行定制的系統(tǒng)模塊組成。VxWorks內(nèi)核最小為8 kB,即便加上其他必要模塊,所占用的空間也很小,且不失其實(shí)時、多任務(wù)的系統(tǒng)特征。由于它的高度靈活性,用戶可以很容易地對這一操作系統(tǒng)進(jìn)行定制或作適當(dāng)開發(fā),來滿足自己的實(shí)際應(yīng)用需要。
1.2 VxWorks系統(tǒng)結(jié)構(gòu)
VxWorks系統(tǒng)結(jié)構(gòu)如圖1所示,可以從6部分來說明。
1)高性能實(shí)時內(nèi)核(Wind Kernel) VxWorks的核心,一般稱作Wind,Wind使用中斷驅(qū)動和基于優(yōu)先級的調(diào)度方式。負(fù)責(zé)多任務(wù)調(diào)度、任務(wù)間的同步、進(jìn)程間通信機(jī)制、中斷處理、看門狗和內(nèi)存管理機(jī)制。
2)文件系統(tǒng)(File System) VxWorks提供快速文件,它包括幾種支持使用塊設(shè)備(如磁盤)的本地文件系統(tǒng)。這些設(shè)備都使用一個標(biāo)準(zhǔn)的接口,從而使得文件系統(tǒng)能夠靈活地在設(shè)備驅(qū)動程序上移植。另外,VxWorks也支持SCSI磁帶設(shè)備的本地文件系統(tǒng)。
3)設(shè)備驅(qū)動(Device Drivers) VxWorks系統(tǒng)提供BSP、Network Driver、SCSI Driver構(gòu)成硬件抽象層。硬件抽象層是一個介于操作系統(tǒng)和底層硬件之間的軟層次,包括了系統(tǒng)中大部分與硬件相關(guān)的軟件模塊。在功能上包含兩部分:系統(tǒng)初始化及與硬件相關(guān)的設(shè)備驅(qū)動。
4)I/O系統(tǒng)(I/O System) VxWorks提供了一個快速靈活的與ANSIC兼容的I/O系統(tǒng),包括UNIX標(biāo)準(zhǔn)的緩沖I/O和POSIX標(biāo)準(zhǔn)的異步I/O 。
5)網(wǎng)絡(luò)堆棧(Network Stack) VxWorks提供了對其他網(wǎng)絡(luò)和TCP/IP網(wǎng)絡(luò)系統(tǒng)的“透明”訪問,包括與BSD套接字兼容的編程接口,遠(yuǎn)程過程調(diào)用(RPC),遠(yuǎn)程文件訪問以及BOOTP和ARP代理。所有的VxWorks網(wǎng)絡(luò)機(jī)制都遵循標(biāo)準(zhǔn)的Intemet協(xié)議。
6)板級支持包 BSP(Board Support Package)板級支持包向VxWorks操作系統(tǒng)提供了對各種板子的硬件功能操作的統(tǒng)一的軟件接口,它是保證VxWorks操作系統(tǒng)可移植性的關(guān)鍵,它包括硬件初始化、中斷的產(chǎn)生和處理、硬件時鐘和計(jì)時器管理、局域和總線內(nèi)存地址映射、內(nèi)存分配等等。每個板級支持包括一個ROM啟動(Boot ROM)或其他啟動機(jī)制。[!--empirenews.page--]
2 VxWorks設(shè)備驅(qū)動程序的設(shè)計(jì)
為了實(shí)現(xiàn)應(yīng)用程序的可移植性,將應(yīng)用程序從直接操作硬件設(shè)備中解放出來,VxWorks操作系統(tǒng)為應(yīng)用程序操作硬件設(shè)備提供一個一致的接口。這個接口就是由操作系統(tǒng)的I/O系統(tǒng)提供的。I/O系統(tǒng)將應(yīng)用程序的I/O請求傳遞給設(shè)備專用的I/O函數(shù)。這些設(shè)備專用的I/0函數(shù)就是由設(shè)備驅(qū)動程序提供的。本章從功能、接口與結(jié)構(gòu)3個角度闡述設(shè)備驅(qū)動程序的設(shè)計(jì)。
2.1 設(shè)備驅(qū)動程序的功能
1)對設(shè)備進(jìn)行初始化 初始化的目的是使設(shè)備處于某種工作狀態(tài),以便用戶程序訪問該設(shè)備。
2)打開設(shè)備操作 打開設(shè)備操作實(shí)際上是查詢用戶指定的設(shè)備,并查看用戶是否可以使用該設(shè)備。因?yàn)樵O(shè)備是共享資源,當(dāng)設(shè)備正在被使用時,系統(tǒng)要對它進(jìn)行保護(hù),禁止其他任務(wù)對設(shè)備進(jìn)行操作,直到設(shè)備資源被釋放。
3)關(guān)閉設(shè)備操作 關(guān)閉設(shè)備操作就是釋放設(shè)備資源。任務(wù)對設(shè)備完成操作后,必須進(jìn)行關(guān)閉設(shè)備操作,否則設(shè)備總是處于被占用狀態(tài),其他任務(wù)無法使用。與打開設(shè)備操作相對應(yīng),有打開操作就應(yīng)該有關(guān)閉操作。
4)從設(shè)備上接收數(shù)據(jù)并提交給系統(tǒng) 這項(xiàng)功能通常就是所說的讀操作,接收外部傳輸來的數(shù)據(jù)。接收數(shù)據(jù)采用的方式有查詢方式、中斷方式和DMA方式。
5)把數(shù)據(jù)從主機(jī)上發(fā)送給設(shè)備 這項(xiàng)功能對應(yīng)通常的寫操作,把主機(jī)上的數(shù)據(jù)傳送給外界。通常系統(tǒng)主動調(diào)用該操作進(jìn)行數(shù)據(jù)發(fā)送,有時也采取中斷方式發(fā)送數(shù)據(jù)。
6)對設(shè)備進(jìn)行控制操作 在使用設(shè)備過程中,有時根據(jù)應(yīng)用的需要對設(shè)備進(jìn)行控制(例如改變設(shè)備某個狀態(tài)),而控制操作就能提供這種功能。
2.2 設(shè)備驅(qū)動程序的接口
VxWorks通用設(shè)備驅(qū)動程序基本都是通過I/O系統(tǒng)來存取的,這樣做的好處是可以屏蔽底層硬件,對上層應(yīng)用程序提供統(tǒng)一的接口。Vx-Works的I/O系統(tǒng)由基本I/O及含buffer的I/O組成,它提供標(biāo)準(zhǔn)的C庫函數(shù),基本I/O庫與Unix兼容,而含buffer的I/O則與ANSI C兼容。VxWorks的I/O系統(tǒng)有其獨(dú)特的特性,使得它比其他I/O系統(tǒng)更快速、靈活,這在實(shí)時系統(tǒng)中非常重要。還有一些特殊的通用IO設(shè)備驅(qū)動程序如串行通用IO設(shè)備驅(qū)動程序由于其自身的特性,雖然不是通過標(biāo)準(zhǔn)I/O來進(jìn)行存取的,但是也都有它們各自相關(guān)的規(guī)范。下面只介紹通過I/O系統(tǒng)存取的通用IO設(shè)備驅(qū)動程序。
VxWorks作為實(shí)時操作系統(tǒng)為了能夠更快、更靈活地進(jìn)行I/O操作,提供了若干庫來支持標(biāo)準(zhǔn)的字符設(shè)備和塊設(shè)備。一個字符設(shè)備的驅(qū)動程序和I/O系統(tǒng)直接作用,調(diào)用驅(qū)動程序安裝函數(shù)iosDrvInstall()在VxWorks中安裝驅(qū)動程序。它執(zhí)行7個基本的I/O操作:create,rem-ove,open,close,read,write和ioctl。如果設(shè)備不支持某些I/O操作,則相應(yīng)的程序可以被省略。iosDrvInstall()只是為驅(qū)動程序在驅(qū)動程序表中分配了一個位置,要運(yùn)行驅(qū)動程序還需要調(diào)用設(shè)備安裝函數(shù)iosDevAdd()。iosDevAdd()把設(shè)備名和驅(qū)動程序號寫到數(shù)據(jù)結(jié)構(gòu)DEV_ HDR中,并把它加到系統(tǒng)的設(shè)備列表中。
一個塊設(shè)備的驅(qū)動掛在文件系統(tǒng)上比直接掛在I/O系統(tǒng)上使用起來更方便。它先和文件系統(tǒng)作用,再由文件系統(tǒng)與I/O系統(tǒng)作用。塊設(shè)備驅(qū)動程序不使用iosDrvlnstall()來安裝驅(qū)動程序,而是通過初始化塊設(shè)備描述結(jié)構(gòu)BLK_DEV或順序設(shè)備描述結(jié)構(gòu)SEQ_DEV來實(shí)現(xiàn)驅(qū)動程序提供給文件系統(tǒng)的功能。類似的,塊設(shè)備驅(qū)動程序不使用iosDevAdd()來將驅(qū)動程序裝入I/O系統(tǒng),而是使用文件系統(tǒng)設(shè)備初始化函數(shù),如dos-FsDevInit()來完成。實(shí)際上,文件系統(tǒng)把自己作為一個驅(qū)動程序裝到I/O系統(tǒng)中,并把請求轉(zhuǎn)發(fā)給實(shí)際的設(shè)備驅(qū)動程序。
2.3 設(shè)備驅(qū)動程序的組成
設(shè)備驅(qū)動程序包括3部分:初始化部分、函數(shù)功能部分和中斷服務(wù)程序ISR。
1)初始化部分初始化硬件,分配設(shè)備所需的資源,完成所有與系統(tǒng)相關(guān)的設(shè)置。如果是字符設(shè)備,首先調(diào)用iosDrvInstall()來安裝驅(qū)動程序,把中斷向量和ISR掛上,然后調(diào)用iosDevAdd()將驅(qū)動程序加入I/O系統(tǒng)中;如果是塊設(shè)備,首先把中斷向量和ISR掛上,在內(nèi)存中分配一個設(shè)備結(jié)構(gòu),然后初始化該結(jié)構(gòu)。用戶要使用該設(shè)備時,先調(diào)用設(shè)備初始化函數(shù)xxlnit(),再調(diào)用設(shè)備創(chuàng)建函數(shù)xxDevCreate(),返回一個BLK_DEV結(jié)構(gòu)的指針,供文件系統(tǒng)初始化函數(shù)使用。
2)函數(shù)功能部分完成系統(tǒng)指定的功能。對于字符設(shè)備,這些函數(shù)就是指定的7個標(biāo)準(zhǔn)的I/O函數(shù);對于塊設(shè)備,則是在BLK_DEV或SEQ_DEV結(jié)構(gòu)中指定的功能函數(shù)。
3)中斷服務(wù)程序是實(shí)時系統(tǒng)的重要組成部分,系統(tǒng)通過中斷機(jī)制來了解外部事件,并作出響應(yīng)。實(shí)時系統(tǒng)的反應(yīng)速度取決于系統(tǒng)對中斷的響應(yīng)速度和中斷處理程序的處理速度。因此,中斷服務(wù)程序的處理時間應(yīng)盡量短。所有的中斷服務(wù)程序共享一個堆棧,沒有任務(wù)控制塊,所以,在中斷服務(wù)程序中不能使用可導(dǎo)致阻塞的函數(shù),如printf(…)、semTake(…)等。中斷服務(wù)程序中可以使用semGive(…)與其他的非中斷服務(wù)程序進(jìn)行通信。理想的情況,一個中斷服務(wù)程序僅調(diào)用一個semGive(…)系統(tǒng)調(diào)用,也就是說,中斷服務(wù)程序的主要功能應(yīng)該是發(fā)起一個任務(wù)來完成必要的處理。為提高中斷服務(wù)程序與任務(wù)的合作性能,最好的機(jī)制是信號量。
3 END網(wǎng)口驅(qū)動開發(fā)
經(jīng)過上述論述,本章通過END網(wǎng)口驅(qū)動的實(shí)例具體說明設(shè)備驅(qū)動程序的開發(fā)過程。
1)驅(qū)動程序的設(shè)備安裝函數(shù) 在BSP中對confidh,configNeth文件進(jìn)行修改。首先在configh中增加#define INCLUDE_END,其次在configNeth文件中endTb1中添加一行:
其中每行的第1項(xiàng)是設(shè)備的單元號;第2項(xiàng)是驅(qū)動程序的endLoad()入口點(diǎn);第3項(xiàng)是要傳給該入口點(diǎn)的字符串,該字符串通常表示內(nèi)存地址、I/O地址和中斷號等參數(shù);第4項(xiàng)表示是否支持緩沖區(qū)借出;第5項(xiàng)表示BSP私有數(shù)據(jù);第6項(xiàng)是執(zhí)行標(biāo)志,為FALSE表示該入口點(diǎn)還未被執(zhí)行,在系統(tǒng)成功裝載一個驅(qū)動程序后,該值被改為True。設(shè)置該值為True是為了防止系統(tǒng)自動裝載該驅(qū)動。做完上述工作后,驅(qū)動程序就可以添加到VxWorks中。[!--empirenews.page--]
2)設(shè)備加載函數(shù) sysEndLoad()是END網(wǎng)口驅(qū)動程序的初始化入口點(diǎn),該函數(shù)的參數(shù)由tUserRoot任務(wù)在調(diào)用muxDevLoad()傳入,muxDev-Load()進(jìn)而使用該參數(shù)調(diào)用sysEndLoad()。sysEndLoad()中執(zhí)行幾個必要操作:初始化END_OBJ結(jié)構(gòu)、初始化網(wǎng)絡(luò)緩沖內(nèi)存、初始化MIB、設(shè)置網(wǎng)絡(luò)準(zhǔn)備好標(biāo)志。其函數(shù)格式:
END_OKJ*sysEndLoad(char*initString)。其中initString由網(wǎng)絡(luò)設(shè)備表(endDevTb1[])中的成員提供。設(shè)備的所有特殊參數(shù)都是通過initString參數(shù)進(jìn)行傳遞的。它包含如下特殊參數(shù):設(shè)備寄存器基地址、中斷向量、中斷級、共享緩沖區(qū)地址等。
3)打開設(shè)備函數(shù) endStart()函數(shù)實(shí)現(xiàn)設(shè)備停止校驗(yàn)操作、注冊驅(qū)動程序的中斷服務(wù)程序、打開設(shè)備中斷、記錄設(shè)備啟動和啟動設(shè)備。它調(diào)用bsp的函數(shù)連接中斷和驅(qū)動程序設(shè)備,使設(shè)備工作在中斷模式下。其函數(shù)格式如下:
STATUS endStart(END_DEVICE*pDrvCtrl)。啟動設(shè)備成功時,返回OK。函數(shù)實(shí)現(xiàn)如下:
4)設(shè)備讀/寫 設(shè)備的讀操作和寫操作是兩個相反的動作,一個向設(shè)備發(fā)送數(shù)據(jù),一個從設(shè)備接收數(shù)據(jù)。
當(dāng)網(wǎng)絡(luò)協(xié)議層要發(fā)送數(shù)據(jù)時,協(xié)議驅(qū)動首先調(diào)用Mux層的API函數(shù)MuxSend(),MuxSend()通過調(diào)用函數(shù)endSend()把上層傳過來的數(shù)據(jù)從mblk-clblk-cluster結(jié)構(gòu)中發(fā)送到網(wǎng)絡(luò)中。
在NET_FUNCS結(jié)構(gòu)中并不提供endReceive()函數(shù)。所以接收包的實(shí)現(xiàn)要依靠中斷的觸發(fā),當(dāng)驅(qū)動軟件接收到包時引發(fā)一個接收中斷例程。該中斷把數(shù)據(jù)緩沖區(qū)cluster與mblk,clblk結(jié)構(gòu)連接。通過調(diào)用函數(shù)指針receiveRtn,指向Mux層API函數(shù)MuxReceive(),該函數(shù)把接收到的包傳到Mux層。如果該函數(shù)返回OK,表明數(shù)據(jù)包被正確傳輸。接受函數(shù)MuxReceive()通過調(diào)用函數(shù)stackRcvRtn再把數(shù)據(jù)包傳輸?shù)缴蠈訁f(xié)議層。
5)關(guān)閉設(shè)備 關(guān)閉操作是打開操作的逆過程,當(dāng)需要關(guān)閉網(wǎng)卡的時候,系統(tǒng)通過MUX層調(diào)用函數(shù)endStop()來完成。
該函數(shù)釋放中斷向量,停止接收和發(fā)送寄存器的DMA處理,并將電源放置到低功耗。
6)設(shè)備中斷管理 設(shè)備進(jìn)行讀/寫操作時使用,當(dāng)設(shè)備上接收到數(shù)據(jù)或數(shù)據(jù)發(fā)送結(jié)束時,通過觸發(fā)中斷信號。向系統(tǒng)報(bào)告這一狀態(tài),系統(tǒng)便執(zhí)行中斷服務(wù)函數(shù)進(jìn)行相應(yīng)的處理。
驅(qū)動程序在MuxDevStart()函數(shù)中連接中斷服務(wù)程序,中斷服務(wù)程序是通過intConnect()函數(shù)掛接在某個中斷向量上的,當(dāng)網(wǎng)絡(luò)層出現(xiàn)中斷時,網(wǎng)絡(luò)任務(wù)將調(diào)用中斷服務(wù)程序,中斷服務(wù)程序要調(diào)用一個函數(shù)netJobAdd(FUNCPTR routine,intparaml,int param2,int param3,int param4,int param5)其中routine指向需要處理的函數(shù)入口,5個參數(shù)可用來傳遞給處理函數(shù),中斷服務(wù)程序在網(wǎng)絡(luò)設(shè)備的數(shù)據(jù)包接收和發(fā)送中扮演著重要的角色,負(fù)責(zé)處理接收中斷和接受中斷,其過程是:讀中斷狀態(tài)寄存器,清中斷事件,根據(jù)中斷狀態(tài),調(diào)用相應(yīng)的中斷處理程序。
4 結(jié)論
嵌入式實(shí)時操作系統(tǒng)VxWorks以其占用資源少,性能穩(wěn)定等諸多優(yōu)點(diǎn)而得到了越來越廣泛的應(yīng)用。嵌入式系統(tǒng)中I/O設(shè)備是關(guān)鍵的一環(huán),為I/O設(shè)備編寫高效無誤的驅(qū)動程序是開發(fā)嵌入式系統(tǒng)的重要問題。本文分析了VxWorks中I/O設(shè)備驅(qū)動程序的結(jié)構(gòu)及其設(shè)計(jì)過程,并給出了具體設(shè)備驅(qū)動程序的開發(fā)流程。
在課題研究過程中,完成了END網(wǎng)口的驅(qū)動,并通過控制器之間的數(shù)據(jù)通信驗(yàn)證了驅(qū)動的正確性。VxWorks的I/O系統(tǒng)將設(shè)備程序作為內(nèi)核過程實(shí)現(xiàn)的實(shí)時性和可靠性有了很大的提高,更重要的是為用戶提供了統(tǒng)一的接口。為后續(xù)開發(fā)提供了更大的方便。