VxWorks 環境下串口驅動程序設計

1  引 言
對於一個集管理、決策、控制及各種信息融合爲一體的大系統來說,操作系統起着極其重要的作用。近年來,國內對嵌入式操作系統的研究已開始成爲熱點,但就大多數應用來看,還處在較爲簡單的發展階段,嚴重地制約各種新理論、新算法的實現,而且系統魯棒性無法有質的提高。作爲一個優秀的操作系統,VxWorks 實現了比其他實時操作系統更好的有效性、商用性、可裁減性以及互操作性[ 1 ] ,廣泛應用在通信、軍事、航空、航天等高精尖技術及實時性要求極高的領域中,如衛星通訊、軍事演習、彈道制導、飛機導航等。爲了實現VxWorks 對專用目標板的移植,必須編寫相應的驅動程序。
2  VxWorks 系統結構及啓動過程
VxWorks 由一個基於優先級中斷驅動的多任務調度內核和設備管理、文件管理、網絡擴展及兼容POSIX 協議的運行接口組成,通過二進制信號量、互斥信號量、計數器信號量、管道、消息等支持任務間靈活通信。
VxWorks 採用類似Unix 的進程調度算法,但是考慮到其實時性,VxWorks 採用段式或段頁式管理來實現訪問4GB 的邏輯空間,一般不採用虛擬內存,也即無缺頁中斷。專用BSP(Board Support Package) 的編寫是實現系統移植的重點,BSP 主要用來完成VxWorks 對專用目標板的支持。一個BSP 包括硬件初始化、中斷處理和產生、硬件時鐘管理、本地和總線內存空間映射,同時也包含定製VxWorks 映像。它貫穿着硬件級、操作系統級和應用程序級3 層。按照操作系統相應規範編寫對硬件的驅動,然後掛接於VxWorks 的內核中與Works 一起爲應用程序級提供服務。

除了解系統結構外,爲實現驅動程序的掛接,還必須瞭解系統的啓動過程。啓動過程。系統加電後首先執行駐留ROM 中的彙編代碼romInit () ,完成屏蔽處理器中斷,初始化內存、堆棧及寄存器,調用romStart ()完成代碼重定位、解壓及爲ROM 映像初始化RAM。之後進入駐留於RAM_LOW_ADRS 處的VxWorks 入口程序sysInit () ,調用第一個C 程序usr Init ( ) ,完成用戶定義系統的初始化工作,此時系統還處於單任務環境,其中,子程序SysHwInit () 用來初始化系統硬件,將系統硬件置於安靜狀態;子程序SysHwInit2 ( ) 實現系統硬件中斷的掛;Kernelinit () 激活多任務環境,產生根任務usrRoot () 。該任務用來安裝驅動程序、創建設備、初始化VxWorks庫、調用應用程序啓動代碼。UsrRoot ( ) 是驅動程序的入口點,用戶編寫的驅動程序一般都掛接在例程usrRoot ( )
中,而BSP 專用的設備驅動程序不依賴usrRoot ( ) 中的啓動功能模塊的驅動程序則可以位於SysHwInit () 中。

3  VxWorks 的I/ O 系統驅動程序設計
VxWorks 支持2 種設備:塊設備(Block Device) 和字符設備(Charater Device) 。其中塊設備經過文件系統,字符設備不經過文件系統,如圖3 所示。塊設備中存儲的是定長且可任意訪問的數據塊,該設備的I/ O 操作也是以塊
爲單位的。塊的大小通常是512 字節或2 n 的長度。塊設備有硬盤、軟盤驅動器和CD - ROM 驅動器等,內核通過buf 結構與塊設備打交道,這樣可以封裝所有I/ O 操作的細節。字符設備能夠存儲或者傳輸不定長數據。某些字
符設備可以每次傳遞一個字節,傳完後產生一次中斷,另一些設備可以內部緩存數據。內核把這些數據解譯爲可順序訪問的連續字節流。字符設備不能以任意地址訪問,也不允許查找操作。字符設備有終端、打印機、鼠標和聲卡等。
應用程序通過文件名(即設備名) 查找設備列表(De2vice List) ,返回驅動程序表中驅動程序入口索引並保存於文件描述表(File Description Table) 中(以後的讀寫操作將通過該表訪問具體設備) 。由設備表索引查找驅動程序表
(Driver Table) ,從而得到相應的設備操作函數入口,如圖4 所示。此外,對於塊設備來說讀寫操作最後還要通過文件系統讀寫入口函數。編寫設備驅動程序只需編寫相應設備的xxCreate ( ) , xxOpen ( ) , xxDelete ( ) , xxClose ( ) ,
xxRead ( ) , xxWrite ( ) , xxIoctl ( ) 等7 個主要函數外加xxDrv() ,xxDevCreate ( ) 2 個函數就可以了。其中xxIoctl() 封裝了對設備的控制,如串口波特率、停止位、校驗位等的控制。XxDrv() 用來初始化驅動程序,並把7 個主要函
數裝入操作系統的驅動程序表中,返回一個驅動程序號。xxDevCreate () 將所需設備的描述符的設備頭裝入操作系統設備的雙向鏈表中,該表中包括設備名和相應的驅動程序號。至此完成了設備與驅動程序的掛接。應用程序可
以調用open() 等函數通過操作系統提供的這種層次訪問
結構訪問到相應的設備xxOpen() 等函數。

4  串口驅動的實現
以下是基於Intel 8250 芯片的串口驅動的實現過程。
具體說明如下:
(1) 定義寄存器
# define UART_THR     0 ×00
# define UART_RDR  0 ×00
# define UART_BRDL  0 ×00
# define UART_BRDH  0 ×01
# define UART_IER  0 ×01
# define UART_IID  0 ×02
# define UART_LCR  0 ×03
# define UART_MDC  0 ×04
# define UART_LST  0 ×05
# define UART_MSR  0 ×06
(2) 定義各種控制變量(僅給出IER 寄存器控制定
義)
# define I8250_IER_RXRDY    0 ×01

# define I8250_IER_TBE  0 ×02
# define I8250_IER_LST  0 ×04
# define I8250_IER_MSI  0 ×08
(3) 編寫具體實現函數
I8250HrdInit () 初始化I8250 芯片,如設置波特率,初
始化通道等。
{
⋯⋯
}
I8250Int () 處理收發中斷
{
⋯⋯
}
此外,還要實現I8250Open () , I8250Ioctl () 等函數,以
便最後掛接於usrRoot () 函數中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章