《嵌入式WinCE系統(tǒng)開發(fā)》_第1頁
《嵌入式WinCE系統(tǒng)開發(fā)》_第2頁
《嵌入式WinCE系統(tǒng)開發(fā)》_第3頁
《嵌入式WinCE系統(tǒng)開發(fā)》_第4頁
《嵌入式WinCE系統(tǒng)開發(fā)》_第5頁
已閱讀5頁,還剩86頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

張小進

編寫

適用專業(yè):計算機科學與技術(shù)

嵌入式C語言設計實驗由驗證性實驗一、WinCE平臺的構(gòu)建與配置,驗證性實驗二、線程同步調(diào)試實驗,驗證性實驗三驅(qū)動程序結(jié)構(gòu)實驗,驗證性實驗四IO接口控制實驗,驗證性實驗五動態(tài)鏈接庫實驗,驗證性實驗六UDP和Ping實驗,綜合性實驗七CAN總線實驗構(gòu)成,通過實驗應達到下列要求:1.熟悉嵌入式WinCE系統(tǒng)開發(fā)平臺的搭建,PB集成環(huán)境的使用。掌握WindowsCE內(nèi)核的配置、編譯方法;掌握構(gòu)建一個適合特定開發(fā)平臺的WindowsCE系統(tǒng)方法;為后續(xù)的其它實驗打下基礎。2.加深對嵌入式WinCE系統(tǒng)的認識,了解WinCE下IO訪問機制和原理;掌握WinCE線程編程方法;掌握線程同步原理和實現(xiàn)線程同步的方法;進一步熟悉VS.Net的使開發(fā)環(huán)境;能較熟練地進行嵌入式WinCE的程序設計。3.熟悉嵌入式WinCE系統(tǒng)驅(qū)動程序的結(jié)構(gòu),了解驅(qū)動程序的原理和功能;掌握流式接口驅(qū)動程序的結(jié)構(gòu);掌握編寫流式接口的驅(qū)動程序的方法;能根據(jù)實驗內(nèi)容的要求進行驗證性的編程實驗以掌握驅(qū)動程序的框架結(jié)構(gòu)。4.掌握在WindowsCE下訪問硬件I/O寄存器的一般方法;了解WinCE下IO訪問機制和原理;了解數(shù)碼管(LED)的顯示及控制原理;能根據(jù)實驗內(nèi)容的要求進行驗證性的編程實驗以掌握I/O接口控制方法。5.了解WinCE動態(tài)鏈接庫的基本原理;掌握WinCE動態(tài)鏈接庫程序的編程方法;掌握采用靜態(tài)和動態(tài)調(diào)用動態(tài)鏈接庫方法;能根據(jù)實驗內(nèi)容的要求進行驗證性的編程實驗以掌握動態(tài)鏈接庫的實現(xiàn)技術(shù)和使用方法。6.了解UDP網(wǎng)絡通信的基本內(nèi)容;掌握PING實現(xiàn)的基本原理;了解TCP/IP和ICMP協(xié)議;能根據(jù)實驗內(nèi)容的要求進行驗證性的編程實驗以掌握嵌入式WinCE下的網(wǎng)絡通信。7.了解串口通信的基本原理;掌握串口編程的方法;掌握應用程序的GUI編程;能根據(jù)實驗內(nèi)容的要求進行綜合性的編程實驗以初步掌握串口通信的應用。8.由于這門課程的實驗需要大量的時間練習,但受實驗課時的限制需要學生課外補足(16到24學時),因此要求學生在實驗前先預習實驗內(nèi)容并根據(jù)實驗大綱的說明先期做好實驗的準備工作。

本指導書對綜合性實驗只給出設計的要求和指標不給實驗源代碼,由學生自己設計、編譯、調(diào)試并運行;通過實驗結(jié)果理解嵌入式WinCE驅(qū)動程序的實現(xiàn)方法;在實驗報告中回答思考題。

