實時系統VxWorks下裝置驅動程式的編寫

2021-04-02 23:41:01 字數 3284 閱讀 3008

vxwork下裝置驅動程式存在於硬體裝置和上層應用程式之間。裝置驅動程式直接管理硬體裝置,並對上層應用程式提供遮蔽了地層硬體特性的介面呼叫。

驅動程式只提供幾個低階的i/o函式完成簡單的資料輸入和輸出功能,而其它具體的高階協議,如面向字元裝置的協議和面向塊裝置的協議,則是由與裝置無關的i/o系統完成。i/o系統為使用者的i/o請求尋找具體的驅動程式。

i/o系統管理著驅動程式,把應用程式的i/o請求**給合適的驅動程式進行處理。

i/o系統為驅動程式維護著三張表,

(1)檔案描述符列表fd table,維護著已開啟裝置的控制代碼,驅動該裝置的驅動程式號,裝置相關引數的指標這三者的對應關係。

(2)裝置描述鍊錶device list,維護著系統中存在的裝置號,驅動該裝置的驅動程式號,裝置相關的引數的指標三者的對應關係。

(3)驅動程式列表driver table,維護著驅動裝置的驅動程式號,和該裝置對應的七個基本i/o操作的函式(如xxopen..等)的入口位址這兩者的對應關係。

i/o系統對這三個表的操作大致過程為:

當呼叫creat(..)或open(...)時,首先在裝置描述鍊錶中根據裝置名找到相應的項(若為 create,則建立響應的表項),根據驅動程式號找到底層實現**xxcreate(..)或xxopen(...),i/o系統將驅動程式號及xxcreate(...)或xxopen(...)返回的指向裝置相關引數的指標添入檔案描述符列表中,最後,返回在檔案描述符列表中新增的項在該表中對應的序號,即檔案控制代碼,提供給後續的i/o操作使用。

當呼叫read(...)或write(...)時,根據檔案控制代碼,在檔案描述符列表中找到對應的表項,得到操作該裝置的驅動程式號,i/o系統再根據驅動程式列表得到響應的底層驅動實現函式xxread(...)或xxwrite(...)入口位址,呼叫相應的與裝置相關的底層操作**。

字元裝置的驅動程式和i/o系統直接作用。字元裝置呼叫驅動安裝函式iosdrvinstall(...)在vxworks中安裝驅動程式。該函式有7個引數,分別指向驅動程式提供的7個標準i/o函式creat(...),delete(...),open(...),close(...),read(...),write(...),ioctl(...)。有些函式不一定實現,對應的引數可以為null,iosdrvinstall(...)只為驅動程式在驅動函式列表中分配了乙個 位置,要使用驅動函式還必須呼叫安裝裝置函式iosdrvadd(..),把裝置名和驅動程式號寫到資料結構dev_hdr中,並把它加入到系統的裝置描述鍵表中。

塊裝置的驅動程式不與i/o系統直接作用,它是通過檔案系統與i/o系統作用的。檔案系統把自己作為乙個驅動程式裝載到i/o系統中,並把請求**給實際的裝置驅動程式。塊裝置的驅動程式不使用isodrvinstall(...)來安裝驅動程式,而是通過初始化塊裝置描述結構blk_dev或順序裝置描述結構seq_dev,來實現驅動程式提供給檔案系統功能。塊裝置也不呼叫裝置安裝函式isodrvadd(...),而是呼叫檔案系統的裝置初始化函式如dosfsdevinit(...)等。

一般的,驅動程式包括三部分:初始化部分,函式功能部分和中斷服務函式isr。

初始化部分初始化硬體裝置,分配裝置所需的資源,完成系統相關的設定。對於字元裝置來說,首先呼叫iosdrvinstall(...)安裝驅動程式,把中斷向量和中斷服務函式掛上,然後呼叫iosdrvadd(...),載入驅動程式到i/o系統。對於塊裝置來說,首先把中斷向量和中斷服務函式掛上,在記憶體中分配乙個裝置結構並初始化,使用者使用該裝置部分,在呼叫裝置的建立函式返回乙個blk_dev結構的指標,供檔案系統的初始化函式使用。

