vxWorks驅動架構
Vxworks核心驅動基本結構: 三張表:1. 系統裝置表 2. 系統驅動表 3. 檔案描述符表
Vxworks 內部對每個裝置使用DEV_HDR 資料結構進行表示: Typedef struct { DL_NODE node; Short drvnum; Char *name; } 該結構中給出了連結指標(用以將該結構串入佇列中)、驅動索引號、裝置節點名稱。核心提供這個結構較為簡單,只儲存了一些裝置的關鍵資訊。底層驅動對其驅動的裝置都有一個自定義資料結構表示,其中包含了驅動裝置暫存器基地址,中斷號,可能的資料緩衝區,儲存核心回撥函式的指標,以及一些標誌位。最關鍵的一點是DEV_HDR必須是自定義資料結構的第一個成員變數,因為這個使用者自定義結構最後需要新增到系統裝置佇列中,必須能夠在使用者定義結構與DEV_HDR結構之間進行轉換,而將DEV_HDR結構設定為使用者自定義結構的第一個成員變數就可以達到目的。
typedef struct { DEV_HDR pFCcardHdr; BOOL created; char * buf_virts; UINT32 iobase; UINT32 membase; char irq; UINT32 irqvec; UINT32 Bus; UINT32 Device; UINT32 Func; }DRV_CTRL;
系統提供了iosDevAdd(DEV_HDR *pDevHdr, char *name, int drvnum)用於驅動程式呼叫註冊一個裝置。第三個引數是裝置對應的驅動程式索引號。這個驅動號是iosDrvInstall函式的返回值,在裝置初始化函式中,我們首先呼叫iosDrvInstall註冊驅動,然後使用iosDrvInstall 函式返回的驅動號呼叫 iosDevAdd新增裝置到系統中通過這兩步裝置就可以被使用者程式使用了。 使用者呼叫open函式開啟一個裝置檔案時,系統將以傳入的檔案路徑名匹配系統裝置的裝置節點名,匹配方式是最佳匹配。 系統驅動表: 系統驅動表包含了當前註冊到I/O子系統下的所有驅動。這些驅動可以直接驅動硬體工作的驅動層。系統驅動表底層實現是一個數組,陣列元素數目在核心初始化過程中指定。I/O子系統提供iosDrvInstall供驅動程式註冊,iosDrvInstall原型如下: Int iosDrvInstall ( FUNCPTR pCreate, FUNCPTR pDelete, FUNCPTR pOpen, FUNCPTR pClose, FUNCPTR pRead, FUNCPTR pWrite, FUNCPTR pIoctl /*pointer to driver ioctl function*/ )
一個裝置驅動在初始化過程中一方面完成硬體裝置暫存器配置,另一方面就是向I/O子系統註冊驅動和裝置。一個驅動並不需要實現上述所有函式,無須實現的函式直接傳遞NULL指標就可以了。iosDrvInstall 函式的基本實現即遍歷drvTable陣列,查詢一個空閒表項,用傳入的函式地址對各成員變數進行初始化。 系統檔案描述符表 檔案描述符表表項索引被用做檔案描述符ID,即open函式返回值。對於檔案描述符,需要注意:標準輸入、標準輸出、標準錯誤輸出雖然使用0,1,2三個檔案描述符,但是可能在系統檔案描述符表中只佔用一個表項,即都使用同一個表項。Vxworks核心將0,1,2三個標準檔案描述符與系統檔案描述符表中的內容分開進行管理。 系統檔案描述符中的內容主要是針對硬體裝置,使用一次open函式呼叫就佔用一個表項: int fd = open(DevName, 2,0);
應用程式每呼叫一次open函式,系統檔案描述符表中就增加一個有效表項,直到陣列滿為止。此時open函式呼叫將以失敗返回,因此注意如果需要反覆開啟裝置的話,一定要在裝置不用的時候呼叫close函式關閉該描述符指向的裝置,並在每次呼叫open函式之後檢查返回的檔案描述符是否合法。