錄TOC\o"1-3"\u實驗一WindowsCE平臺的構(gòu)建與配置 5實驗二線程同步調(diào)試實驗 27實驗三驅(qū)動程序結(jié)構(gòu)實驗 38實驗四I/O接口控制實驗 52實驗五動態(tài)鏈接庫實驗 61實驗六UDP和Ping實驗 70實驗七串口測試綜合實驗 80實驗一WindowsCE平臺的構(gòu)建與配置實驗學時:2實驗類型:驗證實驗要求:必修一、實驗目的1、掌握WindowsCE內(nèi)核的配置、編譯方法;2、掌握構(gòu)建一個適合特定開發(fā)平臺的WindowsCE系統(tǒng)方法;3、熟悉PlatformBuilder開發(fā)工具使用方法。二、實驗內(nèi)容1、安裝XSBase270實驗開發(fā)平臺的BSP;2、根據(jù)XSBase目標平臺的特點和系統(tǒng)的需要,配置WindowsCE操作系統(tǒng)的特性和功能;3、編譯、鏈接操作系統(tǒng)內(nèi)核,生成系統(tǒng)映象文件;4、下載并運行編譯好的WindowsCE系統(tǒng)。三、實驗原理、方法和手段1、WindowsCE操作系統(tǒng)簡介MicrosoftWindowsCE是一個開放的、可裁剪的、32位的實時嵌入式窗口操作系統(tǒng)。和其他桌面窗口操作系統(tǒng)(WindowsXP/2000)相比,它具有可靠性好、實時性高、內(nèi)核體積小等特點,適用于各種嵌入系統(tǒng)和產(chǎn)品。它擁有多線程、多任務、確定性的實時、完全搶先式優(yōu)先級的操作系統(tǒng)環(huán)境,專門面向只有有限資源的嵌入式硬件系統(tǒng)。同時,開發(fā)人員可以根據(jù)特定硬件系統(tǒng)對WindowsCE操作系統(tǒng)進行裁剪、定制,所以目前WindowsCE被廣泛用于各種嵌入式智能設備的開發(fā),是當今應用最多、增長最快的嵌入式操作系統(tǒng)。WindowsCE被設計成為一種高度模塊化的操作系統(tǒng),每一模塊都提供特定的功能,這些模塊中的一部分被劃分成組件,系統(tǒng)設計者可以根據(jù)設備的性質(zhì)只選擇那些必要的模塊或模塊中的組件包含進操作系統(tǒng)映像,從而使WindowsCE變得非常緊湊(只占不到200KB的RAM),因此只占用了運行設備所需的最小的ROM、RAM以及其它硬件資源。WindowsCE被分成不同的模塊,其中最主要的模塊有內(nèi)核模塊(Kernel)、對象存儲模塊、圖形窗口事件子系統(tǒng)(GWES)模塊以及通信(Communication)模塊。另外WindowsCE還包含一些附加的可選擇模塊,這些模塊可支持的任務有管理可安裝設備驅(qū)動程序、支持COM等。一個最小的WindowsCE系統(tǒng)至少由內(nèi)核和文件系統(tǒng)模塊組成。1.1內(nèi)核模塊內(nèi)核模塊是WindowsCE操作系統(tǒng)的核心,它為任何基于WindowsCE的設備提供處理器調(diào)度、內(nèi)存管理、異常處理以及系統(tǒng)內(nèi)通信等系統(tǒng)功能,并為應用程序使用這些核心功能提供內(nèi)核服務。WindowsCE的內(nèi)核模塊通過CoreDLL模塊表示。所有的操作系統(tǒng)定制設計都必須包含這個模塊,但并不是這個模塊的所有組件都必需的,有一些內(nèi)核組件是可選的。1.2對象存儲對象存儲是WindowsCE的默認文件系統(tǒng),它相當于WindowsCE設備上的硬盤。對象存儲是由共享一個內(nèi)核堆的文件系統(tǒng)、系統(tǒng)數(shù)據(jù)庫和系統(tǒng)注冊表組成,即使在沒有系統(tǒng)主電源時,對象存儲也能維持應用程序及相關(guān)數(shù)據(jù)不會丟失。對象存儲可將用戶數(shù)據(jù)和應用程序數(shù)據(jù)存入文件或注冊器。在操作系統(tǒng)創(chuàng)建進程(該進程中只包括那些必需選項)的過程中,對于這些不同的對象存儲組件,可以選取,也可以忽略。1.3圖形窗口和事件系統(tǒng)模塊圖形窗口和事件系統(tǒng)模塊(GWES)包含大部分的核心WindowsCE功能,它集成了圖形設備接口(GDI)、窗口管理器和事件管理器。GWES模塊時WindowsCE操作系統(tǒng)高度組件化的部分,它分別由USER和GDI兩_______部分組成,USER用來處理消息、事件及鼠標和鍵盤等用戶輸入,而GDI用于處理圖形的屏幕和打印輸出等。GWES是用戶、應用程序和操作系統(tǒng)之間的圖形用戶接口。GWES通過處理鍵盤、鼠標動作與用戶交互,并選擇傳送到應用程序和操作系統(tǒng)的信息。GWES通過創(chuàng)建并管理在顯示設備和打印機上顯示的窗口、圖形以及文本來處理輸出。GWES的中心是窗口。所有應用程序都通過窗口接收來自操作系統(tǒng)的消息,即使那些為缺少圖形顯示的設備創(chuàng)建的應用程序也是如此。GWES提供控制器、菜單、對話框以及圖形顯示的設備資源,還提供GDI以控制文本與圖形顯示。1.4通信模塊通信模塊為基于WindowsCE的設備提供有線或無線通信能力,使WindowsCE設備能夠與其他設備或計算機進行連接與通信,通信組件提供對下列通信硬件和數(shù)據(jù)協(xié)議的支持:·串行I/O支持·遠程訪問服務(RAS)·傳輸控制協(xié)議/Internet協(xié)議(TCP/IP)·局域網(wǎng)(LAN)·技術(shù)API(TAPI)·WinCE的無線服務可選組件除上述主要模塊之外,還可使用其它的操作系統(tǒng)模塊。這些模塊與組件主要有:·設備管理器和設備驅(qū)動程序·多媒體(聲音)支持模塊·COM支持模塊·WinCE外殼模塊WinCE提供的每一模塊或組件都支持一組可用的相關(guān)API函數(shù)。2PlatformBuilder開發(fā)工具介紹PlatformBuilder(PB)是微軟提供給WindowsCE開發(fā)人員進行基于WindowsCE平臺下嵌入式操作系統(tǒng)定制的集成開發(fā)環(huán)境。它提供了所有進行設計、創(chuàng)建、編譯、測試和調(diào)試WindowsCE操作系統(tǒng)平臺的工具。它運行在桌面Windows下,開發(fā)人員可以通過交互式的環(huán)境來設計和定制內(nèi)核、選擇系統(tǒng)特性,然后進行編譯和調(diào)試。該工具能夠根據(jù)用戶的需求,選擇構(gòu)建具有不同內(nèi)核功能的CE系統(tǒng)。同時,它也是一個集成的編譯環(huán)境,可以為所有CE支持的CPU目標代碼編譯C/C++程序。一旦成功地編譯了一個CE系統(tǒng),就會得到一個名為nk.bin的映像文件。將該文件下載到目標板中,就能夠運行CE了。PlatformBuilder提供了開發(fā)人員快速建立基于WindowsCE嵌入式系統(tǒng)所需的各種工具。PlatformBuilder的集成開發(fā)環(huán)境(IDE)允許開發(fā)人員配置、建立并調(diào)試能夠借助Windows和Web強大功能為嵌入式系統(tǒng)帶來靈活性與可靠性的新一代高度模塊化設計方案。PlatformBuilder提供的主要特性包括:平臺開發(fā)向?qū)В≒latformWizard)和BSP開發(fā)向?qū)В洪_發(fā)向?qū)в糜谝龑ч_發(fā)人員區(qū)創(chuàng)建一個簡單的系統(tǒng)平臺或BSP(板級支持軟件包),然后再根據(jù)要求進一步修改。開發(fā)向?qū)岣吡似脚_和BSP創(chuàng)建效率;特性目錄(Catalog):操作系統(tǒng)可選特性均在特性目錄(Catalog)中列出,開發(fā)人員可以選擇相應的特性來定制操作系統(tǒng);導出向?qū)В‥xportWizard)。可以向其他PlatformBuilder用戶導出自定義的目錄(Catalog)特性;導出SDK向?qū)В‥xportSDKWizard):使用戶可以導出一個自定義的軟件開發(fā)工具包(SDK),可以將客戶定制的SDK導出到特定的開發(fā)環(huán)境中(如EVC)。遠程工具:可以執(zhí)行同基于WindowsCE的目標設備有關(guān)的各種調(diào)試任務和信息收集任務;仿真器(Emulator):通過硬件仿真加速和簡化了系統(tǒng)的開發(fā),使用戶可以在開發(fā)工作站上對平臺和應用程序進行調(diào)試,大大簡化了系統(tǒng)的開發(fā)流程,縮短了開發(fā)時間。應用程序調(diào)試器:可以在自定義的操作系統(tǒng)映像上對應用程序進行調(diào)試;內(nèi)核調(diào)試器:可以對自定義的操作系統(tǒng)映像進行調(diào)試,并且向用戶提供有關(guān)映像性能的信息;驅(qū)動測試工具包(WindowsCE.netTestKit):系統(tǒng)為驅(qū)動程序開發(fā)提供了基本的測試工具集;基礎配置:為各種流行的設備類別預置的可操作系統(tǒng)基礎平臺,為自定義操作系統(tǒng)的創(chuàng)建提供了一個起點。PlatformBuilder的開發(fā)界面如圖1-1所示。圖1-1PlatformBuilder開發(fā)界面3BSP原理簡述BSP又稱板級支持軟件包,它是一個包括啟動程序、OEM適配層程序(OAL)、標準開發(fā)板(SDB)和相關(guān)硬件設備驅(qū)動程序的軟件包。BSP是基于WindowsCE平臺系統(tǒng)的主要部分,它是由一些源碼和二進制文件組成。對于嵌入式系統(tǒng)來說,它沒有像PC機那樣具有廣泛使用的各種工業(yè)標準,各種嵌入式系統(tǒng)的不同應用需求決定了它選用的各自定制的硬件環(huán)境,這種多變的硬件環(huán)境決定了無法完全由操作系統(tǒng)來實現(xiàn)上層軟件與底層硬件之間的無關(guān)性。因此各種商用實時操作系統(tǒng)都采用了分層設計的方法,它將系統(tǒng)中與硬件直接相關(guān)的一層軟件獨立出來,稱之為BoardSupportPackage(板級支持軟件包,簡稱BSP)。顧名思義,BSP是針對某個單板而設計的,它對于用戶(開發(fā)者)是開放的,用戶可以根據(jù)不同的硬件需求對其作改動或二次開發(fā),而操作系統(tǒng)本身僅僅提供了CPU內(nèi)核的無關(guān)性。BSP在系統(tǒng)中的角色,很相似于BIOS在PC統(tǒng)中的地位。BSP在系統(tǒng)中所處的位置,如圖1-2所示,它位于硬件平臺與操作系統(tǒng)或應用軟件之間,用于屏蔽上層軟件對各種硬件的相關(guān)性。圖1-2BSP在系統(tǒng)中的位置BSP的主要功能在于配置系統(tǒng)硬件使其工作在正常狀態(tài),并且完成硬件與軟件之間的數(shù)據(jù)交互,為OS及上層應用程序提供一個與硬件無關(guān)的軟件平臺。在PlatformBuilder中,微軟提供了對十幾中標準開發(fā)板(SDB)支持的BSP,這些BSP覆蓋了所有WindowsCE可支持的處理器類型,它可使開發(fā)者快速地評估各種操作系統(tǒng)特性并減少新產(chǎn)品開發(fā)時間。四、實驗組織運行要求根據(jù)本實驗的特點、要求和具體條件,采用以學生自主訓練為主的開放模式組織教學。重點:WindowsCE內(nèi)核的配置、編譯方法;構(gòu)建特定開發(fā)平臺的WinCE系統(tǒng)方法;熟悉PlatformBuilder開發(fā)工具使用方法。難點:構(gòu)建特定開發(fā)平臺的WinCE系統(tǒng)方法五、實驗條件裝有WinCE、XScalePXA270開發(fā)環(huán)境和VS的PC機或虛擬機六、實驗步驟1、安裝XSBase270的BSP為了使PlatformBuilder支持XSBase270開發(fā)板的硬件資源系統(tǒng),在安裝WindowsCE之后需要安裝XSBase270的板級支持軟件包(BSP)。具體安裝步驟:雙擊隨開發(fā)板提供的BSP安裝文件,進入BSP安裝向?qū)鐖D1-3所示。圖1-3XSBase270BSP安裝向?qū)О础癗ext”按鈕,進入安裝過程,BSP自動選擇WindowsCE安裝目錄(D:\WINCE500),如圖1-4所示。圖1-4BSP安裝目錄界面按“Install”按鈕,進行BSP的安裝。如圖1-5所示。圖1-5BSP安裝過程界面BSP安裝完成后,安裝向?qū)崾景惭b完成界面,按“Finish”按鈕,完成BSP的安裝。如圖1-6所示。圖1-6BSP安裝完成界面XSBase270的BSP安裝完成后,啟動PlatformBuilder,在PlatformBuilder的特性目錄區(qū)(Catalog)的第三方BSP(ThirdParty)節(jié)點下出現(xiàn)所安裝的XSBase270的BSP(EmdoorSystemXSBase270:ARMV4I),如圖1-7所示。圖1-7PlatformBuilder中XSBase270的BSP2、實驗平臺的配置第一步:新建一個目標平臺:a)選擇菜單項“File”->“NewPlatformWizard.”;b)輸入目標平臺名稱和保存的位置,如圖1-8所示圖1-8目標平臺名稱和保存路徑界面c)為目標平臺選擇所支持的BSP,XSBase270開發(fā)板選擇選擇“EMDOORSYSTEMXSBASE270:ARMV4I”平臺,如圖1-9所示;圖1-9BSP選擇界面d)為新建的目標平臺選擇一個合適的模板配置,如圖1-10所示;圖1-10設計模板配置e)在“Application&Media”選擇有關(guān)特性(本實驗選則默認項);如圖1-11所示圖1-11Applications&Media選擇界面f)在“Networking&Communications”中選擇可用特性(默認項);如圖1-12所示圖1-12Networking&Communications配置界面g)完成“NewPlatformWizard.”,如圖1-13所示圖1-13平臺配置完成界面第二步:平臺的配置a)選擇菜單項“Platform”->“Setting”。b)在“PlatformSettings”對話框中設置“General”選項卡。選中“Release”,如圖1-14所示圖1-14編譯類型設置c)在“PlatformSettings”對話框中設置“BuildOptions”選項卡;針對該XSBase270開發(fā)板實驗平臺的選項配置如圖1-15所示圖1-15編譯選項配置第三步:配置系統(tǒng)組件和特性如圖1-16所示,左邊的workspace區(qū)顯示的是所配置的WinCE操作系統(tǒng)所具有的組件,右邊的Catalog區(qū)顯示的則是PB提供的能夠加入到WinCE操作系統(tǒng)的所有組件。實驗者可以在右邊的catalog區(qū)中選擇自己需要的設備驅(qū)動程序和功能組件。如果決定要添加它到左邊的workspace區(qū)以參加編譯,通過右擊選項再選擇“AddtoOSDesign”。圖1-16系統(tǒng)組件特性界面a)添加XSBase270實驗平臺提供的設備驅(qū)動程序XSBase270實驗平臺的驅(qū)動程序由平臺BSP提供,其中包括輸入設備(InputDevices)、網(wǎng)絡設備(Networking)、PC卡(PCCard)、SD卡、串口、觸摸屏、USB設備等;另外還包括EmdoorOEM驅(qū)動程序(主要包括:CAN總線驅(qū)動、IDE接口驅(qū)動、LED顯示驅(qū)動、電機接口驅(qū)動等)。如果用戶想向新建平臺添加設備驅(qū)動程序,通過右擊選項再選擇“AddtoOSDesign”即可。如圖1-17所示圖1-17XSBase270的BSP提供的驅(qū)動程序b)添加系統(tǒng)功能組件系統(tǒng)的功能組件屬于平臺無關(guān)部分,由PlatformBuilder開發(fā)環(huán)境統(tǒng)一提供。它們均是在CoreOs目錄下進行添加,如圖1-17所示。用戶可以根據(jù)實驗的需要添加系統(tǒng)功能組件,本實驗中添加以下系統(tǒng)功能組件:①添加數(shù)據(jù)同步的組件:CoreOS—>WindowsCEdevices—>Applications-EndUser—>ActiveSync—>FileSync;②圖片瀏覽器的添加:CoreOS-WindowsCEdevices-Applications-EndUser—FileViewers—MicrosoftImageViewer③大的軟鍵盤組件的添加:CoreOS—>WindowsCEdevices—ShellandUserInterface—>SoftwareInputPanel—>Software-basedInputPanel(SIP)(Choose1ormore)—>SIPforLargeScreens④文件系統(tǒng)的添加:CoreOS—>WindowsCEdevices—>FileSystemsandDataStore—>StorageManager—>FATFileSystem;⑤配置信息保存模塊添加:CoreOS—>WindowsCEdevices—>FileSystemsandDataStore—RegistryStorage(Choose1)—>Hive-basedRegistry;⑥CF卡模塊的添加:Catalog—>DeviceDrivers—StorageDevices—>CompactFlash/PCCardStorage(ATADISK)⑦添加無線CF卡:CoreOS->WindowsCEdevices—>CommunicationServicesandNetworking—>Networking-LocalAreaNetwork(LAN)—>WirelessLAN(802.11)⑧EVC調(diào)試程序組件模塊的添加:Catalog—>PlatformManager—>PlatformManager圖1-18添加系統(tǒng)功能組件3、平臺的編譯,構(gòu)建系統(tǒng),生成映像文件選擇菜單項BuildOS—>Sysgen對平臺進行編譯(如圖1-19所示),如果沒出任何錯誤,編譯完成后將生成一個系統(tǒng)映象文件,該文件被放在所建工程所保存的目錄下的/RelDir/工程名_ARMV4I_Release目錄下(本實驗的編譯后的映像文件NK.bin保存在D:\WINCE500\PBWorkspaces\xsbase270\RelDir\XSBase270_ARMV4I_Release目錄下)。具體編譯鏈接花費的時間根據(jù)你的宿主機的速度和你所配置平臺的大小而定。一般需要20~30分鐘。圖1-19平臺的編譯4、代碼下載測試超級終端的配置—超級終端的通信參數(shù)設置(如圖1-20所示)圖1-20超級終端設置啟動目標平臺,超級終端顯示BootLoader配置選項(如圖1-21),如果需要下載新的映像文件,則第三項必須為:3)DHCP:Disable,第五項必須為:5)Downloadnewimageatstartup圖1-21目標板的BootLoader菜單配置選項PlatformBuilder配置:選擇菜單項Target—>ConnectivityOptions進行連接選項配置,如圖1-22所示。下載方式采用以太網(wǎng)下載,單擊“Settings”按鈕,對以太網(wǎng)進行配置,如圖1-22所示。假如沒有接收到設備名:XSBASE2960的話,檢查網(wǎng)線是否連接好,可以查看板子上,以太網(wǎng)端口旁的指示燈是否點亮。然后檢查XSBASE2960的IP是否跟你的PC機在同一網(wǎng)段。圖1-22目標板連接配置 圖1-23下載以太網(wǎng)配置下載測試選擇菜單項Target—>AttachDevice,進行設備連接,如果設備連接正常,PlatformBuilder將編譯好的映像文件NK.bin通過以太網(wǎng)下載到目標板中,圖1-24為PlatformBuilder下載進程。圖1-24映像文件下載進程同時超級終端顯示映像文件下載情況,當超級終端出現(xiàn)下面的字樣的時候,表示映像文件已經(jīng)下載到目標板的Flash存儲器中。FlashWrite:Savedendsector(s)First0x206(Length=0x1FA).FlashErase:Unlockingflashblock(s)[0x1,0x1](pleasewait):Done.Erasingflashblock(s)[0x1,0x1](pleasewait):.Done.FlashWrite:Restoredendsector(s)First0x206(Length=0x1FA).Writingtoflash(pleasewait):Done.隨后斷電或按復位鍵重新啟動,并將超級終端的第5項改為“Launchexistingflashresidentimageatstartup.”然后按“L”字母。系統(tǒng)將啟動起來。七、思考題1、如何使用PB編譯一個MobileHandlheld的平臺?2、請描述PlatformBuilder的功能;3、如何確定組件已經(jīng)添加到PB中?4、請編譯一個在PC機仿真(Emulator)運行的WindowsCE系統(tǒng)?八、實驗報告

