WinCE嵌入式開(kāi)發(fā)程序入門(mén)
在初始化期間(導(dǎo)入),Windows CE創(chuàng)造一個(gè)獨(dú)立的被所有程序共享的4GB 虛擬地址空間。當(dāng)程序引用一個(gè)虛擬的地址時(shí),它被內(nèi)核記錄在物理的內(nèi)存上。 這使得應(yīng)用程序軟件開(kāi)發(fā)者不必去考慮目標(biāo)系統(tǒng)內(nèi)存的物理的布局。雖然所有程序共享單一地址空間,應(yīng)用程序仍然可避免相互誤用。Windows CE 通過(guò)改變每頁(yè)的保護(hù)來(lái)保護(hù)程序內(nèi)存,而不是分配給每一程序不同地址空間。 作為應(yīng)用程序開(kāi)發(fā)者,你可能不會(huì)太在乎目標(biāo)系統(tǒng)的內(nèi)存的物理的結(jié)構(gòu)。 內(nèi)存可以全部是隨機(jī)存取內(nèi)存,或者它可能包括閃存卡或者硬盤(pán)驅(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開(kāi)發(fā)一個(gè)新的硬件平臺(tái) ,Windows CE的面向Visual C++ 的嵌入式軟件包包括資源可以幫助你做出這些決策,并且從而構(gòu)成操作系統(tǒng)。
無(wú)論你的系統(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的量能被手持電腦用戶(hù)修改(在限制范圍內(nèi))。 這個(gè)RAM的劃分圖如圖4所示。
在手持電腦中的存儲(chǔ)內(nèi)存類(lèi)似于臺(tái)式電腦的硬盤(pán)RAM。 它被用來(lái)存儲(chǔ)數(shù)據(jù)和非系統(tǒng)應(yīng)用程序。它的三段中每一段被不同的一套WIN32 API 訪(fǎng)問(wèn)函數(shù):
Windows CE系統(tǒng)寄存器類(lèi)似于Windows NT和Windows 95的操作系統(tǒng)的寄存器。你能利用WIN32 寄存器函數(shù)來(lái)操縱寄存器中鍵和數(shù)值。
被用戶(hù)安裝的應(yīng)用程序和數(shù)據(jù)在一般文件存儲(chǔ)段中。Windows CE文件系統(tǒng)API 是標(biāo)準(zhǔn)WIN32 文件系統(tǒng)的子集函數(shù)。
對(duì)于數(shù)據(jù)庫(kù)應(yīng)用程序,由Windows CE 數(shù)據(jù)庫(kù)API來(lái)存儲(chǔ)被管理存儲(chǔ)。這API 對(duì)Windows CE是唯一的 ,并且在其它的WIN32 平臺(tái)中沒(mé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)的段的代碼可能由于硬件資源的問(wèn)題、設(shè)備的沖突和微小的編碼錯(cuò)誤而導(dǎo)致失敗,以使這部分程序與其余的應(yīng)用程序分開(kāi)。這保護(hù)了應(yīng)用程序,使之免于過(guò)早的終止或者產(chǎn)生敏感的系統(tǒng)問(wèn)題。
結(jié)構(gòu)化的意外情況處理包括定義一系列聲明作為保護(hù),并且為第一套的聲明定義了另一個(gè)套聲明作為意外情況句柄。 意外情況句柄定義了一個(gè)或多個(gè)聲明來(lái)保障系統(tǒng)的運(yùn)行,而不管保護(hù)聲明的現(xiàn)有的狀態(tài)。
在大多數(shù)32 位Windows平臺(tái)上應(yīng)用WIN32 API 的程序員在運(yùn)用意外情況句柄的時(shí)候通常有兩種選擇,用C或 C++ 編寫(xiě)應(yīng)用程序,并且利用WIN32提供的處理意外情況的宏,或者利用C++ 編寫(xiě)應(yīng)用程序,并且使用C++ 語(yǔ)言定義的意外情況處理函數(shù)。
對(duì)于這種程序的編寫(xiě),Windows CE的開(kāi)發(fā)者因無(wú)法訪(fǎng)問(wèn)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)用程序中的那些普通的多線(xiàn)程序是有用的。WIN32結(jié)構(gòu)化意外情況處理宏 是一種容易并且強(qiáng)大的保護(hù)應(yīng)用程序使之免受未預(yù)料到的失敗的方法。
設(shè)備處理
有無(wú)數(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ì)的過(guò)程中,是比較富有挑戰(zhàn)性的部分。 這部分地因?yàn)榈湫偷那度胧降南到y(tǒng)接口的時(shí)序與其它可操作性的需要遠(yuǎn)比臺(tái)式電腦計(jì)算系統(tǒng)和應(yīng)用程序的更難。
幸運(yùn)地,WIN32 API 提供了一套豐富使設(shè)備接口方法,使得設(shè)備接口程序?qū)懫饋?lái)更容易并適合于特定嵌入式的系統(tǒng)的需要。
WIN32 API是如何幫助的 WIN32 API在你的硬件平臺(tái)為你提供一套一致的基于流的接口。 為了使用設(shè)備,你首先利用適合于設(shè)備類(lèi)型的函數(shù)打開(kāi)它。 對(duì)于大多數(shù)設(shè)備,你利用的函數(shù)是在下列例子中的CreateFile 函數(shù):
評(píng)論