實時嵌入式操作系統(tǒng)VxWorks設備驅動程序的設計
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中。 linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
評論