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