引言
隨著微電子技術的發(fā)展,嵌入式系統(tǒng)的功能越來越強大,像 UART口、IrDA、USB、I2C以及SPI這些串行接口或設備同時存在于一個嵌入式系統(tǒng)中,實現對它們的統(tǒng)一管理將能極大地提高整個嵌入式系統(tǒng)的可移植性、易用性以及開發(fā)效率。本文通過對嵌入式系統(tǒng)串行設備管理技術的研究,提出了“帶USB的串行管理”模型,并詳細闡述了串行設備管理的實現過程。
串行設備管理
串行設備管理是指對COM,IrDA、I2C、modem等流設備和接口的統(tǒng)一管理。具體說,就是通過統(tǒng)一的上層應用層接口和下層驅動層接口實現對串行設備的統(tǒng)一管理和透明化處理,從而提高整個系統(tǒng)的易用性和可移植性。USB作為一種新型的高速串行總線,由于具有復雜性和高速性等特點,在嵌入式操作系統(tǒng)中一般專門為其建立一個USB模型而不放入串行設備管理中。雖然這樣有利于全面地管理USB主機、USB Hub以及USB設備,但整個模型實現代碼大而難,且在嵌入式系統(tǒng)下位機中多是USB設備而沒有USB主機和USB Hub。針對這一特點,本文把對USB設備的管理加入到串行管理中,使得對USB設備的訪問如同對一個串口的訪問一樣方便,從而提出了帶USB的串行管理模型。
帶USB的串行管理模型
整個管理模型由兩層構成,上層為操作系統(tǒng)應用層接口函數集,主要是統(tǒng)一化的串行流接口函數,如OpenFile等;下層為硬件驅動程序層對象和函數。串行管理的設備對象由虛擬化的HWOBJ結構體來定義,虛擬對象的登記和管理則是通過對DEVICE_LIST結構體的管理來實現。HWOBJ結構體定義為:
typedef struct _HWOBJ {
void *device_parent; //指向DEVICE_LIST結構
unsigned short device_index; //物理設備號,指向實際的串行設備或接口
unsigned long bind_flags; //中斷服務線程處理標志位,預留
unsigned long IntID; //指定中斷類型,預留
void *reserved;
PHW_VTBL func_tbl; //硬件驅動函數對象表
} HWOBJ, *PHWOBJ;
DEVICE_LIST結構體定義為:
typedef struct _DEVICE_LIST {
char *DllName; //設備DLL文件名,預留
unsigned long NumberOf Devices; //設備數量
void *DeviceArray; //設備隊列
} DEVICE_LIST, *PDEVICE_LIST;
為了解決USB的高速緩沖問題,專門采用了兩個單獨的循環(huán)隊列,一個用于緩沖USB的IN傳輸數據,一個用于緩沖USB的OUT傳輸的數據。
隨著微電子技術的發(fā)展,嵌入式系統(tǒng)的功能越來越強大,像 UART口、IrDA、USB、I2C以及SPI這些串行接口或設備同時存在于一個嵌入式系統(tǒng)中,實現對它們的統(tǒng)一管理將能極大地提高整個嵌入式系統(tǒng)的可移植性、易用性以及開發(fā)效率。本文通過對嵌入式系統(tǒng)串行設備管理技術的研究,提出了“帶USB的串行管理”模型,并詳細闡述了串行設備管理的實現過程。
串行設備管理
串行設備管理是指對COM,IrDA、I2C、modem等流設備和接口的統(tǒng)一管理。具體說,就是通過統(tǒng)一的上層應用層接口和下層驅動層接口實現對串行設備的統(tǒng)一管理和透明化處理,從而提高整個系統(tǒng)的易用性和可移植性。USB作為一種新型的高速串行總線,由于具有復雜性和高速性等特點,在嵌入式操作系統(tǒng)中一般專門為其建立一個USB模型而不放入串行設備管理中。雖然這樣有利于全面地管理USB主機、USB Hub以及USB設備,但整個模型實現代碼大而難,且在嵌入式系統(tǒng)下位機中多是USB設備而沒有USB主機和USB Hub。針對這一特點,本文把對USB設備的管理加入到串行管理中,使得對USB設備的訪問如同對一個串口的訪問一樣方便,從而提出了帶USB的串行管理模型。
帶USB的串行管理模型
整個管理模型由兩層構成,上層為操作系統(tǒng)應用層接口函數集,主要是統(tǒng)一化的串行流接口函數,如OpenFile等;下層為硬件驅動程序層對象和函數。串行管理的設備對象由虛擬化的HWOBJ結構體來定義,虛擬對象的登記和管理則是通過對DEVICE_LIST結構體的管理來實現。HWOBJ結構體定義為:
typedef struct _HWOBJ {
void *device_parent; //指向DEVICE_LIST結構
unsigned short device_index; //物理設備號,指向實際的串行設備或接口
unsigned long bind_flags; //中斷服務線程處理標志位,預留
unsigned long IntID; //指定中斷類型,預留
void *reserved;
PHW_VTBL func_tbl; //硬件驅動函數對象表
} HWOBJ, *PHWOBJ;
DEVICE_LIST結構體定義為:
typedef struct _DEVICE_LIST {
char *DllName; //設備DLL文件名,預留
unsigned long NumberOf Devices; //設備數量
void *DeviceArray; //設備隊列
} DEVICE_LIST, *PDEVICE_LIST;
為了解決USB的高速緩沖問題,專門采用了兩個單獨的循環(huán)隊列,一個用于緩沖USB的IN傳輸數據,一個用于緩沖USB的OUT傳輸的數據。