在實驗前每位同學都需要對本次實驗進行認真的預習,并寫好預習報告,在預習報告中要寫出實驗目的、要求,需要用到的儀器設備、物品資料以及簡要的實驗步驟,形成一個操作提綱。對實驗中的安全注意事項及可能出現(xiàn)的現(xiàn)象等做到心中有數(shù),但這些不要求寫在預習報告中。

設計性實驗要求進入實驗室前寫出實驗方案,并經(jīng)指導教師審閱后實施。

學生開始實驗時,應該將記錄本放在近旁,將實驗中所做的每一步操作、觀察到的現(xiàn)象和所測得的數(shù)據(jù)及相關(guān)條件如實地記錄下來。

實驗記錄中應有指導教師的簽名。

主要內(nèi)容包括對實驗數(shù)據(jù)、實驗中的特殊現(xiàn)象、實驗操作的成敗、實驗的關(guān)鍵點等內(nèi)容進行整理、解釋、分析總結(jié),回答思考題,提出實驗結(jié)論或提出自己的看法。實驗二線程同步調(diào)試實驗實驗學時:2實驗類型:驗證實驗要求:必修一、實驗目的1、了解WinCE下IO訪問機制和原理;2、掌握WinCE線程編程方法;3、掌握線程同步原理和實現(xiàn)線程同步的方法4、熟悉VS.Net的開發(fā)環(huán)境;二、實驗內(nèi)容1、了解在WindowsCE下線程編程方法;2、掌握利用線程同步實現(xiàn)線程同步的基本原理;3、掌握線程同步編程;4、掌握VS.net編程方法三、實驗原理、方法和手段1、線程概述WinCE是有優(yōu)先級的多任務操作系統(tǒng),它允許重功能、進程在相同時間的系統(tǒng)中運行,WinCE支持最大的32位同步進程。一個進程包括一個或多個線程,每個線程代表進程的一個獨立部分,而一個線程被指定為進程的基本線程。WinCE以搶先方式來調(diào)度線程。線程以“時間片”為單位來運行,WinCE的“時間片”通常為25毫秒。過來那個時間后,如果線程沒有放棄它的時間片,并且線程并不緊急,系統(tǒng)就會掛起線程并調(diào)度另一個線程來運行。WinCE將根據(jù)優(yōu)先級方法來決定要運行的線程,高優(yōu)先級的線程將在低優(yōu)先級的線程前面調(diào)度。2、線程API函數(shù)2.1創(chuàng)建線程WinCE提供了CreateThread函數(shù)來創(chuàng)建線程,其聲明如下:HANDLECreateThread(LPSECURITY_ATTRIBUTESlpThreadAttributes,//線程安全指針,不支持DWORDdwStackSize,//為自己所使用堆棧分配的地址空間大小,不支持LPTHREAD_START_ROUTINElpStartAddress,//線程函數(shù)地址LPVOIDlpParameter,//傳入線程函數(shù)的參數(shù)DWORDdwCreationFlags,//控制線程創(chuàng)建的附加標志LPDWORDlpThreadId//新線程的ID值);WinCE不支持lpThreadAttributes和dwStackSize參數(shù),將它們設置成NULL和0即可。lpStartAddress指向線程函數(shù)的地址;lpParameter被傳遞到線程中的參數(shù);dwCreationFlags線程創(chuàng)建參數(shù),可以設置成0或CREATE_SUSPENDED,如果為0,表示線程立即執(zhí)行,如果參數(shù)為CREATE_SUSPENDED,則被創(chuàng)建的線程將處于掛起狀態(tài),而且必須要調(diào)用ResumeThread函數(shù)將其喚醒。2.2掛起和恢復線程正在運行的線程可以被掛起、暫停執(zhí)行。同他使用SuspendThead函數(shù)即可實現(xiàn)以上功能,該函數(shù)的聲明如下:DWORDSuspendThread(HANDLEhThread);參數(shù)hThead代表要掛起線程的句柄。由于SuspendThread函數(shù)的調(diào)用將增加掛起計數(shù),因此在實際調(diào)度線程運行之前,對SuspendThread函數(shù)的多次調(diào)用必須與對ResumeThread函數(shù)的多次調(diào)用相匹配。ResumeThread函數(shù)的定義DWORDResumeThread{HANDLEhThread};參數(shù)hThead同樣代表要恢復線程的句柄。3線程同步在使用線程時,會經(jīng)常遇到兩個概念,即線程沖突和線程死鎖。線程沖突:如果線程A讀寫數(shù)據(jù)G,線程B也正在讀取數(shù)據(jù)G,那么很顯然,該操作將導致數(shù)據(jù)沖突,引起數(shù)據(jù)混亂。這里需要使用同步技術(shù),以保證線程A和線程B依次讀寫數(shù)據(jù)G,避免數(shù)據(jù)沖突。線程死鎖:例如A工人為加工III零件在等待B提供的I零件,而B正好在等待應由A加工提供的II零件來裝配I零件。由于他們之間再沒有其他的任何人幫助通信或其他通信手段。所以他們一直在等對方的零件而進入死鎖狀態(tài)。死鎖屬于邏輯錯誤,無法通過線程同步來解決。WinCE實現(xiàn)線程同步的常用方法:事件(Event)、互斥(Mutex)、信號量(Semaphore)、臨界區(qū)(CriticalSection)。3.1利用事件同步“事件對象”是實現(xiàn)線程同步最基本的方法之一,一個事件對象可以處于“已標示”和“未標示”兩種狀態(tài),如果將事件對象設置為“已標示”狀態(tài),表示可以執(zhí)行同步操作,事件對象處于“未標示”狀態(tài),則表示需要等待事件對象變?yōu)椤耙褬耸尽睜顟B(tài)才可以進行同步操作。下面介紹利用事件同步所需要的API函數(shù)。(1)CreateEvent函數(shù)。創(chuàng)建事件對象函數(shù)CreateEvent,其聲明如下:HANDLECreateEvent(LPSECURITY_ATTRIBUTESlpEventAttributes,//CE不支持,設為NULLBOOLbManualReset,//設置是否手動設置事件對象狀態(tài)BOOLbInitialState,//事件對象初始狀態(tài)LPTSTRlpName//事件對象名稱);參數(shù)bManualReset表示是否手動設置事件對象狀態(tài),當其值為TRUE時,在調(diào)用完等待函數(shù)(WaitForSingObject,WaitForMutipleObject)后,則必須調(diào)用ResetEvent函數(shù),以設置事件對象沒有被標示,當其值為FALSE時,系統(tǒng)調(diào)用完等待函數(shù),會自動將事件對象設置為未標示狀態(tài)。參數(shù)bInitialState表示事件對象初始狀態(tài),當其值為TRUE是,事件對象初始化狀態(tài)為已標示,當其值為FALSE時,事件對象初始狀態(tài)為未標示。如果創(chuàng)建事件函數(shù)對象CreateEvent執(zhí)行成功,將返回事件對象句柄。若失敗,則返回0,在不用事件句柄時,需要使用CloseHandle()將其關(guān)閉,以釋放資源。(2)SetEvent函數(shù)和ResetEvent函數(shù)。函數(shù)SetEvent()的功能是將事件對象設置為已標示狀態(tài)。該函數(shù)的聲明如下:BOOLSetEvent(HANDLEhEvent);參數(shù)hEvent表示事件對象句柄。函數(shù)ResetEvent函數(shù)功能將事件對象設置成未標示狀態(tài),該函數(shù)的聲明如下:BOOLResetEvent(HANDLEhEvent);(3)使用事件同步的一般使用流程通常情況,在主線程中,用戶利用CreateEvent函數(shù)創(chuàng)建一個事件對象,并且將參數(shù)bManualReset設為FALSE,參數(shù)bInitialState也設為FALSE,此時事件對象狀態(tài)未標示。然后在線程里通過WaitForSingleObject函數(shù)來等待事件被標示。此時,只要在主線程中調(diào)用SetEvent函數(shù),將事件對象設置成已標示。那么線程里的WaitForSingleObject函數(shù)便會返回,繼續(xù)執(zhí)行,同時將事件對象狀態(tài)設置成未標示。3.2利用互斥同步互斥同步類似于事件對象同步。互斥同步也將創(chuàng)建一個互斥對象,該互斥對象也有“被線程擁有”和“不被線程擁有”兩種狀態(tài);當互斥對象處于“不被線程擁有”狀態(tài),表示可以執(zhí)行相關(guān)操作;當互斥對象處于“被線程擁有”狀態(tài),表示此時不可以執(zhí)行相關(guān)操作。通過等待函數(shù)請求互斥對象實現(xiàn)同步。(1)CreateMutex函數(shù)。通過CreateMutex函數(shù)創(chuàng)建互斥對象,該函數(shù)定義如下:HANDLECreateMutex(LPSECURITY_ATTRIBUTESlpMutexAttributes,//CE不支持BOOLbInitialOwner,//初始化擁有狀態(tài),TRUE表示擁有,F(xiàn)ALSE表示未被擁有LPCTSTRlpName//互斥名稱);如果創(chuàng)建互斥函數(shù)對象CreateMutex執(zhí)行成功,將返回互斥對象句柄。若失敗,則返回ERROR_INVALID_HANDLE,在不用互斥句柄時,需要使用CloseHandle()將其關(guān)閉,以釋放資源。(2)ReleaseMutex函數(shù)。在使用等待函數(shù)請求互斥對象時,如果請求到互斥對象的擁有權(quán),則等待函數(shù)將自動設置互斥對象狀態(tài)為“未被擁有”。ReleaseMutex函數(shù)負責釋放某個線程對象互斥對象的擁有權(quán),也就是將互斥對象設置為“未被線程擁有”狀態(tài)。ReleaseMutex函數(shù)定義如下:BOOLReleaseMutex(HANDLEhHandle);hHandle表示互斥對象句柄;(3)利用互斥同步的一般使用流程利用互斥同步的一般使用流程是:首先利用CreateMutex函數(shù)創(chuàng)建互斥對象,并將CreateMutex中的參數(shù)bInitialOwer設置為FALSE,使互斥對象處于“未被線程擁有”狀態(tài)。然后利用WaitForObject等待互斥對象,執(zhí)行相關(guān)操作。處理完成后,利用ReleaseMutex函數(shù)釋放線程對互斥對象的擁有權(quán)。當所有線程執(zhí)行完畢后,需要使用CloseHandle()將其關(guān)閉。3.3利用臨界區(qū)同步“臨界區(qū)”是進行線程同步的另一種方法,它能夠阻止兩個或多個不同的線程在同一時間內(nèi)訪問同一個代碼區(qū)域。它通過調(diào)用EnterCriticalSection函數(shù)來指出已經(jīng)進入代碼的臨界區(qū),如果另一線程也調(diào)用了EnterCritialSection函數(shù),并且參數(shù)指向同一臨界區(qū)對象,那么另一線程將阻塞,直到第一個線程調(diào)用了LeaveCriticalSection函數(shù)離開臨界區(qū)為止。臨界區(qū)同步所需要的API函數(shù):(1)InitializeCriticalSection函數(shù)。如果要使用臨界區(qū),首先要使用InitializeCriticalSection函數(shù)創(chuàng)建臨界區(qū),該函數(shù)定義如下:voidInitializeCriticalSection(LPCRITICAL_SECTIONlpCriticalSection);(2)DeleteCriticalSection函數(shù),當結(jié)束使用臨界區(qū)對象時,必須調(diào)用DeleteCriticalSection函數(shù)釋放臨界區(qū)對象所占有的資源。該函數(shù)定義如下:voidDeleteCriticalSection(LPCRITICAL_SECTIONlpCriticalSection);(3)EnterCriticalSection函數(shù),在創(chuàng)建了臨界區(qū)對象后,需要調(diào)用EnterCriticalSection函數(shù)進入臨界區(qū),以保護代碼,該函數(shù)定義如下:voidEnterCriticalSection(LPCRITICAL_SECTIONlpCriticalSection);如果臨界區(qū)對象已經(jīng)屬于另一個線程,那么此函數(shù)將阻塞直到另一線程離開臨界區(qū)才返回。(4)LeaveCriticalSection函數(shù)。如果要離開臨界區(qū),只需要調(diào)用LeaveCriticalSection函數(shù)即可。該函數(shù)定義如下:voidLeaveCriticalSection(LPCRITICAL_SECTIONlpCriticalSection);3.3利用信號量同步信號量是建立在互斥基礎上,并增加了資源計數(shù)的功能。它允許預定數(shù)目的線程同時進入要同步的代碼。通過設置信號量計數(shù)為1,只允許一個線程同時訪問同步代碼,而實現(xiàn)線程同步。信號量同步所需要的API函數(shù):(1)CreateSemaphore函數(shù)。在使用信號量實現(xiàn)同步時,需要調(diào)用CreateSemaphore函數(shù)創(chuàng)建信號量對象。該函數(shù)定義如下:HANDLECreateSemaphore(LPSECURITY_ATTRIBUTESlpSemaphoreAttributes,//CE不支持LONGlInitialCount,//信號量初始化計數(shù)值LONGlMaximumCount,//信號量計數(shù)最大值LPCTSTRlpName//信號量對象名稱);如創(chuàng)建信號量成功,函數(shù)返回信號量對象句柄,否則返回NULL值。(2)ReleaseSemaphore函數(shù)。在使用等待函數(shù)請求信號量時,等待函數(shù)自動給信號量計數(shù)減1,那么當計數(shù)減到0時,信號量對象將不能被請求。ReleaseSemaphore函數(shù)負責給信號量計數(shù)加值,使信號量可以被請求。此函數(shù)定義如下:BOOLReleaseSemaphore(HANDLEhSemaphore,//信號量句柄LONGlReleaseCount,//信號量計數(shù)增加的值LPLONGlpPreviousCount//輸出量,表示上一次信號量計數(shù));4、線程同步實驗原理(1)在PXA270目標板上具有8個LED發(fā)光二極管,利用線程函數(shù)實現(xiàn)在LED點亮左移后便進行點亮右移,并循環(huán)進行。其中LeftShiftThread(LPVOIDparam)線程函數(shù)完成左移,RightShiftThread(LPVOIDparam)線程函數(shù)完成右移。由于兩線程函數(shù)對同一物理地址和同一輸入變量outdata進行操作,所以需要利用線程同步技術(shù)進行線程同步。下面為左移線程代碼:(右移代碼參考源程序)DWORDCThreadSyncDlg::LeftShiftThread(LPVOIDparam){CThreadSyncDlg*pDlg=(CThreadSyncDlg*)param;if(pDlg->m_CtrlEvent.GetCheck()){//利用事件同步while(1){WaitForSingleObject(pDlg->m_hSyncEvent,INFINITE);//等待事件標示pDlg->outdata=0x01;for(inti=0;i<8;i++){*pLightReg=~(pDlg->outdata);Sleep(m_ShiftTime);pDlg->outdata=(pDlg->outdata)<<1;if(pDlg->m_bStop)//停止return0;}SetEvent(pDlg->m_hSyncEvent);//標示事件}}if(pDlg->m_CtrlMutex.GetCheck()){//互斥同步while(1){WaitForSingleObject(pDlg->m_hSyncMutex,INFINITE);//等待互斥pDlg->outdata=0x01;for(inti=0;i<8;i++){*pLightReg=~(pDlg->outdata);Sleep(m_ShiftTime);pDlg->outdata=(pDlg->outdata)<<1;if(pDlg->m_bStop){ReleaseMutex(pDlg->m_hSyncMutex);return0;}}ReleaseMutex(pDlg->m_hSyncMutex);//釋放互斥對象}}if(pDlg->m_CtrlSemaphore.GetCheck()){//信號量同步while(1){WaitForSingleObject(pDlg->m_hSynSemaphore,INFINITE);pDlg->outdata=0x01;for(inti=0;i<8;i++){*pLightReg=~(pDlg->outdata);Sleep(m_ShiftTime);pDlg->outdata=(pDlg->outdata)<<1;if(pDlg->m_bStop){ReleaseSemaphore(pDlg->m_hSynSemaphore,1,NULL);return0;}}ReleaseSemaphore(pDlg->m_hSynSemaphore,1,NULL);}}if(pDlg->m_CtrlCritical.GetCheck()){//臨界區(qū)同步while(1){EnterCriticalSection(&(pDlg->m_critical_Section));//進入臨界區(qū)pDlg->outdata=0x01;for(inti=0;i<8;i++){*pLightReg=~(pDlg->outdata);Sleep(m_ShiftTime);pDlg->outdata=(pDlg->outdata)<<1;if(pDlg->m_bStop){LeaveCriticalSection(&(pDlg->m_critical_Section));return0;}}LeaveCriticalSection(&(pDlg->m_critical_Section));//離開臨界區(qū)}}if(pDlg->m_CtrlNone.GetCheck()){//沒有使用同步技術(shù)while(1){pDlg->outdata=0x01;for(inti=0;i<8;i++){*pLightReg=~(pDlg->outdata);Sleep(m_ShiftTime);pDlg->outdata=(pDlg->outdata)<<1;if(pDlg->m_bStop)return0;}}}return0;}(2)線程開啟過程voidCThreadSyncDlg::OnbtnExecute(){HANDLEm_hLeftThread;HANDLEm_hRighthread;m_bStop=FALSE;if(m_CtrlEvent.GetCheck())::SetEvent(m_hSyncEvent);m_hLeftThread=::CreateThread(NULL,0,LeftShiftThread,this,0,NULL);//創(chuàng)建左移線程m_hRighthread=::CreateThread(NULL,0,RightShiftThread,this,0,NULL);//創(chuàng)建右移線程if(!m_hLeftThread)MessageBox(_T("CreateLeftShiftThreadFailed"),_T("SystemInformation"),MB_OK|MB_ICONERROR);if(!m_hRighthread)MessageBox(_T("CreateRightShiftThreadFailed"),_T("SystemInformation"),MB_OK|MB_ICONERROR);CloseHandle(m_hLeftThread);CloseHandle(m_hRighthread);}(3)線程同步量初始化BOOLCThreadSyncDlg::OnInitDialog(){CDialog::OnInitDialog();SetIcon(m_hIcon,TRUE);//SetbigiconSetIcon(m_hIcon,FALSE);//SetsmalliconCenterWindow(GetDesktopWindow());//centertothehpcscreenif(!InitLightReg()){MessageBox(L"InitLightRegisterFailed",L"SystemInform",MB_OK|MB_ICONERROR);returnFALSE;}m_CtrlEvent.SetCheck(1);m_hSyncEvent=::CreateEvent(NULL,false,false,NULL);//創(chuàng)建事件同步對象m_hSyncMutex=::CreateMutex(NULL,false,NULL);//創(chuàng)建互斥同步對象m_hSynSemaphore=CreateSemaphore(NULL,1,1,NULL);//創(chuàng)建信號量同步對象InitializeCriticalSection(&m_critical_Section);//創(chuàng)建臨界區(qū)同步對象returnTRUE;}(4)同步變量的釋放voidCThreadSyncDlg::OnDestroy(){if(m_hSyncEvent)CloseHandle(m_hSyncEvent);if(m_hSyncMutex)CloseHandle(m_hSyncMutex);if(m_hSynSemaphore)CloseHandle(m_hSynSemaphore);DeleteCriticalSection(&m_critical_Section);CDialog::OnDestroy();}四、實驗組織運行要求根據(jù)本實驗的特點、要求和具體條件,采用以學生自主訓練為主的開放模式組織教學。重點:WindowsCE下線程編程方法;線程同步編程。難點:線程同步實現(xiàn)線程同步的基本原理。五、實驗條件裝有WinCE、XScalePXA270開發(fā)環(huán)境和VS的PC機或虛擬機六、實驗步驟第一步:連接好實驗系統(tǒng),打開實驗箱電源。第二步:利用VisualS打開線程同步調(diào)試工程文件,進行編譯:第三步:編譯該代碼,點擊運行按鈕,這樣程序就會下載到XSBase270目標板板上運行。運行界面如圖2-1所示。圖2-1線程同步調(diào)試實驗運行界面第四步:線程調(diào)試實驗程序操作過程在分別選中事件同步(Event)、互斥同步(Mutex)、信號量同步(Semaphore)、臨界區(qū)同步(CriticalSection)后,按下“Execute”按鈕(Execute),觀察LED發(fā)光二極管的點亮現(xiàn)象;按下“Stop”按鈕使LED發(fā)光二極管停止移動。選中沒有利用線程同步方法“None”,按下“Execute”按鈕,觀察LED發(fā)光二極管的點亮現(xiàn)象;七、思考題1、如果在線程運行過程中,需要采用事件的方法停止線程的運行,該怎樣修改程序?2、如果只需要每次完成發(fā)光二極管一次左移和右移操作,隨即自動停止,怎樣修改源程序?3、在編寫線程程序時,需要注意哪些問題?八、實驗報告

在實驗前每位同學都需要對本次實驗進行認真的預習,并寫好預習報告,在預習報告中要寫出實驗目的、要求,需要用到的儀器設備、物品資料以及簡要的實驗步驟,形成一個操作提綱。對實驗中的安全注意事項及可能出現(xiàn)的現(xiàn)象等做到心中有數(shù),但這些不要求寫在預習報告中。

設計性實驗要求進入實驗室前寫出實驗方案,并經(jīng)指導教師審閱后實施。

學生開始實驗時,應該將記錄本放在

溫馨提示

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

最新文檔

評論

0/150

提交評論