函式功能部分完成系統指定的功能。對於字元裝置,就是7個標準i/o函式;對於塊裝置,則是blk_dev或seq_dev結構中指定的函式。

中斷服務程式是實時系統的重要組成部分,系統通過中斷機制來了解外部事件,並做出響應。實時系統的反應速度取決於系統對中斷的響應速度和中斷處理程式的處理速度。因此,中斷服務程式的處理時間應盡量短。所用的中斷服務程式共享乙個堆疊,沒有任務控制塊,所以,在中斷服務程式中不能使用可導致阻塞的函式,如printf(...),semtake(...)等。如果希望在中斷服務程式中輸出一些資訊,可以使用syslog(...),該函式是非阻塞的,可以接收7個引數。中斷服務程式可以 使用semgive(...)與其它的非中斷服務程式進行通訊。理想的情況下,乙個中斷服務程式僅呼叫乙個semgive(...)系統呼叫,也就是說,中斷服務程式的主要功能是發起乙個任務並完成必要的處理。為提高中斷服務程式與任務的合作效能,最好的機制是訊號量。

vxworks系統中列印並口驅動程式的實現

(1)函式功能部分

根據列印並口的特點,並口驅動程式中要實現的基本的i/o函式應該是lptopen(...),lptwrite(...)和lptioctl(...),這三個函式的宣告分別如下:

local int lptopen(lpt_dev *pdev, char *name,  int mode);

local int lptwrite(lpt_dev *pdev, char *pbuf, int size);

local status lptioctl(lpt_dev *pdev, int function, int arg);

三個函式的實現很簡單,其中最主要的是lptwrite(...),在此函式中可以使用輪詢方式,也可以採用中斷方式。

(2)初始化部分

初始化函式宣告為:status lptdrv(int channels, lpt_resource *presource);

該函式完成了列印並口的初始化,其中呼叫函式intconnect(...)和iosdrvinstall(...)的具體形式為:

(void)intconnect(  (voidfuncptr*)inum_to_ivec(presource->intvector),(voidfuncptr)lptintr, (int)pdev);

lptdrvnum = iosdrvinstall(lptopen, (funcptr)null, lptopen, (funcptr)null, null, lptwrite, lptioctl);

裝置的建立函式宣告為:status lptdevcreate(char *name, int channel);該函式將建立標誌置為true,然後呼叫函式iosdevadd(&lptdev(channel).devhdr, name, lptdrvnum)將建立的裝置加入到i/o系統中。

中斷服務程式實現部分

對於答應並口,中斷服務程式可以這樣實現:

local void lptintr(lpt_dev *pdev)

pdev->inservice = true;

pdev->intcnt++;

semgive(&pdev->syncsem);

pdev->inservice = false;

Linux input子系統二 驅動程式的編寫

本文主要以分析通用gpio按鍵驅動 gpio keys.c檔案為主,將其中牽涉到linux驅動架構流程,以及架構設計思想進行分析。概述 gpio keys是基於input架構實現的乙個通用gpio按鍵驅動。該驅動基於pladform driver架構,實現了驅動和裝置分離,減少了程式的耦合性,同時提...

linux裝置驅動程式的makefile檔案例子

最近研究qq2440,想做水下機械人的位姿檢測,用linux需要對裝置驅動程式設計,學了學,挺麻煩的,麻煩在編譯和載入上,在網上找到乙個例子不錯,抄下來備用。pc機上的 obj m hello.o kerneldir lib modules shell uname r build default m...

按鍵的裝置驅動程式流程

按鍵的裝置驅動 1.按鍵的硬體原理 在嵌入式系統中,通過乙個上拉電阻將處理器的外部中斷引腳拉高,電阻的另一端連線按鈕並接地即可實現。當按鈕被按下時,eint10 ein13 eint14 eint15 上將產生低電平,這個低電平將中斷cpu,cpu可以依據中斷判斷按鍵被按下。僅僅依據中斷被產生就認定...