WINCE試驗(yàn)參考指導(dǎo)書(shū)專業(yè)資料_第1頁(yè)
WINCE試驗(yàn)參考指導(dǎo)書(shū)專業(yè)資料_第2頁(yè)
WINCE試驗(yàn)參考指導(dǎo)書(shū)專業(yè)資料_第3頁(yè)
WINCE試驗(yàn)參考指導(dǎo)書(shū)專業(yè)資料_第4頁(yè)
WINCE試驗(yàn)參考指導(dǎo)書(shū)專業(yè)資料_第5頁(yè)
已閱讀5頁(yè),還剩73頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

WINCE系統(tǒng)實(shí)驗(yàn)指引書(shū)WINCE系統(tǒng)實(shí)驗(yàn)指引書(shū) 1實(shí)驗(yàn)一、WindowsCE系統(tǒng)平臺(tái)創(chuàng)立及模仿器使用: 2一、實(shí)驗(yàn)?zāi)?2二、實(shí)驗(yàn)內(nèi)容 2三、預(yù)備知識(shí) 2四、實(shí)驗(yàn)設(shè)備 2五、實(shí)驗(yàn)原理 3六、實(shí)驗(yàn)環(huán)節(jié) 4七、思考題 11實(shí)驗(yàn)二、WindowsCEBOOTLOADER實(shí)驗(yàn) 12一、實(shí)驗(yàn)?zāi)?12二、實(shí)驗(yàn)內(nèi)容 12三、預(yù)備知識(shí) 12四、實(shí)驗(yàn)設(shè)備及工具 12五、實(shí)驗(yàn)原理及環(huán)節(jié) 12六、思考題 30實(shí)驗(yàn)三、WindowsCE驅(qū)動(dòng)開(kāi)發(fā) 31一、實(shí)驗(yàn)?zāi)?31二、實(shí)驗(yàn)內(nèi)容 31三、預(yù)備知識(shí) 31四、實(shí)驗(yàn)設(shè)備及工具 31五、實(shí)驗(yàn)原理及闡明 31六、實(shí)驗(yàn)環(huán)節(jié) 33七、思考題 40實(shí)驗(yàn)四、WindowsCE應(yīng)用程序開(kāi)發(fā) 41一、實(shí)驗(yàn)?zāi)?41二、實(shí)驗(yàn)內(nèi)容 41三、預(yù)備知識(shí) 41四、實(shí)驗(yàn)設(shè)備及工具 41五、實(shí)驗(yàn)原理及闡明 41六、實(shí)驗(yàn)環(huán)節(jié) 44七、思考題 58實(shí)驗(yàn)一、WindowsCE系統(tǒng)平臺(tái)創(chuàng)立及模仿器使用:一、實(shí)驗(yàn)?zāi)?、理解WinCE下重要工具——模仿器2、學(xué)習(xí)和模仿器有關(guān)遠(yuǎn)程調(diào)試工具3、學(xué)習(xí)WinCE調(diào)試手段4、復(fù)習(xí)WinCE開(kāi)發(fā)工具PlatformBuilder二、實(shí)驗(yàn)內(nèi)容建立WinCEPC端模仿器,建立使用模仿器配備,結(jié)識(shí)基于PB端WinCE遠(yuǎn)程調(diào)試工具。詳細(xì)環(huán)節(jié)如下:依照目的平臺(tái)特點(diǎn)和系統(tǒng)需要,使用PlatformBuilder配備WINDOWSCE操作系統(tǒng)特性和功能。編譯、鏈接操作系統(tǒng)內(nèi)核,生成內(nèi)核鏡像文獻(xiàn)NK.bin。將鏡像文獻(xiàn)下載,并在模仿器上運(yùn)營(yíng)生成WINDOWSCE系統(tǒng)。同步,構(gòu)建一種調(diào)試版WINDOWSCE系統(tǒng),并實(shí)際調(diào)試該系統(tǒng)。三、預(yù)備知識(shí)嵌入式系統(tǒng)調(diào)試手段和辦法基本概念,操作系統(tǒng)基本知識(shí),PlatformBuilder基本操作。四、實(shí)驗(yàn)設(shè)備硬件:PC一臺(tái)P3以上(內(nèi)存不不大于384MB,安裝竣工具硬盤剩余空間不得不大于600M)、ARM9實(shí)驗(yàn)箱(包括NETARM2410-S實(shí)驗(yàn)板、JTAG仿真器、各種串口線、并口線、網(wǎng)線、光盤等)一臺(tái)。軟件:PC操作系統(tǒng)Win以上、ADS1.2集成開(kāi)發(fā)環(huán)境、PlatformBuilder4.2版本、SourceInsight3.0。五、實(shí)驗(yàn)原理模仿器(emulator)是PB一某些。專用于調(diào)試在PB下創(chuàng)立內(nèi)核及應(yīng)用程序。模仿器可以在PC下模仿WindowsCE物理平臺(tái)。但事實(shí)上它只但是是一種運(yùn)營(yíng)在CPURing3級(jí)別顧客程序。因此它運(yùn)營(yíng)速度要比正常物理平臺(tái)要慢。模仿器僅支持x86平臺(tái),它只能調(diào)試基于"Emulator:x86"內(nèi)核和所有用x86指令集編譯程序。模仿器有很大限制,這些限制使它只能運(yùn)營(yíng)簡(jiǎn)樸應(yīng)用程序。但是有一點(diǎn)是好,操作系統(tǒng)大多數(shù)API對(duì)于任何CPU而言都是相似??紤]到不受CPU類型影響簡(jiǎn)樸程序,還是可以在模仿器上調(diào)試。學(xué)習(xí)PB,用它來(lái)創(chuàng)立內(nèi)核而又沒(méi)有實(shí)際物理平臺(tái)來(lái)調(diào)試,那么模仿器非常適合。但模仿器限制也非常多,因此雖然在模仿器下調(diào)試過(guò)所有可以調(diào)試內(nèi)核特性(feature,或者稱組件),你掌握也但是是冰山一角。WindowsCE.net模仿器是嵌入式開(kāi)發(fā)非常重要工具利器之一,通過(guò)模仿器可以在開(kāi)發(fā)端進(jìn)行平臺(tái)模仿仿真驗(yàn)證。并且在PB方面和EVC方面都可以啟動(dòng)模仿器。通過(guò)模仿器,可以模仿一種在線運(yùn)營(yíng)WinCE系統(tǒng)設(shè)備,使得針對(duì)硬件設(shè)備調(diào)試可以放在PC端模仿實(shí)現(xiàn),這對(duì)于整個(gè)開(kāi)發(fā)過(guò)程中設(shè)計(jì)和驗(yàn)證有著至關(guān)重要作用。這一點(diǎn)和許多嵌入式操作系統(tǒng)有相似之處,例如VxWorks。圖1-1WindowsCE模仿器窗口注意:關(guān)于模仿器硬件限制:(摘自WindowsCE協(xié)助文檔)僅能模仿DEC2114x網(wǎng)卡驅(qū)動(dòng)來(lái)提供網(wǎng)絡(luò)支持,其他網(wǎng)卡驅(qū)動(dòng)不支持。僅能模仿FLAT顯示驅(qū)動(dòng),其他顯示驅(qū)動(dòng)不支持。不支持USB設(shè)備不支持PC卡、硬盤、CF卡。不支持FAT、CDFS、DVD文獻(xiàn)格式。六、實(shí)驗(yàn)環(huán)節(jié)1、使用PB建立一種X86體系下模仿器辦法和上一種實(shí)驗(yàn)講過(guò)辦法類似,如下簡(jiǎn)樸概括一下過(guò)程。(1)運(yùn)用向?qū)Ы⒐こ?,第一步如圖所示:圖1-2工程建立第一步點(diǎn)擊“Next”進(jìn)入下一步,如圖所示:圖1-3工程建立第二步在這里可以選取你需要設(shè)備,也可以使用Customconfiguration自己定制。點(diǎn)擊“Next”進(jìn)入下一步,如圖所示:圖1-4工程建立第三步圖1-5工程建立第六步圖1-6工程建立第七步(2)配備編譯環(huán)境一方面需要設(shè)立Platform\setting…對(duì)話框選取Retail模式圖1-7設(shè)立Platform\setting…對(duì)話框保證EnableKITL,EnableKernelDebuger,EnableFullKernelMode三項(xiàng)都被選中,如圖所示。圖1-8設(shè)立Platform\setting選項(xiàng)圖1-9語(yǔ)言選項(xiàng)(3)編譯點(diǎn)擊快捷按鈕或者選取菜單Build\BuildPlatform編譯工程。詳細(xì)編譯時(shí)間和你機(jī)器配備有很大關(guān)系。編譯完畢,在系統(tǒng)信息里面會(huì)顯示編譯完畢信息“×errors,×warnings”,并顯示生成內(nèi)核鏡像文獻(xiàn),如圖所示。圖1-10內(nèi)核鏡像文獻(xiàn)(4)下載到模仿器配備模仿器:編譯成功后,單擊"Target"-"ConfigureRemoteConnection",如圖2-35。在彈出對(duì)話框中找到"Download"下拉框,選取"Emulator-4.20",單擊背面"Configure",在彈出對(duì)話框中設(shè)立辨別率為800X600或640X480。系統(tǒng)內(nèi)存設(shè)立為64MB。單擊"OK"后,在"Kernel"下拉框中選取"Emulator-4.20"。單擊"OK",如圖所示。圖1-11配備連接圖1-12配備模仿器啟動(dòng)模仿器:?jiǎn)螕?Target"-"DownloadInitialize"。在下面對(duì)話框點(diǎn)“Yes”。圖1-13啟動(dòng)模仿器等待一會(huì),模仿器就出來(lái)了。可以看到原則外殼界面,也就是桌面。圖1-14初始化下載顯示模仿器界面如下圖。注意:模仿器在本地PC生成需要占用較大內(nèi)存和CPU使用,因此應(yīng)當(dāng)保證足夠可用內(nèi)存,否則模仿器運(yùn)營(yíng)將非常慢。同步,由于PB編譯模仿器會(huì)產(chǎn)生大量文獻(xiàn),所以必要保證WindowCE.net系統(tǒng)目錄所在分區(qū)有足夠硬盤空間(至少600M),否則在編譯過(guò)程中會(huì)因磁盤空間不夠而中斷。圖1-15模仿器界面七、思考題結(jié)合你實(shí)驗(yàn)操作想一下,使用模仿器對(duì)于嵌入式開(kāi)發(fā)有什么好處?實(shí)驗(yàn)二、WindowsCEBOOTLOADER實(shí)驗(yàn)一、實(shí)驗(yàn)?zāi)?、掌握WinCE啟動(dòng)過(guò)程,2、掌握WinCEforS3C2410中Bootloader基本工作原理,3、理解普通Bootloader開(kāi)發(fā)辦法。二、實(shí)驗(yàn)內(nèi)容學(xué)習(xí)NETARM2410-S上WinCEBootloader工作原理,理解各級(jí)boot功能,結(jié)識(shí)Bootloader在嵌入式操作系統(tǒng)中普通開(kāi)發(fā)辦法。詳細(xì)環(huán)節(jié)如下:理解WinCE啟動(dòng)過(guò)程,掌握WinCEforS3C2410中Bootloader基本工作原理掌握兩級(jí)Bootloader不同功能,完畢兩級(jí)Bootloader燒寫(xiě)編譯、鏈接操作系統(tǒng)內(nèi)核,生成內(nèi)核鏡像文獻(xiàn)NK.bin,通過(guò)Eboot下載鏡像文獻(xiàn),最后在開(kāi)發(fā)板上引導(dǎo)WINDOWSCE系統(tǒng)三、預(yù)備知識(shí)C語(yǔ)言基本知識(shí),操作系統(tǒng)體系構(gòu)造基本知識(shí),Bootloader方面知識(shí)。四、實(shí)驗(yàn)設(shè)備及工具硬件:PC一臺(tái)P3以上(內(nèi)存不不大于384MB,安裝竣工具硬盤空間不得不大于600M)、ARM9實(shí)驗(yàn)箱(包括NETARM2410-S實(shí)驗(yàn)板、JTAG仿真器、各種串口線、并口線、網(wǎng)線、光盤等)一臺(tái)。軟件:PC操作系統(tǒng)Win以上、ADS1.2集成開(kāi)發(fā)環(huán)境、PlatformBuilder4.2版本、SourceInsight3.0。五、實(shí)驗(yàn)原理及環(huán)節(jié)1、Bootloader概述簡(jiǎn)樸地說(shuō),BootLoader就是在操作系統(tǒng)內(nèi)核運(yùn)營(yíng)之前運(yùn)營(yíng)一段小程序。通過(guò)這段小程序,可以完畢初始化硬件設(shè)備、建立內(nèi)存空間映射圖、和內(nèi)核鏡像建立通訊通道和調(diào)試通道等等工作,從而將系統(tǒng)軟硬件環(huán)境帶到一種適當(dāng)狀態(tài),以便為最后調(diào)用操作系統(tǒng)內(nèi)核準(zhǔn)備好對(duì)的環(huán)境。普通來(lái)講,BootLoader是嚴(yán)重依賴于硬件而實(shí)現(xiàn),特別是在嵌入式系統(tǒng)中(有些某些還不可避免使用匯編語(yǔ)言實(shí)現(xiàn))。因而,在嵌入式世界里幾乎不也許建立一種通用BootLoader。因此針對(duì)特定解決器,必要專門來(lái)定制Bootloader,以實(shí)現(xiàn)不同功能需求。圖2-1bootloader與其他構(gòu)造關(guān)系絕大多數(shù)Bootloader實(shí)現(xiàn)功能都無(wú)外乎兩個(gè):?jiǎn)?dòng)內(nèi)核鏡像和下載內(nèi)核鏡像。而兩者區(qū)別在顧客看來(lái)是不存在,它們只針對(duì)開(kāi)發(fā)人員。因而,Bootloader作用是看起來(lái)很不起眼但實(shí)則是很重要。啟動(dòng)加載(Bootloading)模式:即Bootloader自動(dòng)加載系統(tǒng)過(guò)程,整個(gè)過(guò)程并沒(méi)有開(kāi)發(fā)者和顧客介入。在正常條件下,必要保證這種啟動(dòng)方式有效,特別是在嵌入式產(chǎn)品發(fā)布時(shí)侯,BootLoader必要直接工作在這種模式下以保證系統(tǒng)正常運(yùn)營(yíng)。下載(Downloading)模式:在這種模式下,目的機(jī)上BootLoader將通過(guò)串口連接或網(wǎng)絡(luò)連接等通信手段從主機(jī)(Host)下載文獻(xiàn),例如:下載內(nèi)核映像和根文獻(xiàn)系統(tǒng)映像等。從主機(jī)下載文獻(xiàn)普通一方面被BootLoader保存到目的機(jī)RAM中,然后再被BootLoader寫(xiě)到目的機(jī)上FLASH類固態(tài)存儲(chǔ)設(shè)備中。有系統(tǒng)還將啟動(dòng)各種通訊辦法。BootLoader這種模式普通在第一次安裝內(nèi)核與根文獻(xiàn)系統(tǒng)時(shí)被使用;此外,后來(lái)系統(tǒng)更新也會(huì)使用BootLoader這種工作模式。工作于這種模式下BootLoader普通都會(huì)向它終端顧客提供一種簡(jiǎn)樸命令行接口,并可以執(zhí)行簡(jiǎn)樸交互。如下圖2-2所示圖2-2BootLoader構(gòu)造圖2、燒寫(xiě)B(tài)ootloader2410-S上CE系統(tǒng)和其她RTOS不同,它具備兩級(jí)Bootloader來(lái)引導(dǎo)內(nèi)核鏡像。在Bootloader階段,比起其她系統(tǒng)Bootloader來(lái)講要復(fù)雜多。(1)NbootNboot(NandFlashBootloader)是2410-S上WinCE第一級(jí)Bootloader,位于NandFlashBlock0。重要負(fù)責(zé)初始化Flash,讀取TOC,等等工作,最后將Eboot內(nèi)容拷貝到RAM中,把CPU執(zhí)行權(quán)交給Eboot接管。Nboot可以使用ADS開(kāi)發(fā),也可以使用其她工具來(lái)開(kāi)發(fā)。使用SJF來(lái)把Nboot某些Bootloader燒寫(xiě)在第0個(gè)block中。用法如下:修改BIOS中計(jì)算機(jī)并口選項(xiàng),設(shè)立并口為“378”模式。安裝Giveio驅(qū)動(dòng),詳細(xì)安裝請(qǐng)參照Giveio闡明。之后在平臺(tái)和PC之間連接好JTAG下載線。在命令行運(yùn)營(yíng)SJF2410/f:2410loader.bin回車,可以看到如下圖界面注:在這里三次選取順序?yàn)?00(0120)圖2-3選取K9S1208prog,即輸入“0”,回車,如圖所示。圖2-4選取K9S1208Program,即輸入“0”,回車,如圖2-5所示。圖2-5向block0燒寫(xiě),即輸入“0”,回車。之后看到浮現(xiàn)“Epppp……”字樣表達(dá)正在向相應(yīng)flash中寫(xiě)入數(shù)據(jù)。燒寫(xiě)完之后選取“2”Exit退出,如圖所示。圖2-6圖2-7(2)TOCTOC(TableOfContent)是整個(gè)NandFlash中存儲(chǔ)內(nèi)容一種列表,這里面儲(chǔ)存了關(guān)于啟動(dòng)和系統(tǒng)內(nèi)核某些有關(guān)存儲(chǔ)信息,需要寫(xiě)在NandFlashblock1中,由Nboot里函數(shù)讀取。之后Nboot會(huì)按照讀取內(nèi)容進(jìn)行配備和跳轉(zhuǎn)到不同地址。使用文本查看工具可以看到TOC重要組織形式。如圖所示:圖2-8注:在這里三次選取順序?yàn)?01(0120)圖2-9圖2-10(3)EbootEboot(EthernetBootloader)是一種高檔Bootloader,可以理解為一種偽KernelImage,位于從NandFlashBlock2開(kāi)始某些空間。它重要負(fù)責(zé)各個(gè)設(shè)備初始化,內(nèi)存地址映射,文獻(xiàn)系統(tǒng),網(wǎng)絡(luò)系統(tǒng)驅(qū)動(dòng)和加載內(nèi)核鏡像有關(guān)準(zhǔn)備工作,已經(jīng)是比較復(fù)雜Bootloader了。使用Eboot下載內(nèi)核,Eboot執(zhí)行完畢之后可以通過(guò)控制臺(tái)來(lái)下載真正KernelImage,并跳轉(zhuǎn)到Kernel來(lái)執(zhí)行,這時(shí)系統(tǒng)就引導(dǎo)起來(lái)了。在執(zhí)行過(guò)程中,Eboot會(huì)依照需要變化TOC中內(nèi)容,這樣就記錄下來(lái)當(dāng)時(shí)狀態(tài),例如IP地址,MAC地址,啟動(dòng)信息等等。值得注意是,只有在調(diào)試階段才有使用Eboot必要,當(dāng)系統(tǒng)設(shè)計(jì)完畢之后,可以通過(guò)修改Nboot來(lái)直接跳轉(zhuǎn)執(zhí)行KernelImage,不再使用Eboot來(lái)控制執(zhí)行。這時(shí),啟動(dòng)速度會(huì)有很大提高。BootLoader由兩某些構(gòu)成:OEM啟動(dòng)代碼(OEMstartupcode)和主代碼(maincode)。OEM啟動(dòng)代碼是最先執(zhí)行某些,它功能是初始化內(nèi)存寄存器、設(shè)立CPU頻率、初始化高速緩存等。之后它跳轉(zhuǎn)到主代碼中執(zhí)行。普通OEM啟動(dòng)代碼都是用匯編編寫(xiě)。主代碼普通用C語(yǔ)言編寫(xiě),它負(fù)責(zé)其他所有任務(wù),在執(zhí)行同步還可以將執(zhí)行有關(guān)信息顯示在屏幕上。普通添加公司LOGO或者其他啟動(dòng)LOGO都在此修改。主代碼重要由幾種某些構(gòu)成:鏡像下載代碼,通過(guò)并口或者網(wǎng)卡來(lái)實(shí)現(xiàn)從遠(yuǎn)程計(jì)算機(jī)下載nk.bin;串口調(diào)試代碼,包括對(duì)串口讀寫(xiě)函數(shù),顧客調(diào)用這些函數(shù)就可以通過(guò)串口在遠(yuǎn)程計(jì)算機(jī)和本地計(jì)算機(jī)之間通信;寫(xiě)flash代碼,包括寫(xiě)鏡像到flash函數(shù);硬件監(jiān)控代碼。普通BootLoader執(zhí)行流程見(jiàn)下圖:圖2-11上圖中每個(gè)函數(shù)功能如下:StartUp():CPU最先執(zhí)行函數(shù)。也就是啟動(dòng)代碼。BootLoaderMain():先后調(diào)用KernelRelocate、OEMDebugInit、OEMPlatformInit、OEMPreDownload等函數(shù)。此函數(shù)源碼文獻(xiàn)途徑為%_WINCEROOT%\public\common\oak\drivers\ethdbg\blcommon。OEMDebugInit():初始化串口。OEMPlatformInit():執(zhí)行特定平臺(tái)初始化工作,如時(shí)鐘、某些驅(qū)動(dòng)程序。OEMPreDownload():做下載前準(zhǔn)備工作。普通用于反饋給顧客某些信息。DownloadImage():下載操作系統(tǒng)鏡像到RAM或者Flash。OEMLaunch():負(fù)責(zé)啟動(dòng)鏡像。OEMReadData():從遠(yuǎn)程計(jì)算機(jī)讀取數(shù)據(jù)。OEMMapMemAddr():專用于寫(xiě)Flash時(shí)使用。由于寫(xiě)flash速度非常慢,因此此函數(shù)將Flash鏡像暫時(shí)緩沖到RAM中。OEMShowProgress():從函數(shù)名就能看出。OEMIsFLashAddr():判斷一種地址與否是Flash地址。OEMFinishEraseFlash():判斷與否完畢了擦除Flash內(nèi)容工作。OEMWriteFlash():寫(xiě)鏡像到Flash。OEMStartEraseFlash():開(kāi)始擦除Flash。OEMContinueEraseFlash():繼續(xù)擦除Flash工作。可以看到,在Eboot中,所關(guān)于于網(wǎng)絡(luò)和系統(tǒng)初始化工作都已經(jīng)完畢,并作好了下載內(nèi)核鏡像準(zhǔn)備,DownloadImage()下載內(nèi)核鏡像,最后執(zhí)行OEMLaunch()函數(shù),跳轉(zhuǎn)到內(nèi)核開(kāi)始地址運(yùn)營(yíng)。此后內(nèi)核就接管了CPU使用權(quán)和控制權(quán),Bootloader退出控制。流程圖如下圖:圖2-12Eboot也需要使用sjf2410在命令行中燒寫(xiě),在命令行里面敲入sjf2410/f:eboot.nb0選取K9S1208,再選取寫(xiě)入Block2.操作與燒寫(xiě)Nboot完全類似注:在這里三次選取順序?yàn)?02(0120)圖2-13圖2-143、控制臺(tái)使用Bootloader下載好之后,可以運(yùn)營(yíng)控制臺(tái)執(zhí)行某些操作。控制臺(tái)負(fù)責(zé)了關(guān)于啟動(dòng)內(nèi)核基本操作。建立控制臺(tái)如下圖所示:建立超級(jí)終端對(duì)EBOOT進(jìn)行配備圖2-15圖2-16圖2-17在這里需要對(duì)端口進(jìn)行設(shè)立圖2-18進(jìn)入下畫(huà)面后單擊空格鍵就會(huì)進(jìn)入EBOOT配備截面(即控制臺(tái))圖2-19Eboot配備界面圖2-20功能解釋:1為設(shè)備啟動(dòng)IP及子網(wǎng)地址設(shè)定;2為boot延時(shí)時(shí)間設(shè)定;3選取與否設(shè)立動(dòng)態(tài)IP分派,這一級(jí)Boot可以選取IP分派方式;4為重置TOC為缺省設(shè)立,各項(xiàng)參數(shù)將還原為默認(rèn)值;5有兩個(gè)選取,切換DOWNLOADNEW方式和LAUNCHEXIST方式;6選取與否將RAM內(nèi)image寫(xiě)入到NandFlash中去,如果是Disable,則系統(tǒng)掉電將不能被保存;7選取修改MAC地址,推薦避開(kāi)主機(jī)MAC地址;8選取與否啟動(dòng)KernelDebug功能;9為格式化整片NandFlash為二進(jìn)制文獻(xiàn)系統(tǒng),這需要大概幾分鐘時(shí)間;B選取與否支持二進(jìn)制文獻(xiàn)系統(tǒng),如果選取了9,則必要支持二進(jìn)制文獻(xiàn)系統(tǒng);D下載內(nèi)核鏡像;R讀取TOC中實(shí)際配備數(shù)據(jù);F為低檔格式化NandFlash,選取這一項(xiàng)將擦除flash上涉及Bootloader所有內(nèi)容;L運(yùn)營(yíng)NandFlash上已有內(nèi)核鏡像。W將當(dāng)前配備好數(shù)據(jù)寫(xiě)到TOC中保存。在這里重要對(duì)1、5、6、7、9等進(jìn)行功能選取(其選項(xiàng)含義在下邊有詳解)注:1)IP及子網(wǎng)地址設(shè)定(注:IP規(guī)定同一網(wǎng)段網(wǎng)地址與PC相似)5)第一次下載選取DOWNLOADNEW方式成功后改為L(zhǎng)AUNCHEXIST方式6)若不選取ENABLED將不會(huì)被寫(xiě)入FLASH中掉電后將會(huì)丟失7)修改MAC地址;不要與主機(jī)發(fā)生沖突(兩者設(shè)立不同)9)最佳在下載新內(nèi)核鏡像時(shí)候先格式化FLASH否則也許會(huì)在下載新內(nèi)核后浮現(xiàn)某些錯(cuò)誤4.對(duì)編譯好鏡像內(nèi)核進(jìn)行下載:(此鏡像是通過(guò)PlatformBuilder4.2來(lái)完畢;此工具軟件可在微軟網(wǎng)站下載)(1)一方面在PlatformBuilder4.2上建立一種工程(建立細(xì)節(jié)參照實(shí)驗(yàn)一)(2)然后把NK.bin放在你安裝PlatformBuilder4.2盤符下如:C:\WINCE420\PUBLIC\arm2410\RelDir\SAMSUNG_SMDK2410_ARMV4IDebug注:arm2410是建立工程名字(3)在PB中選取菜單中Target/ConfigureRemoteConnection…,彈出如下對(duì)話框:選取相應(yīng)平臺(tái)之后將“Download:”“Kernel”都選取為“Ethernet”。然后啟動(dòng)實(shí)驗(yàn)板,按空格進(jìn)入控制臺(tái),監(jiān)視超級(jí)終端,選取“D”選項(xiàng)下載新內(nèi)核,然后等待超級(jí)終端浮現(xiàn):“Usingdevicename:'SMDK'+EbootSendBootmeAndWaitForTftpSentBOOTMEto55SentBOOTMEto55或類似字樣。圖2-21圖2-22圖2-23選取configure等待選取設(shè)備號(hào)圖2-24圖2-25(3)內(nèi)核編譯時(shí)間普通較長(zhǎng),如果不想等待太久,可以將光盤中已經(jīng)編譯完畢NK.bin拷貝到系統(tǒng)編譯目錄%_winceroot%\PUBLIC\NETARM2410-S\RelDir\SAMSUNG_UT2410XARMV4Release或類似目錄下(如果已經(jīng)存在則覆蓋之)。使用eboot及PlatformBuilder下載已經(jīng)編譯好NKimage到目的設(shè)備上。其中NK.bin在\PUBLIC\NETARM2410-S\RelDir\圖2-264、在上面對(duì)話框中點(diǎn)”configure…”浮現(xiàn)如下對(duì)話框:圖2-27在其中選取浮現(xiàn)設(shè)備名,之后“OK”。然后擬定。這時(shí)會(huì)浮現(xiàn)下載進(jìn)度。等待下載完畢。下載完畢后目的板上WinCE系統(tǒng)會(huì)自動(dòng)運(yùn)營(yíng)。圖2-28圖2-29當(dāng)WINCE操作系統(tǒng)成功啟動(dòng)后按實(shí)驗(yàn)平臺(tái)復(fù)位鍵重新啟動(dòng)WINCE操作系統(tǒng)并對(duì)EBOOT進(jìn)行重新配備:5)改為L(zhǎng)AUNCHEXIST方式6)改為DISABLEw)對(duì)修改過(guò)選項(xiàng)進(jìn)行保存六、思考題1、Bootloader在嵌入式操作系統(tǒng)中作用和功能是什么?想一想,WinCE中Bootloader形式和功能各是什么?2、想一想,如何修改nboot代碼使nboot直接引導(dǎo)內(nèi)核鏡像啟動(dòng),不通過(guò)eboot階段。(提示:使用TOC不同內(nèi)容,可以選取跳轉(zhuǎn)到哪個(gè),TOC已經(jīng)包括了系統(tǒng)基本信息)實(shí)驗(yàn)三、WindowsCE驅(qū)動(dòng)開(kāi)發(fā)一、實(shí)驗(yàn)?zāi)?、學(xué)會(huì)使用WinCE操作系統(tǒng)開(kāi)發(fā)工具2、熟悉開(kāi)發(fā)環(huán)境3、理解嵌入式系統(tǒng)驅(qū)動(dòng)開(kāi)發(fā)基本思想和開(kāi)發(fā)過(guò)程二、實(shí)驗(yàn)內(nèi)容學(xué)習(xí)使用PlatformBuilder4.2集成開(kāi)發(fā)環(huán)境,建立流驅(qū)動(dòng)程序。理解WinCE基本系統(tǒng)體系架構(gòu)理解WINDOWSCE系統(tǒng)設(shè)備驅(qū)動(dòng)基本知識(shí)和辦法學(xué)習(xí)使用PlatformBuilder4.2集成開(kāi)發(fā)環(huán)境,建立流驅(qū)動(dòng)程序三、預(yù)備知識(shí)C語(yǔ)言基本知識(shí),設(shè)備驅(qū)動(dòng)基本知識(shí)和辦法,WinCE基本系統(tǒng)體系架構(gòu)。四、實(shí)驗(yàn)設(shè)備及工具硬件:PC一臺(tái)P3以上(內(nèi)存不不大于384MB,安裝竣工具硬盤空間不得不大于600M)、ARM9實(shí)驗(yàn)箱(包括NETARM2410-S實(shí)驗(yàn)板、JTAG仿真器、各種串口線、并口線、網(wǎng)線、光盤等)一臺(tái)。軟件:PC操作系統(tǒng)Win以上、ADS1.2集成開(kāi)發(fā)環(huán)境、PlatformBuilder4.2版本、SourceInsight3.0。五、實(shí)驗(yàn)原理及闡明1、WinCE驅(qū)動(dòng)程序架構(gòu)當(dāng)前WinCE擁有兩種驅(qū)動(dòng)架構(gòu)模型,一種是本機(jī)設(shè)備驅(qū)動(dòng),另一種是流接口設(shè)備驅(qū)動(dòng)。其中本機(jī)設(shè)備驅(qū)動(dòng)已經(jīng)被Microsoft開(kāi)發(fā)并由系統(tǒng)直接支持,由GWES(圖形窗口及事件子系統(tǒng))統(tǒng)一管理和加載;流驅(qū)動(dòng)則是由WinCE設(shè)備管理器來(lái)管理。這種組織形式相對(duì)于UNIX體系來(lái)說(shuō)是比較復(fù)雜。本機(jī)設(shè)備驅(qū)動(dòng)適合于集成到CE平臺(tái)設(shè)備。例如電源驅(qū)動(dòng),它們已經(jīng)成為了GWES一某些,不體現(xiàn)為單個(gè)DLL使用。這些驅(qū)動(dòng)程序普通和系統(tǒng)有著較為緊密聯(lián)系,因此普通是和系統(tǒng)一起加載。流設(shè)備驅(qū)動(dòng)由于具備較好可移植性和可擴(kuò)展性,被設(shè)備管理器獨(dú)立出來(lái)管理統(tǒng)籌。在本實(shí)驗(yàn)中,將以一種示例流驅(qū)動(dòng)演示程序來(lái)講述簡(jiǎn)樸驅(qū)動(dòng)工作。下面圖3-1中較為清晰顯示了單片形式存在驅(qū)動(dòng)和分層方式驅(qū)動(dòng)在WinCE中組織狀況。圖3-1驅(qū)動(dòng)在WinCE中組織狀況2、流驅(qū)動(dòng)程序流驅(qū)動(dòng)程序通過(guò)流驅(qū)動(dòng)接口函數(shù)和設(shè)備管理器進(jìn)行數(shù)據(jù)交互,并通過(guò)文獻(xiàn)形式來(lái)組織,這一點(diǎn)和Unix平臺(tái)是很類似。它以動(dòng)態(tài)鏈接庫(kù)形式存在,具備同一組接口并調(diào)用同一種函數(shù)集。流驅(qū)動(dòng)面向是各種各樣外設(shè),重要任務(wù)是把外設(shè)使用傳遞給應(yīng)用程序來(lái)使用。在WinCE中設(shè)備文獻(xiàn)普通是保存在固定途徑\Windows目錄下,通過(guò)注冊(cè)表機(jī)制來(lái)完畢特殊命名慣例。雖然流借口驅(qū)動(dòng)程序具備普遍特性,但是咱們?nèi)耘f可以使用不同辦法來(lái)實(shí)現(xiàn)它們。例如有些內(nèi)部設(shè)備驅(qū)動(dòng)程序就是使用流接口。此外盡管流接口程序普通是由設(shè)備管理器程序加載和卸載,但是有時(shí)候應(yīng)用程序也執(zhí)行加載和卸載任務(wù)。應(yīng)用程序通過(guò)文獻(xiàn)系統(tǒng)API來(lái)調(diào)用流接口函數(shù),然后由流接口驅(qū)動(dòng)程序調(diào)用本機(jī)驅(qū)動(dòng)或者通過(guò)設(shè)備管理器與系統(tǒng)內(nèi)核外圍設(shè)備通訊交互,最后直接驅(qū)動(dòng)有關(guān)硬件執(zhí)行動(dòng)作。3、流接口驅(qū)動(dòng)程序普通原則入口流接口驅(qū)動(dòng)程序普通都具備如下函數(shù),具備一種統(tǒng)一操作原則如表3-1所示:表3-1流接口驅(qū)動(dòng)程序函數(shù)函數(shù)名稱描述XXX_Close驅(qū)動(dòng)程序關(guān)閉時(shí)候調(diào)用XXX_Open打開(kāi)一種設(shè)備驅(qū)動(dòng)時(shí)調(diào)用XXX_Deinit設(shè)備管理器或者應(yīng)用程序卸載驅(qū)動(dòng)時(shí)調(diào)用XXX_Init設(shè)備管理器初始化設(shè)備時(shí)調(diào)用XXX_IOControl上層軟件進(jìn)行IO控制調(diào)用XXX_PowerDown系統(tǒng)掛起前調(diào)用XXX_PowerUp系統(tǒng)重新啟動(dòng)時(shí)調(diào)用XXX_Read打開(kāi)設(shè)備時(shí)候進(jìn)行讀操作XXX_Write打開(kāi)設(shè)備時(shí)候進(jìn)行寫(xiě)操作XXX_Seek對(duì)設(shè)備指針進(jìn)行操作時(shí)調(diào)用XXX_Reinit設(shè)備重復(fù)打開(kāi)時(shí)調(diào)用其中XXX代表驅(qū)動(dòng)文獻(xiàn)名,由驅(qū)動(dòng)類型3個(gè)大寫(xiě)字母縮寫(xiě)而成,規(guī)則由系統(tǒng)商定。詳細(xì)規(guī)則請(qǐng)參照協(xié)助文檔和MSDN闡明。理解了這些函數(shù)功用,就可以開(kāi)始著手建立起來(lái)一種最簡(jiǎn)樸流驅(qū)動(dòng)程序。它功能是向緩沖區(qū)中讀寫(xiě)字符。六、實(shí)驗(yàn)環(huán)節(jié)1、建立模仿器工程運(yùn)營(yíng)PlatformBuilder,建立一種基于X86體系模仿器。下面驅(qū)動(dòng)程序建立都可以在仿真器中模仿實(shí)現(xiàn)。注意需要在Applications&ServicesDevelopment選項(xiàng)中選取ActiveTempleLibrary(ATL),Clibraries&Runtimes,MessageQueuing(MSMQ),MicrosoftFoundationClasses(MFC),StandardSDKforWindowsCE.net這幾種選項(xiàng),這樣可以保證將來(lái)調(diào)試驅(qū)動(dòng)和調(diào)用應(yīng)用程序具備足夠庫(kù)和服務(wù)可以享用。詳細(xì)建立過(guò)程和辦法可以仿照實(shí)驗(yàn)二里面環(huán)節(jié)來(lái)做,這里不再贅述。2、創(chuàng)立驅(qū)動(dòng)程序工程在PB中新建一種工程,單擊菜單中File選取建立NewProjectorFileName…彈出如下圖3-2對(duì)話框。圖3-2新建工程在這里選取Project標(biāo)簽選取WCEDynamic-LinkLibrary即WinCEDLL并在右側(cè)輸入工程名和存儲(chǔ)位置(會(huì)默認(rèn))。點(diǎn)擊“OK”確認(rèn)。圖3-3生成DLL類型在對(duì)話框中選取生成DLL類型,可以選取Anemptyproject來(lái)創(chuàng)立一種空dll,也可以選取AsimpleWindowsCEDLLproject,創(chuàng)立一種簡(jiǎn)樸WinCE動(dòng)態(tài)鏈接庫(kù)工程,這個(gè)工程只帶有簡(jiǎn)樸DLL入口函數(shù)。ADLLthatexportssomesymbols用來(lái)生成簡(jiǎn)樸輸出函數(shù)。點(diǎn)“Finish”完畢創(chuàng)立。如圖3-3。創(chuàng)立完P(guān)B主界面上會(huì)切換到該工程,如圖3-4所示。圖3-4工程根目錄再次點(diǎn)擊File,選取“NewProjectorFileName…”,在向?qū)?duì)話框中選取Files標(biāo)簽,如下圖3-5所示。如圖3-5選取File選取建立C++SourceFile,同步添加文獻(xiàn)名,存儲(chǔ)途徑并將文獻(xiàn)添加到DLL工程中。加入“windows.h”,“tchar.h”頭文獻(xiàn)和動(dòng)態(tài)鏈接庫(kù)入口函數(shù)(原則函數(shù))DllEntryPoint(),建立好一種簡(jiǎn)樸動(dòng)態(tài)鏈接庫(kù)架子,添加相應(yīng)解決。詳見(jiàn)各種闡明文檔。3、編寫(xiě)驅(qū)動(dòng)程序代碼DWORDSTR_Init(DWORDdwContext){DWORDdwReturn=0;RETAILMSG(1,TEXT(“MYSTRINGS:STR_Init\t\n”));memset(achBuffer,0,BUFSIZE*sizeof(WCHAR));dwReturn=1;returndwReturn;}BOOLSTR_Deinit(DWORDhDeviceContext){BOOLbReturn=TRUE;RETAILMSG(1,(TEXT(MYSTRINGS:STR_Deinit\t\n”)));returnbReturn;}DWORDSTR_Open(DWORDhDeviceContext,DWORDAccessCode,DWORDShareMode){DWORDdwReturn=0;RETAILMSG(1,TEXT(“MYSTRINGS:STR_Open\t\n”));dwReturn=1;returndwReturn;}BOOLSTR_Close(DWORDhOpenContext){BOOLbReturn=TRUE;RETAILMSG(1,(TEXT(MYSTRINGS:STR_Close\t\n”)));returndwReturn;}BOOLSTR_IOControl(DWORDhOpenContext,DWORDdwCode,PBYTEpBufIn,DWORDdwLenIn,PBYTEpBufOut,DWORDdwLenOut,PDWORDpdwActualOut){BOOLbReturn=TRUE;RETAILMSG(1,(TEXT(MYSTRINGS:STR_IOControl\t\n”)));returnbReturn;}voidSTR_PowerDown(DWORDhDeviceContext){RETAILMSG(1,(TEXT(MYSTRINGS:STR_PowerDown\t\n”)));}voidSTR_PowerUp(DWORDhDeviceContext){RETAILMSG(1,(TEXT(MYSTRINGS:STR_PowerUp\t\n”)));}DWORDSTR_Read(DWORDhOpenContext,LPVOIDpBuffer,DWORDCount){DWORDdarter=0;RETAILMSG(1,TEXT(“MYSTRINGS:STR_Read\t\n”));DWORDcbBuffer=wcslen(achBuffer);dwReturn=min(cbBuffer,Count);wcsncpy((LPWSTR)pBuffer,achBuffer,dwReturn);returndwReturn;}DWORDSTR_Seek(DWORDhOpenContext,LongAmount,DWORDType){DWORDdwReturn=0;RETAILMSG(1,(TEXT(MYSTRINGS:STR_Seek\t\n”)));ReturndwReturn;}DWORDSTR_Write(DWORDhOpenContext,LPCVOIDpSourcdBytes,DWORDNumberOfBytes){DWORDdwReturn=0;RETAILMSG(1,(TEXT(MYSTRINGS:STR_Write\t\n”)));dwReturn=min(BUFSIZE,NumberOfBytes);wcsncpy(achBuffer,(LPWSTR)pSourceBytes,dwReturn);ReturndwReturn;}擬定編寫(xiě)完畢保存。如果不想編寫(xiě),也可以直接拷貝光盤中MyDriver.cpp文獻(xiàn)到工作目錄下。4、準(zhǔn)備配備文獻(xiàn)Def文獻(xiàn)。復(fù)制光盤中String.Def文獻(xiàn)到工作目錄下。Reg文獻(xiàn)。復(fù)制光盤中StringReg.reg文獻(xiàn)到工作目錄下。Cec文獻(xiàn)。復(fù)制光盤中MyDriver.cec文獻(xiàn)到工作目錄下。Makefile文獻(xiàn)和Sources文獻(xiàn)。復(fù)制makefile和sources文獻(xiàn)到工作目錄下。這些文獻(xiàn)是DLL工程編譯必要具備配備文獻(xiàn),它們闡明了關(guān)于驅(qū)動(dòng)如何鏈接,編譯路徑,和系統(tǒng)注冊(cè)等等重要工作,在編寫(xiě)新DLL時(shí)普通都需要進(jìn)行改動(dòng)甚至重寫(xiě)。這里直接拷貝光盤中文獻(xiàn)來(lái)實(shí)現(xiàn)。有興趣也可以使用文本查看軟件(如UltraEdit32,WinHEX等)來(lái)打開(kāi)這些文獻(xiàn),看看文獻(xiàn)內(nèi)部是如何配備??截愅戤吅?,在PB下導(dǎo)入CEC文獻(xiàn)。將MyDriver.cec拷貝到PB當(dāng)前工程目錄下(模仿器目錄下),打開(kāi)File菜單,選取ManageCatalogFeatures彈出一種屬性對(duì)話框,如圖3-6。圖3-6屬性對(duì)話框在右側(cè)按鈕中點(diǎn)擊Import,選中MyDriver.cec導(dǎo)入當(dāng)前工程目錄,然后單擊“OK”確認(rèn)完畢。導(dǎo)入辦法和導(dǎo)入平臺(tái)BSP辦法是相似??梢园l(fā)現(xiàn)驅(qū)動(dòng)被添加到工程組件窗口中,在組件上點(diǎn)擊右鍵,選取AddtoPlatform,完畢系統(tǒng)驅(qū)動(dòng)添加。5、編譯內(nèi)核和實(shí)驗(yàn)一編譯辦法同樣,點(diǎn)擊來(lái)實(shí)現(xiàn)編譯。特別注意當(dāng)前是在使用模仿器,因此在編譯選項(xiàng)中應(yīng)當(dāng)選中“EMULATOR:X86WIN32”編譯之前,在BuildOption選項(xiàng)標(biāo)簽中保證“EnableCETargetControlSystem”,“EnableKernelDebugger”,“EnableKITL”被選定,這些選項(xiàng)容許內(nèi)核向PB傳送調(diào)試信息。單擊“OK”擬定。如圖3-7所示:圖3-7編譯6、加載驅(qū)動(dòng)內(nèi)核編譯完畢后開(kāi)始在模仿器下加載。單擊Target下面選取ConfigueRemoteConnection,彈出對(duì)話框如圖3-8所示。圖3-8加載驅(qū)動(dòng)選取Emulator–4.20,再點(diǎn)擬定,在Target菜單中選取Download/Initialize,就可以看到模仿器開(kāi)始運(yùn)營(yíng)啟動(dòng),一種模仿WinCE系統(tǒng)在窗口中顯示出來(lái),絕大多數(shù)操作都可以使用了。此時(shí)在PBDebug窗口中可以看到系統(tǒng)啟動(dòng)調(diào)試信息。其中可以很清晰看到驅(qū)動(dòng)模塊被加載狀態(tài),驅(qū)動(dòng)運(yùn)營(yíng)成功七、思考題1.想一下WinCE中驅(qū)動(dòng)程序架構(gòu)和其她系統(tǒng)中有什么不同?2.WinCE中驅(qū)動(dòng)程序中斷解決是如何實(shí)現(xiàn)?實(shí)驗(yàn)四、WindowsCE應(yīng)用程序開(kāi)發(fā)一、實(shí)驗(yàn)?zāi)?.學(xué)習(xí)WindowsCE編程基本辦法。2.學(xué)習(xí)MFC應(yīng)用。二、實(shí)驗(yàn)內(nèi)容學(xué)習(xí)在WindowsCE平臺(tái)下,用EVC編寫(xiě)一種全屏俄羅斯方塊游戲。熟悉EVC集成開(kāi)發(fā)環(huán)境,理解建立WINCE程序普通辦法掌握EVC下慣用開(kāi)發(fā)向?qū)в梅兪焓褂眠h(yuǎn)程調(diào)試工具三、預(yù)備知識(shí)1、基本VC編程知識(shí),編寫(xiě)和調(diào)試應(yīng)用程序基本過(guò)程。2、理解Windows程序開(kāi)發(fā)流程及基于MFC應(yīng)用程序開(kāi)發(fā)基本知識(shí)。四、實(shí)驗(yàn)設(shè)備及工具硬件:PC一臺(tái)P3以上(內(nèi)存不不大于384MB,安裝竣工具硬盤空間不得不大于600M)、ARM9實(shí)驗(yàn)箱(包括NETARM2410-S實(shí)驗(yàn)板、JTAG仿真器、各種串口線、并口線、網(wǎng)線、光盤等)一臺(tái)。軟件:PC機(jī)操作系統(tǒng)Win或以上,EVC4.0開(kāi)發(fā)環(huán)境,WinCE420原則SDK,NETARM2410-S平臺(tái)SDK,VisualC++6.00集成開(kāi)發(fā)環(huán)境。五、實(shí)驗(yàn)原理及闡明1.ClassWizard(類向?qū)В膹V義上講,ClassWizard與類關(guān)系和AppWizard與應(yīng)用程序關(guān)系是相似。ClassWizard通過(guò)生成實(shí)現(xiàn)CPP文獻(xiàn),以及一種帶有適當(dāng)存根函數(shù)頭文獻(xiàn),來(lái)協(xié)助你開(kāi)始編寫(xiě)新類。用實(shí)際代碼填充這些函數(shù)則是你責(zé)任。ClassWizard在四個(gè)區(qū)域提供協(xié)助,它可覺(jué)得如下目生成代碼:從接受消息或管理控件窗口許多MFC類中一種派生出來(lái)新類。解決消息成員函數(shù)。nOLE/ActiveX辦法、屬性和事件觸發(fā)。用于輸入到對(duì)話控件中數(shù)據(jù)互換和驗(yàn)證函數(shù)。ClassWizard辨認(rèn)和支持MFC基類,它們用某種辦法與顧客進(jìn)行交互。除了少數(shù)例外類(例如CRecordSet和CHttpServer)之外,基類都是由CCmdTarget派生而來(lái),它們可以對(duì)消息作出反映,并可以管理對(duì)話框中控件。大概有50個(gè)各種MFC基類,你可以使用ClassWizard從這樣類中創(chuàng)立一種派生類。訪問(wèn)ClassWizard不能從一種空項(xiàng)目中訪問(wèn)ClassWizard。項(xiàng)目中至少應(yīng)有一種RC文獻(xiàn),雖然這個(gè)RC文獻(xiàn)是空。一旦RC文獻(xiàn)被附加到項(xiàng)目之中(AppWizard可以自動(dòng)完畢這項(xiàng)工作),你就可以通過(guò)從View菜單中選取ClassWizard命令來(lái)調(diào)用ClassWizard對(duì)話了。關(guān)于ClassWizard,有兩點(diǎn)不大明顯。一方面,它服務(wù)完全是可選。你在開(kāi)發(fā)自己項(xiàng)目過(guò)程中,如果自己樂(lè)意話,從頭至尾,都可以不解決ClassWizard。另一方面,你可以使用ClassWizard向MFC項(xiàng)目添加新類,雖然該項(xiàng)目不是由AppWizard創(chuàng)立。ClassWizard編譯項(xiàng)目類數(shù)據(jù)庫(kù),并將它存儲(chǔ)在與項(xiàng)目同名且擴(kuò)展名為CLW一種文獻(xiàn)之中。如果你始終都是使用ClassWizard為項(xiàng)目創(chuàng)立新類,那么CLW文獻(xiàn)可以保持最新。但是,在VisualC++中,你與ClassWizard之間并不是全有或全無(wú)關(guān)系,你可以自由地編寫(xiě)新類,或者從當(dāng)前項(xiàng)目之外其她源文獻(xiàn)中復(fù)制代碼。在一種類不是以ClassWizard為來(lái)源狀況下,有一種簡(jiǎn)樸辦法可以更新CLW數(shù)據(jù)庫(kù)。在你使用了Project菜單上AddToProject命令向項(xiàng)目添加新類源文獻(xiàn)之后,請(qǐng)刪除CLW文獻(xiàn),并再次調(diào)用ClassWizard。VisualC++將檢測(cè)到數(shù)據(jù)庫(kù)不存在了,并提供重新創(chuàng)立它服務(wù)。ClassWizard對(duì)話圖(下圖)顯示了主ClassWizard對(duì)話框。之因此叫它為“主”對(duì)話,是由于ClassWizard可以在20各種不同對(duì)話中顯示自己,究竟在哪一種對(duì)話中顯示需取決于環(huán)境。圖中對(duì)話充當(dāng)著到ClassWizard主入口角色,將其命名為MFCClassWizard,以便于讓你記住它所解決僅僅是MFC類。ClassWizard不能協(xié)助你創(chuàng)立從除了支持MFC類之外任何類中派生類;對(duì)于帶有任何其她基類,你必要使用文本編輯器或Insert菜單上NewClass命令從零開(kāi)始自己編寫(xiě)代碼。圖4-1MFCClassWizard對(duì)話五個(gè)選項(xiàng)卡具備不同用途,對(duì)于任何一種特定類,都不是完全需要這五個(gè)選項(xiàng)卡。下表可以協(xié)助你擬定自己需要哪個(gè)(或哪幾種)選項(xiàng)卡,這重要取決于你想為自己類做哪些工作。MFCClassWizard對(duì)話框五個(gè)選項(xiàng)卡選項(xiàng)卡 用途MessageMaps(消息映射) 添加或刪除解決消息成員函數(shù)MemberVariables(成員變量) 添加或刪除附加到使用控件類上成員變量。普通地說(shuō),這些是從CDialog,CPropertyPage,CRecordView或CDaoRecordView中派生對(duì)話類Automation向支持Automation類(例如ActiveX控件類)添加屬性或辦法ActiveXEvents 為觸發(fā)事件(普通是實(shí)現(xiàn)ActiveX控件類)添加支持。在開(kāi)發(fā)接受觸發(fā)事件容器應(yīng)用程序時(shí),不用該選項(xiàng)卡ClassInfo 關(guān)于項(xiàng)目類其她信息在ClassWizard對(duì)話中,標(biāo)為MessageMaps和MemberVariables頭兩個(gè)選項(xiàng)卡將在下兩節(jié)簡(jiǎn)介。Automation和ActiveXEvent選項(xiàng)卡討論推遲到第8章和第9章,這兩章將闡述ClassWizard如何在包括ActiveX控件項(xiàng)目開(kāi)發(fā)中起協(xié)助作用。在此,咱們只簡(jiǎn)介MessageMaps(消息映射)選項(xiàng)卡。MessageMaps(消息映射)選項(xiàng)卡是你為自己類指定消息解決函數(shù)地方。該選項(xiàng)卡中兩個(gè)組合框和前兩個(gè)列表框是這樣安排,每個(gè)控件都顯示逐漸高一級(jí)控件詳細(xì)資料。換句話說(shuō),控件內(nèi)容取決于前面控件中選中某些。ClassName(類名)組合框列出了Project組合框中選中項(xiàng)目類;ObjectIDs框中顯示是與ClassName框中選中類有關(guān)聯(lián)標(biāo)記符,Message框中顯示是ObjectIDs框中當(dāng)前選中某些消息和其她信息。當(dāng)你在Message框中選中一條消息或虛擬函數(shù)時(shí)候,將在MFCClassWizard對(duì)話底部浮現(xiàn)選中項(xiàng)目簡(jiǎn)要闡明。如果想理解關(guān)于選中項(xiàng)目詳細(xì)信息,可以像第一章中簡(jiǎn)介那樣切換到MSDN在線協(xié)助,然后再搜索索引。按下F1鍵將顯示關(guān)于Message框自身普通信息,而不是關(guān)于選中項(xiàng)目信息。如果想向選定類添加消息解決程序函數(shù),請(qǐng)雙擊Message框中消息或虛擬函數(shù)。MemberFunctions框包具有當(dāng)前類函數(shù)一種列表,在圖6-2中是InitInstance和OnAppAbout?!癢”標(biāo)記符將OnAppAbout作為一種解決帶有WM_前綴系統(tǒng)消息函數(shù)來(lái)標(biāo)記,在本例中,是包具有ID_APP_ABOUT菜單值WM_COMMAND?!癡”用來(lái)將InitInstance作為一種超越虛擬函數(shù)來(lái)標(biāo)記。對(duì)于添加到類每個(gè)消息解決程序函數(shù),ClassWizard對(duì)該類源文獻(xiàn)做三處修改:向頭文獻(xiàn)添向函數(shù)聲明。向CPP實(shí)現(xiàn)文獻(xiàn)添加帶有骨干代碼函數(shù)定義。將代表該函數(shù)條目添加到類消息映射。2、游戲設(shè)計(jì)需求,進(jìn)行需求分析:在全屏方式下進(jìn)行游戲,形狀不同方塊組合從屏幕頂端勻速下落。當(dāng)某一行被方塊填滿時(shí)則消去這一行,當(dāng)方塊堆積超過(guò)最上一行時(shí)游戲結(jié)束。3、實(shí)現(xiàn)原理游戲設(shè)計(jì)離不開(kāi)圖像圖案解決。微軟基本類庫(kù)(mfc)封裝了GDI,即“圖形設(shè)備接口”,包括了各種繪圖類及有關(guān)繪圖函數(shù)。而MFCCDC提供了各種與繪圖關(guān)于函數(shù)。運(yùn)用GDI配合建立CDC對(duì)象,就可以按照程序設(shè)計(jì)者意愿在畫(huà)布窗口上繪制某些圖形。4、俄羅斯方塊實(shí)現(xiàn)算法4.1俄羅斯方塊玩法:老式俄羅斯方塊玩法很簡(jiǎn)樸,隨機(jī)產(chǎn)生七種形狀之一方塊從繪圖區(qū)上部向下落,在下落過(guò)程中可以變化它們位置及旋轉(zhuǎn)固定角度。方塊落到繪圖下方堆積起來(lái),如果任何一行被堆滿則自動(dòng)消去這一行。方塊不斷產(chǎn)生,直至堆積到繪圖區(qū)頂端,游戲結(jié)束。4.2相應(yīng)解決算法隨機(jī)產(chǎn)生方塊可以調(diào)用rand()函數(shù),此函數(shù)返回一種隨機(jī)整數(shù)。程序中將此返回值對(duì)7求模,就可得到隨機(jī)產(chǎn)生在0和6之間整數(shù)。每一種整數(shù)相應(yīng)一種形狀方塊。方塊自由下落可以看作是每過(guò)一定期間間隔就下移一種單位高度,這個(gè)高度是可由程序來(lái)控制。這樣,咱們就可以通過(guò)定期起來(lái)完畢每次下移一種單位高度任務(wù)。設(shè)立定期器使用函數(shù)SetTimer,該函數(shù)原型為:UINTSetTimer(UINTnIDEvent,UINTnElapse,void(CALLBACKEXPORT*lpfnTimer)(HWND,UINT,UINT,DWORD))其中回調(diào)函數(shù)不用咱們指定,稍后通過(guò)ClassWizard就可以讓系統(tǒng)自動(dòng)完畢。當(dāng)咱們不想讓定期再繼續(xù)工作時(shí)候,可以調(diào)用函數(shù)KillTimer(intnIDEvent),nIDEvent是定期器標(biāo)記。方塊下落有兩種狀態(tài):可以繼續(xù)下落和已經(jīng)究竟。如果構(gòu)成方塊四個(gè)小某些中任意一某些遇到了別方塊或是繪圖區(qū)底部,則以為方塊已究竟,不能再繼續(xù)下落了,如果沒(méi)有,則還可再下落一種單位高度。方塊下落后應(yīng)當(dāng)立即判斷與否已到頂,如果已到頂,游戲就結(jié)束了,否則繼續(xù)下一循環(huán)。如果方塊已究竟部,游戲還尚未結(jié)束,就要產(chǎn)生下一種新方塊,隨機(jī)判斷底部堆積方塊中有無(wú)可以消去行,如有則消去,隨后新產(chǎn)生方塊繼續(xù)下落。在本實(shí)驗(yàn)中,所有繪圖任務(wù)都由myDraw()函數(shù)來(lái)執(zhí)行,這樣當(dāng)咱們想要修改程序界面或其她與圖形有關(guān)任務(wù)時(shí)候,只要將注意力集中在此函數(shù)中就可以了。六、實(shí)驗(yàn)環(huán)節(jié)1、新建工程,運(yùn)用MFCAppWizard建立一種基于對(duì)話框應(yīng)用程序。2、打開(kāi)源文獻(xiàn)資源,修改對(duì)話框,如下圖4-2:圖4-2(a)源文獻(xiàn)資源圖4-3(b)修改后對(duì)話框外觀相應(yīng)控件ID及caption:3、選取View菜單項(xiàng),點(diǎn)擊ClassWizard,浮現(xiàn)如下界面:圖4-4ClassWizard在ClassName項(xiàng)中選取CBrickDlg類,添加消息解決函數(shù),如下圖:圖4-5選取ClassName創(chuàng)立下圖所示消息相應(yīng)函數(shù):圖4-6函數(shù)框其中,OnCreate,OnCtlColor,OnTimer相應(yīng)Windows消息,分別為WM_CREATE,WM_CTLCOLOR,WM_TIMER,OnLeft,OnRight,OnDown,OnUp相應(yīng)是相應(yīng)按鈕,從對(duì)象ID列表框選用,余下消息解決函數(shù)清參照源代碼添加5.此時(shí),ClassWizard已經(jīng)幫咱們把程序消息解決框架搭好了,剩余事情就是添加代碼:為了節(jié)約篇幅,咱們?cè)诖酥唤o出brickDlg類頭文獻(xiàn)和實(shí)現(xiàn)文獻(xiàn),別的代碼,沿用系統(tǒng)生成即可。brickDlg類頭文獻(xiàn)://brickDlg.h:headerfile//#if!defined(AFX_BRICKDLG_H__8F782CE1_7832_4364_86DE_2A60573808AE__INCLUDED_)#defineAFX_BRICKDLG_H__8F782CE1_7832_4364_86DE_2A60573808AE__INCLUDED_#if_MSC_VER>=1000#pragmaonce#endif//_MSC_VER>=1000///////////自定義常量///////////////#defineLEFTMARGIN10#defineTOPMARGIN5#defineHIGHLIGHTCOLORRGB(0,128,128)#defineBTNSHADOWCOLORRGB(0,57,57)#defineColorOfCurrentBrickRGB(255,255,0)//方塊顏色#defineclrTopLeftRGB(68,71,140)#defineSTOP1210博創(chuàng)科技#defineRUNNING2#definePAUSED3structBrick{intx;inty;};////////////////////////////////////////////////////////////////////////////////////////////////////////////////////CBrickDlgdialogclassCBrickDlg:publicCDialog{//Constructionpublic:CBrickDlg(CWnd*pParent=NULL);//standardconstructor//DialogData//{{AFX_DATA(CBrickDlg)enum{IDD=IDD_BRICK_DIALOG};//NOTE:theClassWizardwilladddatamembershere//}}AFX_DATA//ClassWizardgeneratedvirtualfunctionoverrides//{{AFX_VIRTUAL(CBrickDlg)public:virtualBOOLPreTranslateMessage(MSG*pMsg);protected:virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport//}}AFX_VIRTUAL///////////自定義成員/////////////////protected:///////////數(shù)據(jù)成員///////////////////COLORREFColorOfMatrixOfBricks[20][10];BOOLEraseALine,BrickAtBottom;intMatrixOfBricks[20][10];intGameState;BrickCurrentBrick[5],LastPositionOfBrick[4];intTimerInterval;//定期器間隔intLevel;intWIDTHOFBRICKS;intHEIGHTOFBRICKS;CFontStaticFont;///////////////////////////////////////////////////函數(shù)成員/////////////////////voidmyDraw(void);//繪制新圖voidGenerateABrick();//啟動(dòng)游戲,調(diào)用myDraw()刷新voidCanEraseALine();//voidIsGameOver();intIsbottom();//intIsOutOfRect(intw);//voidRotateBrick(void);//voidRefreshBricks(void);//voidInitBricks();voidRefreshAll(void);voidPutMessage(intGameLevel);voidStop(void);voidPause(void);voidStart(void);voidExit(void);voidOnKey(UINTnChar);//解決輸入信息函數(shù)控制方塊運(yùn)動(dòng)voidCreateNumber();//獲取隨機(jī)數(shù)據(jù)voidDrawNextBrick();//繪制下一種方塊以提示/////////////////////////////////////////Implementationprotected:HICONm_hIcon;//Generatedmessagemapfunctions//{{AFX_MSG(CBrickDlg)virtualBOOLOnInitDialog();afx_msgvoidOnGameOver();afx_msgvoidOnGameStart();afx_msgvoidOnUp();afx_msgvoidOnDown();afx_msgvoidOnLeft();afx_msgvoidOnRight();afx_msgvoidOnPause();afx_msgvoidOnTimer(UINTnIDEvent);afx_msgintOnCreate(LPCREATESTRUCTlpCreateStruct);afx_msgvoidOnPaint();afx_msgHBRUSHOnCtlColor(CDC*pDC,CWnd*pWnd,UINTnCtlColor);//}}AFX_MSGDECLARE_MESSAGE_MAP()};//{{AFX_INSERT_LOCATION}}//MicrosofteMbeddedVisualC++willinsertadditionaldeclarationsimmediatelybeforethepreviousline.#endif//!defined(AFX_BRICKDLG_H__8F782CE1_7832_4364_86DE_2A60573808AE__INCLUDED_)下面是實(shí)現(xiàn)文獻(xiàn)某些代碼://brickDlg.cpp:implementationfile//#include"stdafx.h"#include"brick.h"#include"brickDlg.h"UINTnChar;intn=0;//記錄分?jǐn)?shù),即消行數(shù)intNumber[2];//隨機(jī)數(shù)據(jù)用于獲取方塊#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#endif///////////////////////////////////////////////////////////////////////////////CBrickDlgmessagehandlersvoidCBrickDlg::OnKey(UINTnChar){{switch(nChar){caseVK_NUMPAD1://左方向if(!(IsOutOfRect(1)==2)){RefreshBricks();for(inta=0;a<4;a++)//a為循環(huán)用變量CurrentBrick[a].y--;//Y表達(dá)是橫向坐標(biāo),左起為0,向左移動(dòng)Y減小}break;caseVK_NUMPAD3://右方向if(!(IsOutOfRect(2)==1)){RefreshBricks();for(inta=0;a<4;a++)CurrentBrick[a].y++;//右移動(dòng)Y增長(zhǎng)}break;caseVK_NUMPAD7://下落OnTimer(1);break;caseVK_NUMPAD9://旋轉(zhuǎn)RefreshBricks();RotateBrick();break;}myDraw();}}voidCBrickDlg::OnTimer(UINTnIDEvent){//TODO:Addyourmessagehandlercodehereand/orcalldefaultswitch(nIDEvent){case1:if(GameState==RUNNING){if(Isbottom())//如果未究竟{RefreshBricks();//刷新for(inti=0;i<4;i++)CurrentBrick[i].x++;//方塊下降X增長(zhǎng)}else//如果究竟了{(lán)IsGameOver();CanEraseALine();//消去一行DrawNextBrick();//繪制下一種方塊以提示GenerateABrick();//生成新方塊Number[0]=Number[1];CreateNumber();//獲取隨機(jī)數(shù)據(jù)}myDraw();}break;}CDialog::OnTimer(nIDEvent);}voidCBrickDlg::OnPaint(){CPaintDCdc(this);//devicecontextforpainting//TODO:Addyourmessagehandlercodeheredc.FillSolidRect(180,50,100,60,RGB(0,0,255));EraseALine=TRUE;myDraw();//DonotcallCDialog::OnPaint()forpaintingmessages}//////////////如下為自定義函數(shù)////////////////////////voidCBrickDlg::InitBricks(){for(inti=0;i<20;i++)for(intj=0;j<10;j++)MatrixOfBricks[i][j]=0;RefreshAll();}//旋轉(zhuǎn)方塊voidCBrickDlg::RotateBrick(){inti,j;//循環(huán)變量intIndexOfCenter=0;//旋轉(zhuǎn)軸方塊序號(hào)BrickCenterBrick;//用于存儲(chǔ)中間方塊位置BrickTempBrick[4];//用于存儲(chǔ)當(dāng)前方塊位置,一旦旋轉(zhuǎn)后出界,則用此恢復(fù)CenterBrick.y=0;CenterBrick.x=0;if(CurrentBrick[4].x==0)return;for(i=0;i<4;i++){TempBrick[i].x=CurrentBrick[i].x;TempBrick[i].y=CurrentBrick[i].y;}if((CurrentBrick[0].x==CurrentBrick[1].x==CurrentBrick[2].x==CurrentBrick[3].x)||(CurrentBrick[0].y==CurrentBrick[1].y==CurrentBrick[2].y==CurrentBrick[3].y)){//如果是長(zhǎng)棒,則以第二塊為軸心,否則以第一塊為軸心CenterBrick.x=CurrentBrick[2].x;CenterBrick.y=CurrentBrick[2].y;IndexOfCenter=2;}else{CenterBrick.x=CurrentBrick[1].x;CenterBrick.y=CurrentBrick[1].y;IndexOfCenter=1;}for(i=0;i<4;i++){if(i!=IndexOfCenter){//逆時(shí)針旋轉(zhuǎn)CurrentBrick[i].x=TempBrick[i].y-CenterBrick.y+CenterBrick.x;CurrentBrick[i].y=CenterBrick.x-TempBrick[i].x+CenterBrick.y;if((MatrixOfBricks[CurrentBrick[i].x][CurrentBrick[i].y]==2)||//如果碰底(CurrentBrick[i].y>9)||//如果右出界(CurrentBrick[i].y<0)||//如果左出界(CurrentBrick[i].x>19)||//如果下出界(CurrentBrick[i].x<0))//如果上出界{//如果已出界,則不能旋轉(zhuǎn),用備份方塊還原for(j=0;j<4;j++){CurrentBrick[j].x=TempBrick[j].x;CurrentBrick[j].y=TempBrick[j].y;}break;}}}}//判斷與否究竟intCBrickDlg::Isbottom(){BrickAtBottom=TRUE;for(inta=0;a<4;a++){if(CurrentBrick[a].x==19)//如果當(dāng)前方塊已經(jīng)到了最底端,X是縱向坐標(biāo){for(intc=0;c<4;c++)MatrixOfBricks[CurrentBrick[c].x][CurrentBrick[c].y]=2;//2表達(dá)不再自由下落return0;//究竟了}if(MatrixOfBricks[CurrentBrick[a].x+1][CurrentBrick[a].y]==2)//如果當(dāng)前方塊遇到了別方塊{for(intc=0;c<4;c++)MatrixOfBricks[CurrentBrick[c].x][CurrentBrick[c].y]=2;//2表達(dá)不再自由下落return0;//究竟了}}BrickAtBottom=FALSE;return1;}//消行,判斷與否游戲結(jié)束voidCBrickDlg::CanEraseALine(){intflagover=0;//inti=1;//用于對(duì)級(jí)別進(jìn)行判斷TCHARm_strValue[200];for(inta=19;a>=0;a--){flagover=0;//////////////////////////////////////判斷與否有一行可消去/////////////////////////////////////////for(intb=0;b<10;b++){if(MatrixOfBricks[a][b]==2){flagover++;}}//////如果可消去////////////////if(flagover==10){EraseALine=TRUE;for(intt=a;t>0;t--)//方塊下移{for(b=0;b<10;b++){MatrixOfBricks[t][b]=MatrixOfBricks[t-1][b];//標(biāo)記移位MatrixOfBricks[t-1][b]=0;//本位置置空}}n++;//如果可以消一行,則n值增長(zhǎng)1a=a+1;//重新判斷這一行}}switch(n){case5:Level=1;break;case10:Level=2;break;case15:Level=3;break;case20:Level=4;break;case25:Level=5;break;case30:Level=6;break;case35:Level=7;break;case40:Level=8;break;case45:Level=9;break;}//對(duì)級(jí)別進(jìn)行計(jì)數(shù)判斷TimerInterval=5000/20-Level*25;//重新設(shè)定期間間隔以適合不同級(jí)別SetTimer(1,TimerInterval,NULL);//重新定義記時(shí)器_itow(n*100,m_strValue,10);SetDlgItemText(IDC_STATIC_NUM,m_strValue);//顯示分?jǐn)?shù)_itow(CBrickDlg::Level,m_strValue,10);SetDlgItemText(IDC_LEVEL,

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論