WinCE嵌入式開(kāi)發(fā)程序入門(mén)
MicrosoftWindows CE是緊湊的、高效的和可升級的操作系統,它被廣泛的應用在各種嵌入式式的產(chǎn)品中,從手持電腦到專(zhuān)門(mén)的工業(yè)控制器和消費用電子產(chǎn)品中。Windows CE已經(jīng)通過(guò)了其自身的能力證明:它能夠滿(mǎn)足32位嵌入式式程序開(kāi)發(fā)的需求。同樣重要的是: Windows CE使嵌入式式系統的設計者得以充分利用Microsoft的32位基于Windows的開(kāi)發(fā)工具的全部的函數。
嵌入式的應用軟件選擇Windows CE的首要原因之一是Microsoft Win32應用編程接口(API)的廣泛應用。從運行在Microsoft WindowsNT操作系統下的高端服務(wù)器到最小的臺式機和內嵌式的應用中,WIN32 API幾乎是所有為面向Windows開(kāi)發(fā)32位應用軟件的內核。
本文的目的是向那些開(kāi)發(fā)基于Windows CE的新的嵌入式式系統的開(kāi)發(fā)者介紹WIN32 事件驅動(dòng)編寫(xiě)程序。 本文將:
概述32位Windows操作系統和WIN32編程模型。
介紹線(xiàn)程,事件和消息是如何操作的。
給出Win32如何管理Windows CE的內存。
解釋 Win32意外操作的概念。
比較同步和不同步設備的界面的不同的方法。
總結明確定義的API的優(yōu)位。
本文并不是刻意要完全做Win32的編程指南,而是要介紹用Win32作為嵌入式式應用程序的開(kāi)發(fā)工具。
簡(jiǎn)介
對于全世界的成千上萬(wàn)的程序開(kāi)發(fā)者來(lái)說(shuō),Win32程序模式很常見(jiàn)。WIN32是臺式機或企業(yè)廣泛應用的強大目標,而且隨著(zhù)Windows CE的涌現,它也成了嵌入式式系統的理想的程序界面形式。WIN32為Windows CE操作系統提供了一致的,文檔完備的并且函數強大的程序界面。
用WIN32在Windows CE平臺開(kāi)發(fā)的程序同其他的WIN32程序差不多;這意味著(zhù)程序開(kāi)發(fā)者在開(kāi)發(fā)新的面向Windows CE操作系統的應用程序的時(shí)候,能夠應用這些大量的WIN32的程序資源、第三代工具和外部的專(zhuān)門(mén)的技術(shù)。具有WIN32編程經(jīng)驗的程序員會(huì )發(fā)現創(chuàng )建新的(維護已有的)面向Windows CE設備(如手持電腦)的應用程序遠比創(chuàng )建類(lèi)似的面向特殊的平臺或其他應用不廣的嵌入式式的操作系統的應用程序簡(jiǎn)單。
嵌入式式系統的設計者們很快意識到Windows CE的強大,并且以驚人的快速使這個(gè)操作系統與它們的新產(chǎn)品一體化??墒?,許多嵌入式式軟件的開(kāi)發(fā)者對Windows的事件驅動(dòng)程序的一般技術(shù)不熟悉。對于這些軟件開(kāi)發(fā)者來(lái)說(shuō),在他們開(kāi)始他們第一次的基于Windows CE的項目之前,了解一些WIN32的基礎的知識是有好處的。
什么是WIN32?
“WIN32”表示對于所有的Microsoft 32位平臺的一種普通的應用編程接口(API)。這些平臺通常指:
Windows 95, Windows 98
Windows NT
Windows CE
本文我們主要關(guān)注Windows CE操作系統,可是需要弄清楚的是大多數 Win32的應用編程接口對上面所有三種平臺都適用。這種同用的應用編程接口的優(yōu)位有很多:容易登錄到應用程序中,有大量的已有程序的知識,范例和第三代軟件的資源。
平臺的差別
WIN32的應用編程接口定義了你作為一個(gè)程序員有用的Windows平臺。WIN32應用編程接口的目的是提供了一個(gè)常用的界面的設置,可是虛擬,不同的平臺由于不同的特性及硬件的約束,其應用編程接口也不同。WIN32平臺家族的一些成員支持全部的WIN32的應用編程接口(下簡(jiǎn)稱(chēng)API),而其他的只支持一部分的API。 為緊湊的、嵌入式式的應用軟件和小型設備而設計的Windows CE,WIN32的API最受限制。盡管如此, Windows CE 的API也是足夠完善的,能夠處理實(shí)際的大量的高級的嵌入式式應用程序。
{{分頁(yè)}}
WIN32與Microsoft基本類(lèi)庫(MFC)
用WIN32界面設計并不是創(chuàng )建32位基于 Windows的應用程序的唯一的途徑。另一種重要的途徑是可在WIN32與 Microsoft Visual C++開(kāi)發(fā)環(huán)境使用的Microsoft基本類(lèi)庫(MFC)。MFC為許多(不是所有)的WIN32的API進(jìn)行了高度的封裝(圖1)。通常,MFC提供了代表重要的WINDOWS的用戶(hù)界面對象的類(lèi),象窗口,對話(huà)框,畫(huà)刷,畫(huà)筆,和字體。MFC也為沒(méi)有任何用戶(hù)界面要求的嵌入式式應用軟件提供了相應的類(lèi)。MFC類(lèi)的成員函數調用WIN32API的函數,可以使復雜的應用程序的設計巧妙的簡(jiǎn)化。
作為WIN32的程序員,你可以自由的選取使用C或C++和WIN32 API, 或者用C++與MFC。VISUAL C++開(kāi)發(fā)系統對于所有的,包括 Windows CE 的WIN32的目標操作系統都支持以上的兩種開(kāi)發(fā)系統。
本文直接介紹WIN32 API。應用 Windows CE下的MFC的詳細的消息,參閱 Windows CE SDK文檔。
WIN32程序模型
WIN32是超越所有32位WINDOWS平臺的常用和一致的(盡管并不全部相同)API。為了對WIN32 API有一個(gè)透徹的了解,以便高效的使用它的函數,了解一些底層操作系統的基礎十分重要。本節總結了32位操作系統和 Win32 API的最重要的概念,為你更深入的學(xué)習提供基礎。要得到更多更詳細的關(guān)于32位WINDOWS的體系結構、 Win32 API、以及其他的程序設計的主題,你可以讀一本關(guān)于那個(gè)主題出版的書(shū)。Microsoft出版社能提供一些這樣的書(shū)籍;在本文的最后,列著(zhù)部分這些書(shū)的條目。
Windows CE的內核和 Win32 API
那些對WINDOWS CE的人可能會(huì )有一個(gè)錯覺(jué),認為它僅僅是現有的操作系統(如WINDOWS95)降級版。但事實(shí)上Windows CE是以小型的、高度用戶(hù)化的面向嵌入式式應用程序的操作系統開(kāi)發(fā)起來(lái)的。在WINDOWS CE排除(或代替)了一些基于WINDOWS CE的應用軟件所不需要的操作系統特性的同時(shí),它的內核也具有大量的其他Microsoft 32位的操作系統的最精華的東西。例如在Windows NT下, 所有的在Windows CE下運行所應用軟件都運行在有優(yōu)先權的多任務(wù)處理環(huán)境下,在被全保護的內存空間里。還有,象 Windows NT一樣,Windows CE支持本地統一的字符編碼標準碼字符串,使它更適于國際推廣??墒?,不象其他的32位WINDOWS平臺,, Windows CE是十分緊湊和用戶(hù)化的,僅僅占用小于200K的內存。
Windows CE的WIN32 API比其他的32位的Windows操作系統的WIN32 API要??;它只包括大約相當于Windows NT的半數的API。但是 Windows CE的WIN32 API也有其他系統所沒(méi)有的特性。例如:通知API,它能夠操作系統的層次,而不是在運行的應用程序的層次上處理通知事件(如時(shí)鐘)。觸屏的API和對Windows CE的數據庫的內置的支持是其他的操作系統所沒(méi)有的。觸屏的API使用于觸覺(jué)敏感顯示器的屏幕校正和用戶(hù)交互的管理容易實(shí)現,而數據庫的API提供了快速簡(jiǎn)捷的訪(fǎng)問(wèn)緊湊的、一般用途的數據庫的工具。另一個(gè)關(guān)于Windows CE的鮮為人知的方面是它的高度的模塊化;嵌入式式系統開(kāi)發(fā)者(用Microsoft Windows CE內含的面向Visual C++的軟件包)能夠創(chuàng )建一個(gè)對于它們的獨特的硬件平臺和應用軟件用戶(hù)化了的Windows CE的版本。
Windows CE操作系統為設計提供了全新的設計環(huán)境。Windows CE的開(kāi)發(fā)者幾乎不需要支持原有的應用程序或設備,所以操作系統在設計時(shí)可以考慮到應用一些最新的思想和應用程序,并且應用最先進(jìn)的嵌入式式的32位微處理器產(chǎn)品作為它的硬件目標平臺。
這對于一個(gè)使用Windows CE平臺的WIN32 API的用戶(hù)來(lái)說(shuō)意味著(zhù)什么呢?這意味著(zhù)對于現代的、32位的嵌入式式系統,它是一種更簡(jiǎn)單的API,更加優(yōu)化的目標操作系統。下面,我們將研究一些重要 的WIN32 API和Windows CE操作系統的內部的內容。
程序和線(xiàn)索
了解WIN32 API和Windows CE操作系統的底層內容的第一步就是了解多任務(wù)和多線(xiàn)索索應用程序是如何組織的。WIN32術(shù)語(yǔ)中,程序被定義成一個(gè)正在運行中的程序實(shí)例。象其他的32位Windows 平臺一樣,Windows CE是一個(gè)多任務(wù)的操作系統,在一個(gè)運行中的程序里,它支持執行多個(gè)線(xiàn)索所。
對于嵌入式式的應用程序,Windows CE的多線(xiàn)索索執行能力是它函數的重要的體現。這樣就使WIN32嵌入式式程序開(kāi)發(fā)者優(yōu)先考慮WIN32的線(xiàn)索索的創(chuàng )立與同步。
WIN32的線(xiàn)索索的處理同其他常用的嵌入式式的操作系統是有區別的。不象Unix或其派生的系統,32位Windows平臺從一開(kāi)始設計就支持多線(xiàn)索索應用程序。線(xiàn)索索管理(時(shí)序安排,同步和資源管理)由內核來(lái)完成,程序開(kāi)發(fā)者利用函數裝入內核(通過(guò)WIN32 API訪(fǎng)問(wèn))來(lái)建立和管理他們應用程序中的線(xiàn)索索。
例如,如果一個(gè)嵌入式式應用程序必須監視多個(gè)輸入設備并且在監視到一個(gè)或多個(gè)設備上不同步發(fā)生的事件的時(shí)候要作出恰當的反映。更進(jìn)一步,如果這樣一個(gè)程序也需要更新一些共享的資源(如全局數據結構,磁盤(pán)上的文件,或其他設備)來(lái)作為與相關(guān)設備事件的反映。象這樣的一個(gè)程序需要一個(gè)可靠的線(xiàn)索索管理系統。這恰恰是WIN32 API能夠提供的函數:多個(gè)線(xiàn)索索能夠快捷并且容易的用WIN32 API線(xiàn)索索創(chuàng )建界面建立;同步線(xiàn)索索(多個(gè)線(xiàn)索索同時(shí)訪(fǎng)問(wèn)一個(gè)數據)可以通過(guò)不同的方式完成,包括關(guān)鍵的段,有名稱(chēng)和沒(méi)有名稱(chēng)事件,以及互斥的目標。
Windows CE 被設計成在執行這些同步時(shí)占用最少的程序資源。這位對那些函數不強大的開(kāi)發(fā)者來(lái)說(shuō)十分重要;因為內核來(lái)負責線(xiàn)索索的管理,不需要使用另外的處理器來(lái)循環(huán)檢測程序或線(xiàn)索索完成,以及執行其他的無(wú)用的應用程序層次上的線(xiàn)索索管理。內核已構建好如何管理若干的線(xiàn)索索并且使程序高效地進(jìn)行的程序。
對于包括若干個(gè)程序的應用程序,WIN32 向用于線(xiàn)索索、程序管理和同步提供了一套的完備的處理方法。這些線(xiàn)索索管理特性非常適于嵌入式式應用程序軟件,并且對Windows CE開(kāi)發(fā)者是容易得到的。
消息
在32位windows平臺上運行的程序更專(zhuān)門(mén)化,程序的線(xiàn)索依賴(lài)于消息來(lái)初始化程序,控制系統資源并且與操作系統和用戶(hù)通信。 windows消息有各種各樣來(lái)源 ,包括操作系統,用戶(hù)活動(dòng)諸如鍵盤(pán)輸入、鼠標、觸到屏幕,以及其它運行的程序或者線(xiàn)索。
當消息被送到線(xiàn)索時(shí),這條消息被放置在消息隊列中等待最后處理(圖3)。每一條線(xiàn)索擁有完全不獨立于其它線(xiàn)索所擁有的消息隊列的消息隊列。線(xiàn)索一般有不斷運行的消息循環(huán),恢復和處理消息。當隊列地沒(méi)有消息,并且線(xiàn)索不從事于其它任何活動(dòng),系統掛起線(xiàn)索,以節省中央控制器資源。
消息也能用于控制目的,初始化你的應用程序中各種類(lèi)型的程序,并且他們能利用消息參數傳遞數據。例如,線(xiàn)索可能收到觸屏被激活的消息,消息參數可以表明X和Y為用戶(hù)行動(dòng)的坐標。 在另一種類(lèi)型的消息中,參數可以包括指針或者指向數據結構、窗口或其他對象的句柄。
{{分頁(yè)}}
中斷處理
作為一嵌入式的的軟件開(kāi)發(fā)者,你可能最關(guān)心windows CE消息的處理規則是如何影響你的外部系統接口的時(shí)序的。windows CE通過(guò)細心設計和準確的衡量以保證其中斷時(shí)序以及其它相關(guān)的特位與嵌入式式的系統設計是適用的。
嵌入式應用程序經(jīng)常有時(shí)間臨界的設備接口需要,需要發(fā)現并且在一最小的規定的時(shí)間之內對設備和系統事件作出反應。 為了支持這樣應用程序, windows CE包括高度優(yōu)化中斷傳送,優(yōu)先級和服務(wù)系統。
在windows CE內核中 ,中斷處理分成兩個(gè)明顯的部分:中斷服務(wù)程序(ISR )以及中斷服務(wù)線(xiàn)索(IST )。這個(gè)系統的目的是使ISR 盡可能小和快。在硬件的層次上,每一中斷要求(IRQ )線(xiàn)索路與一特定的軟件ISR聯(lián)系。當被觸發(fā)時(shí),給定的ISR除了通知內核IST的位置外,還做少量的工作。一旦IST 被初始化(盡管沒(méi)必要完成),系統便準備好接受下一中斷并且處理下一中斷。
每一個(gè)中斷有一個(gè)優(yōu)先級與他們相聯(lián)系。 windows CE為確定的線(xiàn)索時(shí)時(shí)序,利用基于優(yōu)先級的時(shí)間片段算法。與每一ISR 被聯(lián)系的IST 是正常的線(xiàn)索,因此為IST設置優(yōu)先級以滿(mǎn)足應用程序的時(shí)序需要是應用程序軟件開(kāi)發(fā)者的責任。
這種將ISR 和IST在中斷程序中分開(kāi)處理最終結果是,典型的中斷等待時(shí)間被大大地減少了,在中斷程序中發(fā)生不可接受的延遲的可能性也大大減少。此外, 嵌入式式軟件包 和windows CE內核的特性使有可能按習慣定制中斷時(shí)序和優(yōu)先級,以滿(mǎn)足特定應用程序的需要。 Windows CE和其使用的時(shí)間臨界、實(shí)時(shí)應用程序在另一篇文章中包括比本文更詳細的內容,文章名為《 Real-time Systems with Microsoft Windows CE》。
內存管理
WIN32 API為向開(kāi)發(fā)者提供了一套完備的和一致的接口。 當開(kāi)發(fā)絕大部分應用程序的時(shí)候,軟件開(kāi)發(fā)者不需要考慮特定內存結構。 然而對于許多嵌入式應用程序,特別是那些有嚴格的內存資源約束或者臨界時(shí)序的要求的,對內存被管理的方法有好的理解是重要的。
Windows的內存的一般結構對于不同的32 位Windows平臺是不同的,并且特殊的細節結構在同一32 位Windows操作系統下不同的處理機之間也不同。 (例如,Windows NT的內存結構在X86 平臺上與在DEC Alpha 平臺上的用法十分不同 。) 對于這段的討論,我們將專(zhuān)門(mén)集中在Windows CE操作系統的部分中進(jìn)行。
Windows CE的存儲結構
像其它的32 位Windows平臺一樣,Windows CE操作系統也有虛擬內存的特性。內存總在某一時(shí)間被分配給應用程序一頁(yè),頁(yè)的大小由系統設計者決定(并在操作系統為目標硬件平臺創(chuàng )建時(shí)被指定)。例如 在手持電腦,內存頁(yè)大小是典型的1KB 或者4KB 。
在初始化期間(導入),Windows CE創(chuàng )造一個(gè)獨立的被所有程序共享的4GB 虛擬地址空間。當程序引用一個(gè)虛擬的地址時(shí),它被內核記錄在物理的內存上。 這使得應用程序軟件開(kāi)發(fā)者不必去考慮目標系統內存的物理的布局。雖然所有程序共享單一地址空間,應用程序仍然可避免相互誤用。Windows CE 通過(guò)改變每頁(yè)的保護來(lái)保護程序內存,而不是分配給每一程序不同地址空間。 作為應用程序開(kāi)發(fā)者,你可能不會(huì )太在乎目標系統的內存的物理的結構。 內存可以全部是隨機存取內存,或者它可能包括閃存卡或者硬盤(pán)驅動(dòng)器。Windows CE操作系統為你管理內存資源,同時(shí)WIN32 API 向你提供必要的分配、使用和釋放的內存的接口。
然而,作為一個(gè)嵌入式的系統的設計者,你將需要細心考慮將在你新的硬件平臺上執行的應用程序的內存需要,并且全面考慮成本、速度和可靠性,平衡各種目標的沖突。 如果你為使用Windows CE開(kāi)發(fā)一個(gè)新的硬件平臺 ,Windows CE的面向Visual C++ 的嵌入式軟件包包括資源可以幫助你做出這些決策,并且從而構成操作系統。
無(wú)論你的系統內存的配置如何,ROM(只讀內存)將占用十分重要的地位。不同于其它的32位Windows操作系統,Windows CE操作系統的代碼在只讀內存中,并且在那個(gè)只讀內存中原地執行。 依據你的產(chǎn)品需要,你也能選擇在只讀內存中放置應用程序代碼。 例如,Pocket Word,Pocket Excel和其它應用程序程序,包括在手持電腦只讀內存中被提供的。
存儲在ROM中的程序組在Windows CE下當地執行,所以嵌入式系統的設計者能夠只占用很少的RAM用于堆棧存儲的需要。相應地,你的嵌入式應用程序可以利用RAM既作為程序的內存又可作臨時(shí)存儲空間。
為了進(jìn)一步的增加應用程序軟件的性能, Windows CE采用按需求將內存分葉;操作系統僅僅需要解壓縮并且裝入基于RAM的一小部分程序準備執行。ROM和 基于RAM的程序的靈活性與速度意味著(zhù)基于Windows CE的設備能夠被構造成各種內存結構形式。
手持電腦的內存結構
典型的Windows CE的硬件平臺的內存結構是與基于 Windows系統的臺式電腦的內存結構十分不同的。 為了知道內存通常如何在Windows中被處理的 ,考查基于Windows CE的最普通的代表性的設備-手持電腦,是很有用的。
在手持電腦中,RAM被分割成兩個(gè)主要的部分:存儲內存和程序內存。 向兩部分分配的RAM的量能被手持電腦用戶(hù)修改(在限制范圍內)。 這個(gè)RAM的劃分圖如圖4所示。
在手持電腦中的存儲內存類(lèi)似于臺式電腦的硬盤(pán)RAM。 它被用來(lái)存儲數據和非系統應用程序。它的三段中每一段被不同的一套WIN32 API 訪(fǎng)問(wèn)函數:
Windows CE系統寄存器類(lèi)似于Windows NT和Windows 95的操作系統的寄存器。你能利用WIN32 寄存器函數來(lái)操縱寄存器中鍵和數值。
被用戶(hù)安裝的應用程序和數據在一般文件存儲段中。Windows CE文件系統API 是標準WIN32 文件系統的子集函數。
對于數據庫應用程序,由Windows CE 數據庫API來(lái)存儲被管理存儲。這API 對Windows CE是唯一的 ,并且在其它的WIN32 平臺中沒(méi)有。
程序內存被用于系統和非系統程序的堆棧存儲。 非系統應用程序從存儲內存(或者或許PC卡)被取得,非壓縮的并且被裝入要執行程序內存中。
{{分頁(yè)}}
意外情況處理
意外情況處理是強大的編程技術(shù),相應一套的WIN32 API 起函數能容易的發(fā)現未預料到的錯誤狀況,并且使之恢復。結構化的意外情況處理,允許危險的段的代碼可能由于硬件資源的問(wèn)題、設備的沖突和微小的編碼錯誤而導致失敗,以使這部分程序與其余的應用程序分開(kāi)。這保護了應用程序,使之免于過(guò)早的終止或者產(chǎn)生敏感的系統問(wèn)題。
結構化的意外情況處理包括定義一系列聲明作為保護,并且為第一套的聲明定義了另一個(gè)套聲明作為意外情況句柄。 意外情況句柄定義了一個(gè)或多個(gè)聲明來(lái)保障系統的運行,而不管保護聲明的現有的狀態(tài)。
在大多數32 位Windows平臺上應用WIN32 API 的程序員在運用意外情況句柄的時(shí)候通常有兩種選擇,用C或 C++ 編寫(xiě)應用程序,并且利用WIN32提供的處理意外情況的宏,或者利用C++ 編寫(xiě)應用程序,并且使用C++ 語(yǔ)言定義的意外情況處理函數。
對于這種程序的編寫(xiě),Windows CE的開(kāi)發(fā)者因無(wú)法訪(fǎng)問(wèn)C++的(面向Windows CE的Visual C++ 目前還不支持意外情況處理,所以必須使用WIN32 API的意外情況處理宏。
為了應用WIN32意外情況處理,你將使用一套在WIN32 API 中被定義的宏。 下面一段代碼顯示其基本概念:
_try {
// The statements in here have a possibility of failure
// and so are guarded.
}
__finally {
// This is the exception handler. This code will execute
// after the guarded statements, no matter what happened
// in the guarded block of code above.
}
// This code will execute normally if the program flow allows
// it (no goto, exit, etc.)
__try 以及__finally 宏產(chǎn)生了使用意外情況句柄的所必要的底層代碼。
意外情況的處理對諸如在嵌入式的應用程序中的那些普通的多線(xiàn)程序是有用的。WIN32結構化意外情況處理宏 是一種容易并且強大的保護應用程序使之免受未預料到的失敗的方法。
設備處理
有無(wú)數硬件設備(外圍設備)與應用Windows的平臺(Windows NT以及 Windows 95)臺式機是兼容的,并且每一年都有更多的東西在市場(chǎng)上涌現。而Windows CE的平臺,通常不支持臺式計算機支持的設備的很多品種的外圍硬件。 然而,為一嵌入式的的系統創(chuàng )造可靠的設備接口在嵌入式的程序設計的過(guò)程中,是比較富有挑戰性的部分。 這部分地因為典型的嵌入式的系統接口的時(shí)序與其它可操作性的需要遠比臺式電腦計算系統和應用程序的更難。
幸運地,WIN32 API 提供了一套豐富使設備接口方法,使得設備接口程序寫(xiě)起來(lái)更容易并適合于特定嵌入式的系統的需要。
WIN32 API是如何幫助的 WIN32 API在你的硬件平臺為你提供一套一致的基于流的接口。 為了使用設備,你首先利用適合于設備類(lèi)型的函數打開(kāi)它。 對于大多數設備,你利用的函數是在下列例子中的CreateFile 函數:
HANDLE hPort = CreateFile("COM1"); // Open the serial port
CreateFile函數打開(kāi)規定的設備(串口)并且返回用于以后在該種設備上的操作(例如讀和寫(xiě))的句柄。 各種各樣函數的(包括ReadFile ,WriteFile ,LockFile 和其他)接受這個(gè)句柄為參數,并且允許你(例如)讀寫(xiě)數據,檢查設備狀態(tài),并且將從其它程序的存取被鎖住的設備或者文件列入清單。 文件輸入輸出操作被處理成與其它設備類(lèi)型利用同樣的API 函數,并且在文件之內包括隨機的訪(fǎng)問(wèn)的函數。 被若干程序或線(xiàn)索同時(shí)訪(fǎng)問(wèn)的設備和文件可以分區域地利用LockFile 函數鎖定。
在你的應用程序已完成設備或者文件之后,它將調用CloseFile 函數關(guān)閉設備,并且進(jìn)行必要的清除設備的工作。
同步和異步的設備的處理
嵌入式系統的經(jīng)常有關(guān)鍵的設備有時(shí)序需要。 對于這個(gè)理由,對底層的操作系統的軟件接口必須能夠在軟件層次上管理同時(shí)(或者幾乎同時(shí))的系統中不同類(lèi)型的設備的事件。 WIN32 API 支持對設備的同步和異步的訪(fǎng)問(wèn),并且用復雜的設備接口設計。
同步的接口是那些在軟件需要從設備得到動(dòng)作的要求,然后等候結果。在同步的設備接口中,最常用的是前面已經(jīng)提到的ReadFile 以及WriteFile函數。當在同步I/O中使用的時(shí)候,不論你與磁盤(pán)上的文件、并口或是串口、一個(gè)通道或其它類(lèi)型的設備接口時(shí),都是公用的并且是兼容的。
異步的接口是那些設備要求應用程序為之服務(wù)的接口。一個(gè)異步的設備的好的例子是鍵盤(pán)。適當和適時(shí)的處理異步事件,對于許多嵌入式應用程序是至關(guān)緊要的。幸運的是,為Windows CE編寫(xiě)的設備驅動(dòng)程序能支持同時(shí)的多線(xiàn)索訪(fǎng)問(wèn)驅動(dòng)器。這大大地簡(jiǎn)化異步輸入設備的處理。
你所訪(fǎng)問(wèn)的給定的設備的方法,取決于那個(gè)設備的特性和你開(kāi)發(fā)的特定的應用程序的要求。如果你在基于你的Windows CE的硬件平臺上創(chuàng )建一個(gè)全新的設備(和設備驅動(dòng)程序),你可以既從你的硬件設備和驅動(dòng)器的層次,又可以從應用程序的層次有許多選擇。
定制設備和WIN32
盡管嵌入式系統可以支持較小數量的設備,嵌入式系統能形成唯一的和挑戰型的設備接口問(wèn)題。當你開(kāi)發(fā)一個(gè)新的硬件平臺并且它支持輸入輸出設備,在模你設計的不同層次上,你將不得不作出決策和折衷方案。例如,除非你只使用通常的off-the-shelf硬件,你必然套寫(xiě)用戶(hù)設備驅動(dòng)程序支持你的新外圍設備。 你也能需要配置你的Windows CE來(lái)包含一些設備處理必要的組件。同時(shí)從應用程序的層次,為滿(mǎn)足新的設備的需要,你將需要寫(xiě)接口代碼。在有如此多變量的情況下,你如何保持你的設備的一定程度的一致行呢?答案就在WIN32 API 中。在WIN32 API環(huán)境下,寫(xiě)你的目標驅動(dòng)程序,你有理由自信的認為那些新設備的接口的應用程序開(kāi)發(fā)者能夠創(chuàng )造可信的,可檢驗和可維護的基本代碼。Windows CE設備驅動(dòng)程序開(kāi)發(fā)工具包,或者簡(jiǎn)稱(chēng)DDK ,提供了如何創(chuàng )造WIN32功能強大的設備驅動(dòng)程序信息和范例。
設備的類(lèi)型
Windows CE支持兩種基本類(lèi)型的設備驅動(dòng)程序,內置固化的驅動(dòng)程序和可安裝的驅動(dòng)程序。 如同名字所暗示的,內置固化的驅動(dòng)程序是被指定用于一個(gè)給定的Windows CE的硬件平臺的設備。Windows CE的嵌入式系統設計者有責任提供一個(gè)內置固化的驅動(dòng)程序來(lái)驅動(dòng)系統所包括的設備。例如,許多Windows CE平臺有一個(gè)LCD 觸摸屏。這些平臺的制造廠(chǎng)為他們的設備提供設備驅動(dòng)程序,使此硬件可以用于Windows CE操作系統。在完備的系統中,這些內置固化的驅動(dòng)程序位于Windows CE只讀內存中內核的周?chē)?nbsp;
可安裝的設備驅動(dòng)程序是被設定為為了任何與Windows CE 硬件平臺臨時(shí)連接的外圍的設備。這個(gè)類(lèi)型的設備包括:調制解調器,打印機,數字的照相機,PC卡,以及任何數量的其它外部的設備。 可安裝的設備驅動(dòng)程序可能位于只讀內存中,但是更典型與臨時(shí)性的設備的接口的應用程序軟件一同裝載。
總結
本文已為概略地介紹了面向Windows CE的WIN32 API,其目的是為了突出這種被廣廣泛應用的并且十分重要的API的一般的特點(diǎn)和優(yōu)點(diǎn)。有許多其它的細節你需要在第一次使用Windows CE嵌入式產(chǎn)品之前來(lái)學(xué)習掌握;幸運的是,有很多的WIN32 API 的信息的資源。
這些資源包括Microsoft開(kāi)發(fā)網(wǎng)絡(luò )(MSDN ),文章(諸如本文)和報紙,以及大量出版的書(shū)。[/b]
評論