<address id="7rr7f"></address>

    <address id="7rr7f"><address id="7rr7f"><th id="7rr7f"></th></address></address>

        您的位置:設計參考

        設計參考

        設計參考/Design Reference

        基于嵌入式操作系統的VxWorks設備驅動程序設計

        -----2019-05-09

         VxWorks是WindRiver公司開發的一種高性能的嵌入式實時操作系統(RTOS),以其優良的可靠性、開放性、實時性和易用性贏得了大量的客戶。VxWorks是目前嵌入式系統領域中使用最廣泛、市場占有率最高的系統,被廣泛地應用在通信、軍事、航空、航天等高精尖技術及實時性要求極高的領域中,如衛星通訊、軍事演習、彈道制導、飛機導航等。

        在目前多數操作系統中,用戶必須通過驅動程序才能與設備進行交互,正是設備驅動程序為其提供了可訪問性和可操作性,而設備驅動程序本身跟操作系統的相關性特別密切。本文針對VxWorks操作系統特點,分析設備驅動程序的功能、組成和開發過程,并給出END網口驅動程序的一個設計實例。

        1 嵌入式實時操作系統VxWorks

        下面首先圍繞VxWorks的特點和結構這兩個關鍵問題進行闡述。

        1.1 VxWorks的特點

        1)可靠性 操作系統的用戶希望在一個工作穩定、可以信賴的環境中工作,所以操作系統的可靠性是用戶首先要考慮的問題。而穩定、可靠一直是VxWorks的一個突出優點。自從對中國的銷售解禁以來,VxWorks以其良好的可靠性在中國贏得了越來越多的用戶。

        2)實時性 實時性是指能夠在限定時間內執行完規定的功能并對外部的異步事件做出響應的能力。實時性的強弱是以完成規定功能和做出響應時間的長短來衡量的。VxWorks的實時性非常強,其系統本身的開銷很小,進程調度、進程間通信、中斷處理等系統公用程序精練而有效,它們造成的延遲很短。VxWorks提供的多任務機制中對任務的控制采用了優先級搶占(Preemptive Priority Scheduling)和輪轉調度(Round-Robin Scheduling)機制,也充分保證了可靠的實時性,使同樣的硬件配置能滿足更強的實時性要求,為應用的開發留下更大的余地。

        3)可裁減性 用戶在使用操作系統時,并不是操作系統中的每一個部件都要用到。例如圖形顯示、文件系統以及一些設備驅動在某些嵌入式系統中往往并不使用。VxWorks由一個體積很小的內核及一些可以根據需要進行定制的系統模塊組成。VxWorks內核最小為8 kB,即便加上其他必要模塊,所占用的空間也很小,且不失其實時、多任務的系統特征。由于它的高度靈活性,用戶可以很容易地對這一操作系統進行定制或作適當開發,來滿足自己的實際應用需要。

        1.2 VxWorks系統結構

        VxWorks系統結構如圖1所示,可以從6部分來說明。

        基于嵌入式操作系統的VxWorks設備驅動程序設計

        1)高性能實時內核(Wind Kernel) VxWorks的核心,一般稱作Wind,Wind使用中斷驅動和基于優先級的調度方式。負責多任務調度、任務間的同步、進程間通信機制、中斷處理、看門狗和內存管理機制。

        2)文件系統(File System) VxWorks提供快速文件,它包括幾種支持使用塊設備(如磁盤)的本地文件系統。這些設備都使用一個標準的接口,從而使得文件系統能夠靈活地在設備驅動程序上移植。另外,VxWorks也支持SCSI磁帶設備的本地文件系統。

        3)設備驅動(Device Drivers) VxWorks系統提供BSP、Network Driver、SCSI Driver構成硬件抽象層。硬件抽象層是一個介于操作系統和底層硬件之間的軟層次,包括了系統中大部分與硬件相關的軟件模塊。在功能上包含兩部分:系統初始化及與硬件相關的設備驅動。

        4)I/O系統(I/O System) VxWorks提供了一個快速靈活的與ANSIC兼容的I/O系統,包括UNIX標準的緩沖I/O和POSIX標準的異步I/O 。

        5)網絡堆棧(Network Stack) VxWorks提供了對其他網絡和TCP/IP網絡系統的“透明”訪問,包括與BSD套接字兼容的編程接口,遠程過程調用(RPC),遠程文件訪問以及BOOTP和ARP代理。所有的VxWorks網絡機制都遵循標準的Intemet協議。

        6)板級支持包 BSP(Board Support Package)板級支持包向VxWorks操作系統提供了對各種板子的硬件功能操作的統一的軟件接口,它是保證VxWorks操作系統可移植性的關鍵,它包括硬件初始化、中斷的產生和處理、硬件時鐘和計時器管理、局域和總線內存地址映射、內存分配等等。每個板級支持包括一個ROM啟動(Boot ROM)或其他啟動機制。

        2 VxWorks設備驅動程序的設計

        為了實現應用程序的可移植性,將應用程序從直接操作硬件設備中解放出來,VxWorks操作系統為應用程序操作硬件設備提供一個一致的接口。這個接口就是由操作系統的I/O系統提供的。I/O系統將應用程序的I/O請求傳遞給設備專用的I/O函數。這些設備專用的I/0函數就是由設備驅動程序提供的。本章從功能、接口與結構3個角度闡述設備驅動程序的設計。

        2.1 設備驅動程序的功能

        1)對設備進行初始化 初始化的目的是使設備處于某種工作狀態,以便用戶程序訪問該設備。

        2)打開設備操作 打開設備操作實際上是查詢用戶指定的設備,并查看用戶是否可以使用該設備。因為設備是共享資源,當設備正在被使用時,系統要對它進行保護,禁止其他任務對設備進行操作,直到設備資源被釋放。

        3)關閉設備操作 關閉設備操作就是釋放設備資源。任務對設備完成操作后,必須進行關閉設備操作,否則設備總是處于被占用狀態,其他任務無法使用。與打開設備操作相對應,有打開操作就應該有關閉操作。

        4)從設備上接收數據并提交給系統 這項功能通常就是所說的讀操作,接收外部傳輸來的數據。接收數據采用的方式有查詢方式、中斷方式和DMA方式。

        5)把數據從主機上發送給設備 這項功能對應通常的寫操作,把主機上的數據傳送給外界。通常系統主動調用該操作進行數據發送,有時也采取中斷方式發送數據。

        6)對設備進行控制操作 在使用設備過程中,有時根據應用的需要對設備進行控制(例如改變設備某個狀態),而控制操作就能提供這種功能。

        2.2 設備驅動程序的接口

        VxWorks通用設備驅動程序基本都是通過I/O系統來存取的,這樣做的好處是可以屏蔽底層硬件,對上層應用程序提供統一的接口。Vx-Works的I/O系統由基本I/O及含buffer的I/O組成,它提供標準的C庫函數,基本I/O庫與Unix兼容,而含buffer的I/O則與ANSI C兼容。VxWorks的I/O系統有其獨特的特性,使得它比其他I/O系統更快速、靈活,這在實時系統中非常重要。還有一些特殊的通用IO設備驅動程序如串行通用IO設備驅動程序由于其自身的特性,雖然不是通過標準I/O來進行存取的,但是也都有它們各自相關的規范。下面只介紹通過I/O系統存取的通用IO設備驅動程序。

        VxWorks作為實時操作系統為了能夠更快、更靈活地進行I/O操作,提供了若干庫來支持標準的字符設備和塊設備。一個字符設備的驅動程序和I/O系統直接作用,調用驅動程序安裝函數iosDrvInstall()在VxWorks中安裝驅動程序。它執行7個基本的I/O操作:create,rem-ove,open,close,read,write和ioctl。如果設備不支持某些I/O操作,則相應的程序可以被省略。iosDrvInstall()只是為驅動程序在驅動程序表中分配了一個位置,要運行驅動程序還需要調用設備安裝函數iosDevAdd()。iosDevAdd()把設備名和驅動程序號寫到數據結構DEV_ HDR中,并把它加到系統的設備列表中。

        一個塊設備的驅動掛在文件系統上比直接掛在I/O系統上使用起來更方便。它先和文件系統作用,再由文件系統與I/O系統作用。塊設備驅動程序不使用iosDrvlnstall()來安裝驅動程序,而是通過初始化塊設備描述結構BLK_DEV或順序設備描述結構SEQ_DEV來實現驅動程序提供給文件系統的功能。類似的,塊設備驅動程序不使用iosDevAdd()來將驅動程序裝入I/O系統,而是使用文件系統設備初始化函數,如dos-FsDevInit()來完成。實際上,文件系統把自己作為一個驅動程序裝到I/O系統中,并把請求轉發給實際的設備驅動程序。

        2.3 設備驅動程序的組成

        設備驅動程序包括3部分:初始化部分、函數功能部分和中斷服務程序ISR。

        1)初始化部分初始化硬件,分配設備所需的資源,完成所有與系統相關的設置。如果是字符設備,首先調用iosDrvInstall()來安裝驅動程序,把中斷向量和ISR掛上,然后調用iosDevAdd()將驅動程序加入I/O系統中;如果是塊設備,首先把中斷向量和ISR掛上,在內存中分配一個設備結構,然后初始化該結構。用戶要使用該設備時,先調用設備初始化函數xxlnit(),再調用設備創建函數xxDevCreate(),返回一個BLK_DEV結構的指針,供文件系統初始化函數使用。

        2)函數功能部分完成系統指定的功能。對于字符設備,這些函數就是指定的7個標準的I/O函數;對于塊設備,則是在BLK_DEV或SEQ_DEV結構中指定的功能函數。

        3)中斷服務程序是實時系統的重要組成部分,系統通過中斷機制來了解外部事件,并作出響應。實時系統的反應速度取決于系統對中斷的響應速度和中斷處理程序的處理速度。因此,中斷服務程序的處理時間應盡量短。所有的中斷服務程序共享一個堆棧,沒有任務控制塊,所以,在中斷服務程序中不能使用可導致阻塞的函數,如printf(…)、semTake(…)等。中斷服務程序中可以使用semGive(…)與其他的非中斷服務程序進行通信。理想的情況,一個中斷服務程序僅調用一個semGive(…)系統調用,也就是說,中斷服務程序的主要功能應該是發起一個任務來完成必要的處理。為提高中斷服務程序與任務的合作性能,最好的機制是信號量。

        3 END網口驅動開發

        經過上述論述,本章通過END網口驅動的實例具體說明設備驅動程序的開發過程。

        1)驅動程序的設備安裝函數 在BSP中對confidh,configNeth文件進行修改。首先在configh中增加#define INCLUDE_END,其次在configNeth文件中endTb1中添加一行:

        基于嵌入式操作系統的VxWorks設備驅動程序設計

        其中每行的第1項是設備的單元號;第2項是驅動程序的endLoad()入口點;第3項是要傳給該入口點的字符串,該字符串通常表示內存地址、I/O地址和中斷號等參數;第4項表示是否支持緩沖區借出;第5項表示BSP私有數據;第6項是執行標志,為FALSE表示該入口點還未被執行,在系統成功裝載一個驅動程序后,該值被改為True。設置該值為True是為了防止系統自動裝載該驅動。做完上述工作后,驅動程序就可以添加到VxWorks中。

        2)設備加載函數 sysEndLoad()是END網口驅動程序的初始化入口點,該函數的參數由tUserRoot任務在調用muxDevLoad()傳入,muxDev-Load()進而使用該參數調用sysEndLoad()。sysEndLoad()中執行幾個必要操作:初始化END_OBJ結構、初始化網絡緩沖內存、初始化MIB、設置網絡準備好標志。其函數格式:

        END_OKJ*sysEndLoad(char*initString)。其中initString由網絡設備表(endDevTb1[])中的成員提供。設備的所有特殊參數都是通過initString參數進行傳遞的。它包含如下特殊參數:設備寄存器基地址、中斷向量、中斷級、共享緩沖區地址等。

        3)打開設備函數 endStart()函數實現設備停止校驗操作、注冊驅動程序的中斷服務程序、打開設備中斷、記錄設備啟動和啟動設備。它調用bsp的函數連接中斷和驅動程序設備,使設備工作在中斷模式下。其函數格式如下:

        STATUS endStart(END_DEVICE*pDrvCtrl)。啟動設備成功時,返回OK。函數實現如下:

        基于嵌入式操作系統的VxWorks設備驅動程序設計

        4)設備讀/寫 設備的讀操作和寫操作是兩個相反的動作,一個向設備發送數據,一個從設備接收數據。

        當網絡協議層要發送數據時,協議驅動首先調用Mux層的API函數MuxSend(),MuxSend()通過調用函數endSend()把上層傳過來的數據從mblk-clblk-cluster結構中發送到網絡中。

        在NET_FUNCS結構中并不提供endReceive()函數。所以接收包的實現要依靠中斷的觸發,當驅動軟件接收到包時引發一個接收中斷例程。該中斷把數據緩沖區cluster與mblk,clblk結構連接。通過調用函數指針receiveRtn,指向Mux層API函數MuxReceive(),該函數把接收到的包傳到Mux層。如果該函數返回OK,表明數據包被正確傳輸。接受函數MuxReceive()通過調用函數stackRcvRtn再把數據包傳輸到上層協議層。

        5)關閉設備 關閉操作是打開操作的逆過程,當需要關閉網卡的時候,系統通過MUX層調用函數endStop()來完成。

        該函數釋放中斷向量,停止接收和發送寄存器的DMA處理,并將電源放置到低功耗。

        6)設備中斷管理 設備進行讀/寫操作時使用,當設備上接收到數據或數據發送結束時,通過觸發中斷信號。向系統報告這一狀態,系統便執行中斷服務函數進行相應的處理。

        驅動程序在MuxDevStart()函數中連接中斷服務程序,中斷服務程序是通過intConnect()函數掛接在某個中斷向量上的,當網絡層出現中斷時,網絡任務將調用中斷服務程序,中斷服務程序要調用一個函數netJobAdd(FUNCPTR rouTIne,intparaml,int param2,int param3,int param4,int param5)其中rouTIne指向需要處理的函數入口,5個參數可用來傳遞給處理函數,中斷服務程序在網絡設備的數據包接收和發送中扮演著重要的角色,負責處理接收中斷和接受中斷,其過程是:讀中斷狀態寄存器,清中斷事件,根據中斷狀態,調用相應的中斷處理程序。

        4 結論

        嵌入式實時操作系統VxWorks以其占用資源少,性能穩定等諸多優點而得到了越來越廣泛的應用。嵌入式系統中I/O設備是關鍵的一環,為I/O設備編寫高效無誤的驅動程序是開發嵌入式系統的重要問題。本文分析了VxWorks中I/O設備驅動程序的結構及其設計過程,并給出了具體設備驅動程序的開發流程。

        在課題研究過程中,完成了END網口的驅動,并通過控制器之間的數據通信驗證了驅動的正確性。VxWorks的I/O系統將設備程序作為內核過程實現的實時性和可靠性有了很大的提高,更重要的是為用戶提供了統一的接口。為后續開發提供了更大的方便。

        [返回]
        日产AV高清无码,日本成本人h动漫无码网址,nana在线观看高清视频,欧美综合自拍亚洲综合图区,精品国产91Av自在自线,好男人视频在线观看