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