WIN CE的驅動程式模型

來源:互聯網
上載者:User

      WinCE系統在驅動設計上有一個很方便的功能,就是原始裝置製造商(OEMs)和獨立硬體開發商(IHVs)可以自主開發裝置驅動程式來支援他們的硬體。因此,深入瞭解WinCE系統驅動方式是非常有必要的。

                                  
(1)從驅動載入方式上的分類
      從驅動載入方式上WinCE可分為內建裝置驅動(Built-In Driver)和可載入驅動(Loadable Driver)。

      WinCE系統可直接使用內建裝置,因為內建裝置驅動程式是與WinCE的核心組件緊密相連的,也就是內建裝置驅動程式是被靜態地連結到GWES(Graphics Windowing and Events Subsystem)的。這些驅動對應的裝置通常在系統啟動時,在GWES的進程空間內被載入,主要是與顯示和輸入有關的驅動。內建裝置包括顯示、觸控螢幕、音頻、串列埠、LED、電池和PC卡插座等。

      可載入裝置是指可與平台串連和分離的第三方介面裝置,可由使用者隨時安裝和卸載。這種外圍裝置的驅動也被稱為流驅動,這些驅動可以在系統啟動時、或者啟動後的任何時候由裝置管理員動態載入,通常這類驅動是以DLL動態連結程式庫的形式存在。在WinCE中典型的可載入驅動有:PCMCIA driver(PCMCIA.dll)。
      與內建驅動程式不同的是,所有可載入流驅動程式都共用一個公用介面,而且功能也與應用程式所用的檔案API中的功能匹配。因此,控制可載入裝置的流介面驅動程式一般由應用程式存取。也就是說,流介面驅動程式是由一個特殊檔案來將裝置功能展現給應用程式的,該檔案可被開啟、讀取、寫入和關閉。例如,使用者將一個GPS裝置與平台相連後,就可啟動有GPS功能的應用程式來存取並使用該裝置。通常只有OEMs才會對內建裝置驅動程式進行修改,其它自由裝置生產商由於只提供附加的硬體裝置,對內建裝置驅動程式不會有過多涉及。
(2)從驅動程式層次上分類

                         
      按照結構分,WinCE驅動程式又可分為分層的驅動程式和不分層的驅動程式。分層的驅動程式由兩個設定好的層組成:上層是模型裝置驅動程式(Model Device Driver, MDD),下層是依賴平台的驅動程式(Platform Dependent Driver, PDD)。
      分層的驅動程式中的MDD通常是無需修改可直接使用,MDD的作用是連結PDD層並定義它希望調用的函數介面:裝置驅動程式提供器介面(Device Driver Service Provider Interface, DDSI)。同時MDD又把不同的函數集提供給WinCE核心,這些函數叫做裝置驅動程式介面(Device Driver Interface, DDI)。不分層的驅動程式是把PDD與MDD寫在一起,沒有做嚴格的區分,通常這種驅動比較簡單,比如ATADISK。

      簡單的說,內建驅動和載入式流驅動是從驅動與系統其它模組(調用者)的介面形式上做的分類;而不分層和分層是從驅動實現方式上的分類。在開發過程中,MDD層驅動是不需要被修改的。但和MDD層驅動不同的是,PDD層驅動必須被修改成和特定硬體相匹配的代碼。

(3)從載入位置上分類

      在WIN CE中,驅動既可以在使用者模式下運行也可以在內河模式下運行。核心模式驅動運行在核心上下文中,使用者模式驅動運行在一個或多個進程上。 

      核心模式驅動:裝置管理員預設是把所有驅動當作核心模式驅動載入到核心空間,除非在註冊表中設定了DEVFLAGS_LOAD_AS_USERPROC標誌。核心模式驅動可以調用核心API函數,因此執行效率較高。而且它可以直接使用使用者儲存空間,快速存取使用者空間的緩衝區。因為核心模式驅動對讀寫記憶體沒有任何限制,因此要求健壯性很高,否則極易造成系統崩潰。

      使用者模式驅動:在註冊表中設定了DEVFLAGS_LOAD_AS_USERPROC標誌,這種驅動跟其它驅動是隔離的,所以即使這個驅動出現問題,也不會造成系統影響。由於使用者模式驅動程式不能存取核心儲存空間,執行效率會受到影響。

(4)關於外部變數使用跟模組調用之間的關係

      碰到一個很奇怪的問題,兩個模組之間存在調用和被調用的關係,那麼兩者要使用的外部變數跟該變數的申明位置就有關係,如果不正確就會出現編譯錯誤。比如A模組最終會調用B模組,那麼兩者都要用到的外部變數要申明在B中,在A中用extern申明調用;如果這個變數申明在A中,卻在B中用extern申明,則會出現為定義變數的編譯錯誤。這種現象只存在於嵌入式作業系統中,在單片機中不會存在。

(5)從系統角度,分析流驅動的載入過程和工作原理

1,載入驅動程式。WINCE載入驅動程式有兩種方式:(1)系統啟動時,裝置管理員搜尋註冊表的HKEY_LOCAL_MACHINE/Drivers/BulitIn鍵下面的子鍵,並逐一載入子鍵下的每個驅動,此過程稱為BusEnum;(2)應用程式可調用ActivateDeviceEx函數動態載入驅動程式。
2,裝置管理員從註冊表的DLL索引值中擷取驅動程式所在的DLL檔案名稱。
3,裝置管理員調用LoadDriver函數把DLL載入到自己(Device.exe)的虛擬位址空間內。
4,裝置管理員在註冊表的HKEY_LOCAL_MACHINE/Drivers/Active下面,記錄所有已經載入的驅動程式記錄。
5,裝置管理員調用驅動程式中的XXX_Init函數,在該函數中,對硬體進行一些最基本的初始化工作。
      至此,流式驅動載入完畢。
6,應用程式開始使用該裝置,通過CreateFile調用XXX_Open開啟裝置,並通過ReadFile和WriteFile對裝置進行一些操作。操作完畢後,通過CloseHandle調用XXX_Close關閉裝置。
      需要注意的是:在使用CreateFile開啟裝置時,這個參數裝置名稱跟XXX是有關係的,應用程式就是根據這個名字(要去掉Index)再追加對應的操作名,來尋找正確的驅動DLL匯出函數(之前認為可能是根據索引號來尋找,後來覺得不大可能,因為這種方式太死板了)。我們還會碰到這種情況,同一個DLL驅動,對應兩個要開啟的裝置,比如“COM1”“COM2”,這兩者可能是調用同樣的驅動函數,但是在執行各自的init函數時已經對應的是不同的硬體,在以後的操作中也各自分配有獨立的記憶體空間。所以是不衝突的。

 

http://www.ec66.com/article/list.asp?indexid=3341

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.