第一章 基礎篇 第一章基礎篇 1-1 WinCE 概論 Windows CE 的發展史首批為 Windows CE 設計的是掌上型 管理器 " 設備, 配有 480*240 或 640*240 的螢幕和 Chiclet 鍵盤 ( 電腦常用的一種鍵盤, 有一個很小的矩形鍵盤 ) 這些設備,

Size: px
Start display at page:

Download "第一章 基礎篇 第一章基礎篇 1-1 WinCE 概論 Windows CE 的發展史首批為 Windows CE 設計的是掌上型 管理器 " 設備, 配有 480*240 或 640*240 的螢幕和 Chiclet 鍵盤 ( 電腦常用的一種鍵盤, 有一個很小的矩形鍵盤 ) 這些設備,"

Transcription

1 第 1 章 基礎篇 WinCE 概論 WinCE 結構分析 WinCE 的處理程式 / 執行緒管理和調度 WinCE 的記憶體管理 WinCE 的存儲管理 WinCE 的設備管理 第 2 章 實戰篇 WinCE 的安裝以及 WinCE 專案的建立和編輯 Eboot 的燒錄以及通過 Eboot 下載啟動 Embedded Visual C++ 的安裝和專案的建立 在 WinCE 和桌面系統之間建立通訊連接 第 3 章 實驗篇 實驗一 HELLO 應用程式實驗 實驗二螢幕上繪圖 ( 一 ) 實驗三螢幕上繪圖 ( 二 ) 實驗四螢幕上繪圖 ( 三 ) 實驗五通知 實驗六 WinCE 註冊表查看器的使用 實驗七 CF 卡讀寫實驗 實驗八 SD 卡介面實驗

2 第一章 基礎篇 第一章基礎篇 1-1 WinCE 概論 Windows CE 的發展史首批為 Windows CE 設計的是掌上型 管理器 " 設備, 配有 480*240 或 640*240 的螢幕和 Chiclet 鍵盤 ( 電腦常用的一種鍵盤, 有一個很小的矩形鍵盤 ) 這些設備, 稱為掌上型 PC, 在 1996 年首次問世 在 Fall Comdex 97 大會上,Windows CE 2.0 進行了一個重大的更新作業系統版本發佈, 和它配套的是一些新的硬體, 具有 640*240 的橫向螢幕, 一些是彩色的, 還具有較大的鍵盤 1998 年 1 月, 消費電子展覽會上, 微軟宣佈了兩個平台, 掌上型電腦 (Palm-size PC 可以看作 Pocket PC 的前身, 其中使用 Windows CE 2.x 的稱為 Palm-size PC, 使用 Windows CE 3.x 的稱為 Pocket PC) 和車用 PC( 譯者注 :Auto PC 是 Windows CE 的一種應用模式, 多用在一些車用電腦 工業自動控制等場合, 可按客戶需要修改輸入輸出方式而不限定使用原始的程式 ) 掌上型電腦目標直接瞄準了由 Palm OS 統治的基於筆式的管理器市場 掌上型電腦具有縱向顯示的特點, 並配有 240*320 的螢幕, 使用輸入筆來作為輸入方式 但是很不幸, 對 Windows CE 愛好者來說, 對這種原始掌上型電腦, 大眾顯然缺乏熱情 此後, 出現了一種新的迷你 Windows CE 設備, 配備了觸控式輸入鍵盤和 VGA/Super VGA 螢幕 這種設備被稱為 H/PC( 專業版 ), 電池可使用 10 小時, 並配備了微軟 Pocket Office 軟體改進版 這種設備中許多具有內建 Modem, 一些甚至配備了 thenstandard 螢幕, 移動軌跡墊或者 IBM 軌跡球設備 2000 年 4 月, 微軟宣佈了 Pocket PC, 它對老式掌上型電腦 (Palm-size PC) 做了極 1

3 DMA270 WinCE 5.0 操作流程 大的增強 最初的 Pocket PC 將使用具有更多功能的 Windows CE 3.0 Pocket PC 的用戶介面也有所不同, 具有更加整潔的 2 維外觀和修改過的主頁 -Today 桌面 然而,Pocket PC 最重要的特性是極大的改進了 Windows CE 的性能 微軟做了很多工作來調整 Windows CE 的性能 這些改進加上更快的 CPU, 可以讓系統像 Pocket 管理器期望的那樣運作的更快 在這種 Pocket PC 裡, 摩爾定律使得 Windows CE 設備可以跨越這條線 : 現在硬體已經有能力提供 Windows CE 需要的運算能力了 掌上型 PC 在 2000 年時升級到了 Windows CE 3.0 雖然這些系統( 現在稱為掌上型 PC2000) 在消費領域沒有成功, 但在工業領域找到了市場 它憑藉相對低的費用, 大螢幕和長時間電池能力滿足了這個機會市場 2001 年晚些時候,Pocket PC 更新為 Pocket PC 2002 這次發佈使用了 Windows CE3.0 的最終發佈版本, 並做了一些用戶介面方面的改進 同時也增加了 Pocket PC Phone 版本, 在 Pocket PC 設備中整合了蜂窩電話支援功能 這些設備具有了 Pocket PC 的功能, 也具有蜂窩電話的聯絡功能, 形成新一代幾乎可以始終連接的移動軟體 微軟的另一組人發佈了 Smart Display( 譯者注 : 一種具有觸控螢幕的無線監視器, 可以通過 b 無線網路連接到個人電腦, 並使用 Windows XP Professional 作業系統的 Remote Desktop"( 遠端桌面 ) 來通聯主機 ) 它使用 Windows CE.NET 4.1 系統, 具有平板式設備形式, 有無線網路通聯能力, 有一個底座可以連接到 PC 上 當使用底座的時候, 它可以做第 2 個顯示器 當不用底座的時候, 它可作為 PC 的移動顯示器 2003 年春季,Pocket PC 團隊發佈了升級版的 Pocket PC, 稱為 Pocket PC 2003 系統在用戶介面方面沒有很多變化, 但由於是基於 Windows CE.NET 4.2, 所以在穩定性和性能方面都有了巨大改進 Pocket PC 2003 還整合了藍芽支援功能,OEM 廠商可以選擇是否包含該功能 微軟還和 OEM 廠商合作生產基於 Windows CE 的蜂窩電話 這些電話中的少部分被稱為 Smartphone( 智慧型電話 ), 在 2002 年末發佈了, 最初是基於 Windows CE 年升級到了 Windows CE4.2, 並增加了一系列特徵, 包括.NET runtime 功能 新設備一直不斷在發佈, 例如 Media to Go 設備, 就是使用硬碟來儲存的移動視訊播放器 Windows CE 作業系統的強大功能, 使應用程式憑藉運作在這些設備上的簡單作業系統超越了系統能力 Windows CE 介紹 Windows CE 是最小, 也可能是最有趣的微軟 Windows 作業系統 Windows CE 徹頭徹尾的被設計成一個基於 ROM 的, 使用 Win32 API 子集的小型作業系統 Windows CE 2

4 第一章 基礎篇 把 Windows API 擴展到那些不支援大容量 XP 核心的領域和機器上 目前逐步消失的 Windows 95/98/Me 對那些需要向後相容 MS-DOS Windows 2.x 和 3.x 程式的用戶來說, 是個大作業系統 雖然它有缺點, 但 Windows Me 還是繼承了這個困難的任務 另一方面,Windows NT/2000/XP 是用於企業級的 它犧牲了相容性和大小, 來達到高等級的穩定和健壯 Windows XP 家庭版是 Windows XP 的一個版本, 用於家庭用戶, 它盡力保持了相容性, 但這相對於它的基本目標 -- 穩定性來說, 相容性還是排在第 2 位的 Windows CE 並不向後相容 MS-DOS 或者 Windows, 不是一個為企業級設計的全功能的作業系統 相反,Windows CE 是一個輕量級 多執行緒的作業系統, 它具有可選的圖形用戶介面 它的長處在於它的小尺寸 Win32 API 子集和多平台支援 Windows CE 也是最初.NET CF 版本的基礎,.NET CF 是.NET 在移動和嵌入式設備上的版本 這個精簡框架使用一個更小的函式庫, 提供了一個同樣強大的.NET 運作時環境, 這使得它適合用於電池供電的小型設備上 快速反應的嵌入式應用常常管理嚴格的時間反應 例如, 製造程式控制, 高速的資料獲取設備, 電訊交換設備, 醫用設備, 空中 有線 " 控制, 武器發射裝備, 空間航行和導航, 實驗室, 實驗控制, 汽車發動機控制, 機器人系統 為保證這種功能, 就意味著不僅需要計算精確性, 還有結果的時間性, 此種應用必須在指定的時間參數內做出反應 即時系統的廣義定義是 對任何外部刺激, 電腦做出即時反應是至關重要的系統 ", 標準定義在 Internet newsgroup corp realtime group 中 即時定義為: 一個即時系統它的計算正確性, 不僅依靠於計算邏輯上的正確, 還包括即時的產生結果 如果沒有達到系統時間限制條件, 系統也是失效的 搞清楚即時系統和即時操作系統 (RTOS) 的區別相當重要, 即時系統代表所有系統組成設備 硬體, 作業系統和應用 它需要達到系統的要求, 即時操作系統 (RTOS) 只是整個即時系統的一個組成部分, 它必須提供足夠的功能以確保整個即時系統達到要求 同樣, 搞清快速作業系統和即時操作系統之間區別, 也很重要, 對於一個 RTOS 雖然達到全面要求十分有用, 但並不是它自己達到這種要求 Internet neusgronp cornp.realtime 列舉了作為一個即時操作系統, 必須達到的要求 : OS( 作業系統 ) 必須是多執行緒和優先順序之分 OS 必須支持執行緒先順序 一個優先順序繼承的系統必須存在 3

5 DMA270 WinCE 5.0 操作流程 OS 必須支援可預測的執行緒 同步發送機 另外,OS 的行為必須是可預測的, 這意味即時系統的開發者必須對系統中斷, 系統調整和分時瞭若指掌 : 必須知道 OS 和設備驅動器的中間資料匹配最大時間 設備驅動器用來處理一個中斷最大時間和關於這些驅動器的中斷申請資訊必須清楚 中斷回應 ( 從中斷到運作時間 ), 必須可預測並滿足功能要求 每次系統調整時間必須可以預測, 並且獨立於系統的物件數目 論述了微軟 Windows CE 作業系統是如何達到一個即時系統的要求, 更有意義的是,Windows CE 保證一個時間的上限, 它在收到中斷後開始一個即時的優先順序處理程序 微軟 Windows CE 被設計成針對小型設備 ( 它是典型的擁有有限記憶體的無磁片系統 ) 的通用作業系統 Windows CE 可以通過設計一層位於核心和硬體之間程式碼來用設定硬體平台, 這即是眾所周知的硬碟壓縮層 (HAL),( 在以前解釋時, 這被稱為 OEMC ( 原始設備製造 ) 適應層, 即 OAL; 核心壓縮層, 即 KAL ( 以免與微軟的 Windows NT 作業系統 HAL 混淆 ) 不像其他的微軟 Windows 作業系統,Windows CE 並不是代表一個所有平台適用的軟體 為了足夠靈活以達到適應廣泛產品需求, Windows CE 採用標準模式, 這就意味著, 它能夠由一系列軟體模式做出選擇, 從而使產品定制 另外, 一些可利用模式也可作為其組成部分, 這意味著這些模式能夠通過從一套可利用的組份做出選擇, 從而成為標準模式, 通過選擇, 能夠達到系統要求的最小模式, OEM 能夠減少儲存腳本和作業系統的運作 Windows CE 關於 VC 開發系統嵌入式工具檔案, 提供系統函式庫 工具 文本和樣本程式碼, 使 OEMS 能夠對特定的硬體平台做 Windows CE 標準定制 嵌入式工具檔案也包括設備驅動包 (DDK) 和軟體發展包 (SDK),DDK 提供了關於寫驅動器的附加文本,SDK 提供函式庫 標頭檔 樣本程式碼 文本以允許開發者對基於 Windows CE 的平台進行寫操作 Windows CE 提供了相同的程式介面, 以用來為其他的視窗作業系統開發功能, 例如,Windows CE 版本 1.01 支援大約 1000 個微軟的 Win 32 API 函數的其中 500 個, 這就意味著大量不同類的工具 第三方書籍, 關於 Win 32 開發者訓練教育, 可以替代或為 Windows CE 系統的開發者所用 即時系統的開發者能夠使用關於 VDFF 5.0 的嵌入式工具檔案, 以把作業系統轉移到特定的平台, 並為這個平台開發附加設備驅動器和即時功能 4

6 第一章 基礎篇 Windows CE 的應用領域 隨著嵌入式處理器的頻率不斷提高, 電池技術的改進以及 Windows CE 自身不斷的 改進以及原始程式碼的公佈,Windows CE 獲得了廣泛的應用, 概括起來大概以下幾個 方面 : 1)PDA 2) 智慧型手機 Intel PXA270+Windows CE5.0 是最好的智慧手機的解決方案 3) 工業控制 Windows CE 具有可靠的軟體 即時的回應 操作的易用性 它降低了產品生存 週期的各個階段的成本, 並且縮短的研發週期, 被證明是工業控制領域的一種 典型手段和很好的選擇 4) 消費性電子 消費類電子基本上都是使用 Windows CE 作業系統, 像機上盒,PMP( 攜帶型媒 體播放器 ),GPS 等等 下面是 2004 年 11 月, 對 wince 和 linux 在各個領域使用的比較分析 近年來隨著嵌 入式處理器技術的改進以及電池使用壽命的延長,Windows CE 在各個領域獲得的應用 都有很大的提高 Category Windows embedded device Linux embedded device PDAs Handhelds Moblile &VoIP phones Robots N 9 Audio&Vedio device 8 36 Thin clients & 19 N Terminals Tablets&Webpads 28 9 Gateways,servers&APs N 31 Other Total

7 DMA270 WinCE 5.0 操作流程 1-2 Windows CE 結構分析 Microsoft Windows CE 是一個簡潔的, 高效率的多平台作業系統 它不是削減的 Windows95 版本, 而是從整體上為有限資源的平台設計為多工, 完整優先權, 多執行緒的作業系統 它的模組化設計允許它從掌上型電腦到專用的工業控制器的用戶電子設備進行定制 Windows CE 的常規函數提供系統設計者以模組化的作業系統, 這個作業系統可以為特殊的產品進行定制 作業系統的基本核心需要至少 200K 的 ROM 設計成能夠在廣闊的平台上運作 支援 Win32 API 的應用程式介面, 同時提供熟悉的開發模式和工具 支援多種的用戶介面硬體, 包括可以達到 32bit 像素顏色深度的彩色顯示器 支援多種的串列和網路通訊技術 支援 COM/OLE,OLE 自動操作, 和其他的近程間通訊的先進方法 反過來, 許多模組被分割成更小的部分, 這些小部分允許模組自身被定制 定制包括選擇一套支援需要設備的模組和部分, 並且省略那些不需要的 OEMs 必須也執行 OEM Adaptation Layer (OAL), 作為在核心和設備硬體及所需的任何內部的設備驅動程式之間的介面 下圖是 windwos CE OS 的整個體系結構 6

8 第一章 基礎篇 這裡主要有下面幾個模組 : 1) 核心模組 kenel, 支援像處理程序和執行緒調度及記憶體管理這樣的的基本服務 2) 檔案系統模組, 支援持久穩固的資訊儲存, 管理各種檔案系統結構 3) 圖形視窗和事件子系統模組, 控制圖形和 windows 相關的外貌, 實現和管理 Windows 訊息機制 4) 設備管理模組 設備管理模組的主要功能是 : 載入和管理設備 ; 在啟動階段, 使用註冊表去載入設備 ; 提供標準的介面 5) 通訊模組, 實現網路通訊, 提供通訊介面 它的體系結構如下 : 還有一些可以被加上用來支援, 例如管理可安裝設備驅動程式或者支援 OLE/COM 的任務 7

9 DMA270 WinCE 5.0 操作流程 1-3 Windows CE 的處理程式 / 執行緒管理和調度 1)Windows CE 的處理程序描述 在 Windows CE 中的處理程序不同於 Windows 98 或者 Windows NT 中的處理程序, 最重要的一點是,Windows CE 最多只支援 32 個處理程序在系統中同時運作, 系統啟動時, 將最少預設啟動下面幾個處理程序 : NK.exe 用來提供核心服務 FileSys.exe 提供檔案系統服務 GWES.exe 提供圖形系統的支援 Device.exe 載入和管理設備驅動程式 Windows CE 系統啟動後, 它們佔用前幾個 Slot, 形像的描述請看下圖 : Windows CE 最多支援 32 個處理程序, 每個處理程序放在一個 Slot 裡, 每個 Slot 的大小是 32M Slot0 存放當前正在運作的處理程序 Slot1 存放 XIP DLLs, 所謂 XIP 就是就地執行的意思, 像 Coredll.dll 等等 8

10 第一章 基礎篇 2) 執行緒和執行緒優先權級 Windows CE 是有優先順序的多工作業系統, 它允許多重功能 處理程序, 在相同時間系統中運作 Windows CE 支援最大的 32 位元同步處理程序 一個處理程序包括一個或多個執行緒, 每個執行緒代表處理程序的一個獨立部分, 一個執行緒被指定為處理程序的基本執行緒, 處理程序也能創造一個未定數目的額外執行緒, 額外執行緒實際數目, 僅由可利用的系統資源限定 Windows CE 利用基於優先順序的時間片段演算法以安排執行緒的執行,Windows CE 支持八個不同的優先順序, 由 0 到 7,0 代表最高級, 它在標頭檔 Winbasw.h 中定義 優先順序描述 0 ( 最高級 ) 關鍵的執行緒優先順序 ( 最高優先等級 ) 1 最高執行緒優先順序 2 高於普通的執行緒優先順序 3 普通執行緒優先順序 4 低於常規執行緒優先順序 5 最低執行緒優先順序 6 高於 IDLE 的執行緒優先順序 7 IDLE 執行緒優先順序 ( 最低 ) ( 最低優先順序 ) 級別 0 和 1 通常做為即時過程和設備驅動器, 級別 2-4 做為執行緒和普通功能, 級別 5-7 做為是低於其他功能級別, 注意級別 6 是目前狀態並有穩定連接 優先權唯一的取決於執行緒優先順序, 擁有高級優先權的執行緒安排優先運作, 同一優先順序的執行緒, 以迴圈優先級方式運作, 即每個執行緒接受定制的時間或時間片段, 定量時間預設值為 25 毫秒 (Windows CE 2.0 支援在 MIPS 平台更改定量時間 ) 較低優先權的執行緒, 要直到較高級執行緒完成之後再運作, 也就是直到他們完成或者放棄或停止 一個重要的例外是最高優先順序的執行緒 ( 級別 0, 關鍵時間優先順序 ) 不與其他的執行緒共用時間片段, 這些執行緒連續執行直到他們完成 不像其他的微軟窗作業系統,Windows CE 是固定不能改變, 它不匹配這引進優先順序的中斷, 他們能夠暫時改動, 但僅能通過 Windows CE 核心以避免所謂的的 優先權倒置 " 優先權倒置指的是當它們同時競爭同一資源時, 低優先順序的執行緒, 阻礙了高 9

11 DMA270 WinCE 5.0 操作流程 優先權執行緒對資源的利用 為了改正這種局面並解放較高優先權的執行緒,Windows CE 允許低級優先權繼承, 嚴格的執行緒優先權, 並且運作較高優先順序直到它釋放所用資源 例如, 如果一個執行緒在最高優先權運作試圖獲取由低級優先權佔有的互斥體, 低級優先權的執行緒變成高級優先權, 並且運作直到它釋放互斥體 優先權倒置適用於系統的所有執行緒 例如, 甚至在優先順序別 1 運作的核心執行緒能轉成級別 0, 如果優先順序 0 執行緒運作記憶體分頁程式碼, 將引起區塊失誤 基於優先順序的多工設計, 保證運作在最低級的執行緒在一個預所知時間段執行 在後面討論設定響應, 對於指定的平台和公式, 並由其他的平台獲取數位 在 DAK 和 SDK 的工具, 顯示了執行緒狀態和優先順序別, 並描繪指定即時系統操作輪廓 3) 執行緒同步即時系統必須保證處理程序和執行緒同步, 例如, 如果即時應用的一部分在另一部分獲得最多當前資料前即完成, 此應用的管理處理程序可能不穩定, 同步將確保在應用執行緒間交換正確 如同其他的 Windows 作業系統一樣,Windows CE 為執行緒同步提供了一個豐富的 等待物件 ", 這包括關鍵部門 事件 互斥體, 些等待物件, 允許一個執行緒減緩它的運作並且等待直到指定事件發生 Windows CE 將互斥體 關鍵部分 事件請求按 先入先出, 優先順序 (FIFO)" 順序排列 : 不同的先入先出順序序列定義成八個不同的優先順序, 在給定的優稱級的執行緒請求, 將被放在優先順序列表末尾, 當優先順序倒置出現時, 調度程式調整這些序列 除了等待物件,Windows CE 支援標準的 Win 32 時間 API 函數, 這些來自核心的應用, 軟體中斷將獲得時間間隔, 它被用來管理即時應用 通過調整 GetTickCont 函數, 它能夠返回幾毫秒, 執行緒能夠使用系統間隔時間 關於更詳細的分時資訊, Windows CE 核心也支援 Win 32 API 函數 QueryPerformanreCounter 和 QueryPerFormanteFrequency OEM 必須為這些調整提供硬體和軟體支援, 它提供一個較高的時間分辨力和 OAL 介面其他方面 4)Windows CE 的調度 Windows CE 是一個可搶佔的多工的作業系統, 它採用基於優先順序的時間片段輪循的方法 執行緒是調整的基本單位, 執行緒運作在一個固定的時間片段 : Windows CE 將執行緒按照執行緒的狀態, 可運作佇列 就緒佇列 等待佇列等等 10

12 第一章 基礎篇 可運作的執行緒處於一個可運作的佇列中 ( 對每一種優先順序, 都對應一個可運作佇列, 所以最多有 256 個可運作佇列 ); 等待佇列被阻塞在臨界區外 基於優先順序的時間片段輪循的調度如下 : 當前的運作執行緒的時間片段用完後, 如果這個執行緒不是跟時間臨界有關的, 執行緒系統調度策略會把它排到相對應的就緒佇列的末尾, 然後再讓等待佇列中優先順序最高的執行緒運作 ( 注 : 此執行緒的優先順序應該和剛剛用完時間片段的執行緒具有相同的優先順序 否則, 如果有優先順序更高, 它會搶佔前一個運作的執行緒, 如果優先順序低, 前一個用完時間片的執行緒會繼續運作 ) 在 Windows CE 系統中, 一般設定的時間片段為 10ms( 這個時間片可以通過 OEM 廠商開發的不同硬體來設定 ) 5) 其他方面考慮 Windows CE 提供了一個重要的儲存系統, 例如, 當目前某些運作 Windows CE 的平台提供 4MB 的實體記憶體,Windows CE 支援一個重要的 2GB 的位址空間, 每個處理程序連接在它自己的 32MB 物理空間上, 當它需要產生記憶體分頁中斷 ( 這可能影響執行緒執行時間 ), 實體記憶體進行執行緒程式碼或資料記憶體分頁 記憶體分頁輸入輸出, 將比即時處理程序優先順序低 在即時處理程序中記憶體分頁仍可自由出現, 但這要確保後台的實際記憶體管理贏得即時系統優先權 即時執行緒應該鎖存在記憶體中, 以防止這些無關緊要的記憶體分頁阻礙其運作, 它們可能會佔用實際記憶體管理系統 Windows CE 允許映像檔, 這將阻止多個處理程序共用同一實體記憶體, 結果將會導致協同處理程序間或驅動器與映像檔快速的資料傳送, 記憶體映像檔能夠戲劇性的增強即時操作 11

13 DMA270 WinCE 5.0 操作流程 1-4 Windows CE 的記憶體管理 Windows CE 記憶體結構 1) Windows CE 為每個應用程式提供 2G 的虛擬位址空間, 前 1G 被劃分成 32 個 32M 的槽 (Slot)., 其具體的分配方式見下圖 其中第一個槽由當前用戶程式使用, 其最初的 64K 空間由系統保留 其餘的 31 個槽 (1~31), 每個只能包含一個處理程序, 當這個處理程序的狀態為運作狀態的時候, 這個槽被映像檔到 Slot0 Slot1 存放共用的 DLLs, 像 coredll.dll 等 Slot0 和 Slot1 的結構如下 : 12

14 第一章 基礎篇 2) 系統保留虛擬位址從 0xC 開始的 16MB 的空間, 作為系統的資料結構所使用的空間 這段空間成為安全虛擬位址空間 其餘的最高位元為 1 的虛擬位址空間則為系統保留的物理位元位址空間, 將最高位置 0 則得到實際的物理位元位址 在 DMA-PXA270 開發板的 BSP 裡, 核心記憶體映像檔如下 : 13

15 DMA270 WinCE 5.0 操作流程 Windows CE 的記憶體層次結構 1) 實體記憶體由系統統一管理的實體記憶體由一個空閒鏈表維護, 而這個鏈表所需要的記憶體空間則是用虛擬位址映像檔到系統預留的區域中 系統在初始化後就開始啟動分頁機制, 然後通過一個簡單的位址映像檔分配鏈表所需要的記憶體資源 2) 虛擬記憶體 WINDOWS CE 採用分頁式虛擬記憶體 在 WINDOWS CE 中, 頁面大小或者是 1024 位元組或者是 4096 位元組, 這取決於所使用的微處理器,WINDOWS CE 體系結構的首選頁面大小是 1KB 這種變化來自 WINDOWS NT, 在這種系統中, 對於 INTEL 微處理器來說頁面大小是 4096 位元組, 而對於 DEC Alpha 微處理器來說是 8192 位元組 虛擬頁面可以處於三種狀態 : 空閒 " 保留 " 提交 " 顧名思義, 空閒頁面是自由而可分配的 保留頁面是已被保留的頁面, 這樣作業系統或處理程序中的另一個執行緒就不能分配其虛擬位址 保留頁面不能在其他地方使用, 但它同樣也不能由應用程式使用, 因為它沒有被映像檔到實體記憶體中 要映像檔頁面, 該頁面必須被提交 提交頁面是應用程式保留的頁面, 必須已經映像檔到一個物理位元位址 3) 邏輯記憶體在用戶可見的記憶體空間中, 極少情況需要用戶直接以頁為單位進行記憶體管理, 系統在虛擬記憶體之上提供了邏輯記憶體的管理, 用戶可以免去複雜的頁的分配和回收 像程式中使用的新分配的記憶體, 都屬於這一種 Windows CE 32 位元虛擬位址的劃分用戶狀態下的虛擬位址是 31 位元的 ( 最高位為 0), 共有 2GB 的虛擬位址空間, 劃分為 64 個 32M 的區段 (section)(bit 30~bit 25), 每個段劃分為 512 個 64K 的區塊 (bit 24~bit 16), 每個區塊劃分為 16 個 4K 的頁 (bit 15~bit 12). 如下圖所示 : 0 區域標 區塊標識 頁標識 頁面偏移位址 3 識

16 第一章 基礎篇 1-5 Windows CE 的儲存管理 儲存管理概述 Windows CE 提供了三種類型的檔案系統 : 基於 RAM 的檔案系統 基於 ROM 的檔案系統 以及用於支援 ATA(Advanced Technology Attachment) 設備和 SRAM 卡等週邊儲存設備的 FAT 檔案系統 其中, 前兩種檔案系統屬於 Windows CE 的內部檔案系統, 後者屬於可安裝檔案系統 另外, 也可以編寫自己的檔案系統並在註冊表中註冊使用 不過, 不論儲存設備屬於何種類型, 所有對檔案系統的取用都是通過 Win32 API 完成的, 實現 Windows CE 設備無關的檔案取用 Microsoft Windows CE.net 預設使用 RAM 儲存設備, 被稱為物件儲存 (object store), 物件儲存包含三部分 : 檔案系統 資料庫以及系統註冊表, 不過檔案系統註冊表以及資料庫不一定要留在物件儲存裡, 它可以存放在 ROM 裡或是週邊儲存設備中 這樣即使系統掉電後, 註冊表檔案系統以及資料庫的資料不丟失 記憶體管理像硬碟 CF 卡等儲存設備在 Windows CE 中屬於週邊儲存設備, 對這些週邊儲存設備以及它們使用的檔案系統和區塊設備驅動程式的管理都是由儲存管理器負責的 儲存管理器的功能由系統中的 fsdmgr.dll 模組實現的, 它包含區塊設備驅動程式管理器 分區管理器以及檔案系統驅動程式管理器 Windows CE 下儲存管理器的體系結構如下 : 15

17 DMA270 WinCE 5.0 操作流程 從圖可以看出, 儲存管理器是一個分層結構, 一次完整的磁片 I/O 操作必需經過儲存管理器的各個層 首先到達的是篩檢程式層, 它的功能是加密 壓縮和病毒掃描等工作 之後到達的是檔案系統驅動程式, 檔案系統驅動程式層對參數進行格式化, 將檔案名轉換為區塊設備驅動程式可以識別的設備位址 在這之後, 就可以經分區管理器或直接交由區塊設備驅動程式完成最終的 I/O 操作 檔案系統驅動程式的作用是向用戶提供一個按名取用的檔案系統介面, 它建立在區塊設備驅動程式之上, 完成了對區塊設備驅動的進一步抽像, 把毫無規律的資料區塊組織成檔案, 提供檔案操作的函數介面 Windows CE 支援大多數 Windows 桌面平台上使用的檔案 I/O 函數, 比如 CreateFile ReadFile WriteFile 和 CloseHandle 等 Win32 API 同時,Windows CE 仍然遵循使用控制碼對檔案進行取用的方法 分區驅動程式管理, 管理儲存設備的分區, 並負責分區的裝載和卸載,Windows CE 可以同時支援多個分區驅動程式, 但是對一個指定的儲存設備來講只能使用一個分區驅動程式, 由它解釋設備上的所有分區 區塊設備驅動主要是提供對儲存設備的分區塊操作, 區塊的大小一般是固定的, 常用的是 512 位元組 1KB 位元組 2KB 位元組和 4KB 位元組 區塊設備驅動程式向上 16

18 第一章 基礎篇 層輸出一個流介面, 應用程式通過 CreateFile 和 ReadFile 這些標準的檔案系統 API 對區塊設備進行取用 1-6 Windows CE 的設備管理 設備管理器是 Windows CE.Net 設備管理的核心機構, 它主要負責跟蹤 維護系統的設備資訊並對設備資源進行調配 ( 在 %WINCEROOT%\PRIVATE\WINCEOS\COREOS \DEVICE\LIB 裡可以看到 Windows CE 設備管理器的程式碼 ) 設備管理器在 Windows CE 中主要表現為 Device.exe 的文件,Device.exe 在系統啟動的時候通過註冊表裡面的 HKEY_LOCAL_MACHINE\Init\"Launch20"= Device.exe" 載入 (Windows CE 啟動時分別執行 [HKEY_LOCAL_MACHINE\init] 按下所有子鍵列出的程式 ) 設備管理器是用戶級別的程式, 在基於 Windows CE 的平台上在不停地運作著 設備管理器雖然不是核心的一部分, 但是它是與核心 註冊表和介面驅動程式有相互影響的單獨部分 設備管理器完成以下任務 : 1) 在系統啟動時或收到用戶添加週邊設備的資訊時初始化驅動程式的載入 2) 向核心註冊特定的檔案名稱, 該檔案名稱把應用程式使用的 I/O 函數映像到介面驅動程式的那些函數實現 3) 通過從週邊設備獲得隨插即用標示符號, 或啟動一個檢查副程式來發現可以處理該設備的驅動程式, 為週邊設備找到合適的驅動程式 4) 通過讀寫註冊值載入跟蹤驅動程式 5) 當不再需要設備時, 負責卸載驅動程式 在系統啟動時初始化驅動程式的載入 載入驅動程式有三種方法 第一種載入類型是在系統啟動的時候進行的 當 Winows CE 的平台啟動的時候, 啟動設備管理器 設備管理器從註冊表的 HKEY_LOCAL_MACHINE\Drivers\RootKey 下面載入進入點, 通常 RootKey 的值都被設定為 Drivers\BuiltIn 然後設備管理器通過 \RootKey 提供的進入點開始讀取 HKEY_LOCAL_MACHINE \Drivers\Builtin 的內容, 並載入已列出的介面驅動程式 第二種載入的類型是在設備管理程式自動檢測週邊設備設備與 Windows CE 平台的連接時進行的 PC 卡是自動檢測設備最常見的類型, 因為在用戶插入 PC 卡時,PC 卡插槽控制程式就通知 Windows CE 在用戶把 PC 卡插入插槽時, 設備管理程式調整槽驅動程式 ( 這是一個內部設備管理程式 ) 尋找隨插即用標示符號 然後, 設備管理程式檢查 HKEY_LOCAL_MACHINE\Drivers\PCMCIA 已得到與隨插即用標示符號所匹配的子 17

19 DMA270 WinCE 5.0 操作流程 鍵 如果有一個子鍵存在, 該子鍵就載入鍵值列表裡的這個驅動程式 如果沒有匹配的子鍵, 設備管理器就調整 HKEY_LOCAL_MACHINE\Drivers\PCMCIA\Detect 中列表的所有偵測函數 如果有一個函數返回一個值, 那麼設備管理程式就載入並初始化那個介面驅動程式 第三種載入類型是當設備管理器程式不能夠自動檢測或載入某一種驅動程式的時候, 一般這種情況大多數出現在串列設備上, 因為 Windows CE 不能自動檢測到串列設備 這個時候的可以使用系統提供的函數 ActivateDeviceEx 函數來載入驅動程式 下面介紹一下 ActivateDeviceEx 這個函數 ActivateDeviceEx 用於載入驅動程式, 事實上 Windows CE 的實現通過 StartOneDriver 函數把一個具體的驅動程式連接到系統中的, 不過這個函數是一個純粹的內部函數 它的實現是通過 ActivateDeviceEx 來實現的 在 PB 的 %WINCEROOT%\PRIVATE\WINCEOS\ COREOS\DEVICE\LIB\ 目錄下的檔案 device.c 中可以找到 ActivateDeviceEx 函數的實現 它的程式碼部分如下 : HANDLE FS_ActivateDeviceEx( LPCTSTR lpszdevkey, LPCREGINI lpreg, DWORD creg, LPVOID lpvparam ) { DEBUGMSG(1, (TEXT("DEVICE!ActivateDeviceEx(%s) entered\r\n"), lpszdevkey)); CELOG_ActivateDevice (lpszdevkey); return StartOneDriver( lpszdevkey, MAX_LOAD_ORDER, lpreg, creg, lpvparam); ActivateDeviceEx 的函數很簡單它只是負責調整 StartOneDriver 這個函數 這個函數將根據註冊表設定來初始化不同的設備驅動 在系統剛開始運作的時候 Device.exe 就是調整這個函數來載入相應的驅動程式的 這個函數將引起一個特定的驅動載入過程 先介紹一下 StartOneDriver 的運作過程 18

20 第一章 基礎篇 { DEBUGMSG(1, (TEXT("DEVICE!ActivateDeviceEx(%s) entered\r\n"), lpszdevkey)); CELOG_ActivateDevice (lpszdevkey); return StartOneDriver( lpszdevkey, MAX_LOAD_ORDER, lpreg, creg, lpvparam); ActivateDeviceEx 的函數很簡單它只是負責調整 StartOneDriver 這個函數 這個函數將根據註冊表設定來初始化不同的設備驅動 在系統剛開始運作的時候 Device.exe 就是調整這個函數來載入相應的驅動程式的 這個函數將引起一個特定的驅動載入過程 先介紹一下 StartOneDriver 的運作過程 19

21 DMA270 WinCE 5.0 操作流程 20

22 第二章 實戰篇 第二章實戰篇 這一章節主要介紹 Windows CE 驅動和應用的開發, 以及一些輔助工具的使用 2-1 WINCE 的安裝以及 WINCE 專案的建立和編譯 安裝開發環境為了建立 WINCE5.0 的應用開發環境, 您需要準備好由微軟公司發佈的兩張 PB (Platform Builder 5.0) 安裝光碟, 這兩張光碟分別被命名為 PB5-A, PB5-B 這兩張光碟包含了微軟公司的 Windows CE.NET 5.0 作業系統安裝程式, 以及把作業系統編譯移植到指定目標硬體平台的工具 - 平台建立器 (Platform Builder 5.0) 下面介紹如何從這兩張光碟安裝 WINCE5.0 作業系統和 Platform Builder 5.0 首先將兩張光碟的內容全部複製到同一個目錄下, 例如 :D:\PB5SET 運作 SETUP.EXE, 輸入序號, 在出現安裝選項時選擇 ARMV4I( 如下圖 ) 21

23 DMA270 WinCE 5.0 操作流程 安裝結束時,WINCE 目錄有 3.5G 左右的檔案 然後將 Windows CE5.0 的 BSP, 即 Berrydale 檔案夾複製到 C:\WINCE500\PLATFORM 目錄下 安裝目錄前面已經安裝了平台建立 Platform Builder 5.0 以及將 BSP 開發工具放到 platform 目錄下了, 下一步, 要運作 Platform Builder, 並對它進行一系列的設定, 目的是為編譯 WINCE5.0 作業系統映像檔做好準備 用滑鼠按下 PB 主選單 File" 下的 Manage Catalog Features" 子選項, 如下圖 : 22

24 第二章 實戰篇 您可以看到如下圖所示的 Platform Builder 裡的.CEC" 文件 選擇 "Import" 將 BSP 檔案 Berrydale 的 Berrydale.cec 檔案導入, 步驟如下 : 點選 Import" 按鈕後, 跳出對話方塊, 要求選擇 cec 檔, 將檔案對話方塊上面的尋找範圍定位到 C:\WINCE500\PLATFORM\Berrydale, 如下圖 : 23

25 DMA270 WinCE 5.0 操作流程 選擇 Berrydale.cec, 用滑鼠按下 開啟 " 按鈕 最後會在 catalog 裡顯示出選中的 CEC 檔, 用滑鼠按下 OK 退出 導入之後, 在 PB 的的整合開發環境的 Catalog 視窗下, 能看到新加入了一個 "Third Party" 目錄, 用滑鼠按下打開 Third Party" 目錄, 能看到剛才加入的 BSP 檔, 如下圖 : 24

26 第二章 實戰篇 25

27 DMA270 WinCE 5.0 操作流程 建立新的平台 編譯 用滑鼠按下 PB 主選單 File" 下的 New Platform" 子選項, 如下圖 : 將會出現 New Platform Wizard Step 1" 框, 用滑鼠按下 Next" 按鈕 : 26

28 第二章 實戰篇 輸入新建立專案名稱, 以及選擇專案存放的目錄 專案存放在 C:\WINCE500\ PBWorkspaces 目錄下, 你可以通過用滑鼠按下 Browese 按鈕, 改變專案存放路徑 如下圖 : 注意 : 命名專案時, 不要使用中文名稱 選擇平台使用的 BSP, 然後再用滑鼠按下 NEXT, 上面我們加入的平台叫 Berrydale-ARMV4I, 請將 Berrydale-ARMV4I 選上, 如下圖 : 27

29 DMA270 WinCE 5.0 操作流程 選擇平台類型為 Mobile Handheld, 用滑鼠按下 NEXT, 如下圖 : 28

30 第二章 實戰篇 選擇一些想要加入編譯的應用程式後, 再用滑鼠按下 NEXT, 如下圖 : 然後設定網路和通訊, 根據自己需要, 選擇需要支援的網路和通訊,windows CE 支援的網路和通訊包含有 : 有線區域網, 無線網路以及紅外線 藍芽等等, 具體的可以將目錄展開, 瞭解支援的網路和通訊功能, 如下圖 : 29

31 DMA270 WinCE 5.0 操作流程 再用滑鼠按下 "Next" 按鈕, 出現以下的對話方塊 30

32 第二章 實戰篇 最後用滑鼠按下 Finish 完成平台設定 下一步設定平台, 用滑鼠按下 PB 的 Platform Setting 選單, 如下圖 : 在跳出的 Platform Settings" 設定框的 Build Options" 標籤頁, 更改設定選項如下 : 31

33 DMA270 WinCE 5.0 操作流程 32

34 第二章 實戰篇 最後在 PB 的 Build 下拉選單裡選擇 Build and Sysgen 執行平台編譯 編譯完成後, 您就有了 PXA270 的二進位的 image: nk.bin" 和 nk.nb0", 一般而言, 這兩個檔位於編譯平台時產生的檔案夾 C:\WINCE500\PBWorkspaces\dma270\RelDir\Berrdale_ARMV4I_Release" 參照下面一個章節, 通過 EBOOT 將 NK.BIN 下載到目的機器上運作, 驗證選擇的平台支援的功能 注 : 如果 DMA-pxa270 提到支援的功能, 在你編譯出來的 OS 映像檔案 ( 即 NK.BIN) 不支持的話, 可能是你漏選 feature 了 33

35 DMA270 WinCE 5.0 操作流程 2-2 Eboot 的燒錄以及通過 Eboot 下載啟動 燒錄 EBOOT EBOOT 是 wince 作業系統的引導程式, 如果我們要在 YL-PXA270 教學平台上下載運作或者燒錄 WINCE 作業系統映像檔, 我們就需要首先燒錄 EBOOT 到板子的 Nor Flash 的引導分區塊上. 在前面, 我們說到如果成功編譯了 PXA270 教學平台的 BSP 的話, 會在 dma270\reldir\berrydale-armv4irelease 目錄下可以找到產生的 EBOOT.nb0 檔, 我們需要把這個檔燒錄到板子的 Nor Flash 的引導分區上! 下面介紹燒錄 EBOOT 的過程 在使用並列 JTAG 傳輸線燒錄 FLASH 前應在 PC 上先安裝好 giveio.sys 的驅動, 安裝方法見光碟 utils 檔案夾裡面的 如何安裝 givoio.sys 裡的說明 關閉底板電源, 用 20PIN 排線連接核心板的 JTAG(20PIN 插針 ) 和底板的 210PIN 插針, 用 20PIN 排線連接 SUPERJTAG 板的 JP3( 比較短的那ㄧ條線 ) 和底板的 JTAG, 並將線連接 SUPERJTAG 板, 確保各線連接可靠 打開底板電源, 在 PC 上執行光碟所帶的 JFlashmm.exe bulbcx EBOOT.nb0, 其中 JFlashmm.exe 程式位於光碟的 \utils\jflash_27x 目錄, 執行成功會出現以下提示 : 34

36 第二章 實戰篇 最後顯示校驗成功則表示燒錄完成了, 然後關閉電源, 拔掉排線 如果連接有問題, 會出現下面的提示資訊 35

37 DMA270 WinCE 5.0 操作流程 啟動 EBOOT 在 wince5.0 下, 全功能串列埠 (P3) 作為調整串列埠使用 用交叉串列線連接 PC 串列埠和 DMA-PXA270 底板的全功能串埠 (P3), 在 PC 上啟動 DNW 程式, 設定好和開發板串列埠連接的參數 36

38 第二章 實戰篇 再啟動串列埠連接 連接成功後在下圖滑鼠所指處會顯示連接的串列埠和串列傳輸速率 37

39 DMA270 WinCE 5.0 操作流程 打開底板上的電源開關, 或在已開電源情況下按一下底板上的 RESET 鍵, 可以在超級終端裡看到 EBOOT 的啟動資訊 38

40 第二章 實戰篇 這時應按下空白鍵 (SPACE) 進入 EBOOT 設定選項視窗, 如下圖 : 在 EBOOT 設定選項視窗裡可以設定 IP 位址 ( 網路下載 WINCE 用 ) 啟動延遲 是否在啟動時自動下載 WINCE 映像檔 下載 WINCE 映像檔使用介面順序等, 下載並運作 WINCE 映像檔下載運作 WINCE 映像檔的方法是通過 EBOOT 的網路下載功能來完成的, 所以下載映像檔之前必須先用交叉網路線連接 PC 的網卡和教學平台的 100M 網卡 (JP1 介面 ) 接著我們運作 EBOOT, 在板子已經燒錄了 EBOOT 之後, 我們首先給板子重置或者重新送電以啟動 EBOOT, 在 DNW 或者超級終端裡看到 Press [ENTER] to launch image stored in flash or [SPACE] to cancel." 的提示資訊後按下 Space( 空格 )" 鍵, 這時進入到 EBOOT 的配置選項功能表介面中,( 如下圖 ) 39

41 DMA270 WinCE 5.0 操作流程 然後我們按順序進行如下配置 : (1) 按 0" 鍵設定板子的 IP 位址, 例如設定 IP 位址為 (2) 按 1" 鍵設定子網路遮罩, 一般設為 (3) 按 3" 鍵設定 DHCP 為 Disable", 即出現 3) DHCP: Disabled" 的語句 (4) 按下 6" 鍵設定 Program RAM image into FLASH" 為 Disabled, 即出現 6) Program RAM image into FLASH (Disabled)" 的字樣 注 : 設定時, 保證目標板的 IP 位址和主機的 IP 位址在同一個網域 以上各步驟完成後的配置介面如下, 接著進行下一步 40

42 第二章 實戰篇 (6) 按下 D" 鍵開始下載 WINCE 映像檔 按下 D" 鍵之後板子會向 PC 發出 BOOTME 的請求, 這時我們就需要運作 PB 程 41

43 DMA270 WinCE 5.0 操作流程 式, 打開 PXA270 專案, 在 PB5.0 的 Target 下拉選單裡設定遠端連接, 分別設定 Download 和 Transport 為 Ethernet 模式, 選擇 Download 右側的 Setting 按鈕, 選擇遠端目標, 連接成功的話會有下面的顯示, 選中發現的目標再按 OK 退出 42

44 第二章 實戰篇 返回遠端連接配置視窗後再按確定退出 43

45 DMA270 WinCE 5.0 操作流程 再選擇 PB5.0 的 Target 下拉選單裡的 Download 發送 NK.BIN 檔案到目標板上 下圖為發送時的進度顯示視窗 開發板下載 WINCE 映像檔案結束後, 會自動運作 44

46 第二章 實戰篇 這時我們就可以在教學平台的 LCD 螢幕上看到 WINCE5.0 作業系統運作起來了 如果需要永久燒錄程式於 flash 的話, 請把選項 6) Program RAM image into FLASH: (Enabled) 設為 (Enabled), 如下圖 並重複上述的燒錄方式即可, 燒錄完畢之後把選項 5) Download new image at 45

47 DMA270 WinCE 5.0 操作流程 startup, 設為如下 5) Launch existing flash resident image at startup, 這樣一開機即可進入 WINCE 2-3 embedded Visual C++ 的安裝和專案的建立 embedded Visual C++ 介紹 embedded Visual C++ 是 Windows CE.NET 的應用程式開發工具 利用 embedded Visual C++, 能夠開發 Windows CE 的應用程式, 並能取用詳細的平台軟體發展工具檔案文件檔 embedded Visual C++ 的安裝 在提供的光碟裡, 找到 EVC 目錄, 用滑鼠雙擊 setup.exe 檔, 出現 embeded Visual C++ 安裝程序, 如下圖 : 用滑鼠按下一步, 出現如下介面, 選擇接受許可協定 : 46

48 第二章 實戰篇 安裝程序的下一步如下, 請求輸入序號 47

49 DMA270 WinCE 5.0 操作流程 輸入序列號後, 用滑鼠按下一步, 進入下面介面 : 48

50 第二章 實戰篇 選用 EVC 的設定, 用滑鼠按下一步, 開始安裝 EVC 安裝完 EVC 後, 請安裝 EVC\evc4sp3\DISK1 下的 SDK, 只有安裝 SDK 後,EVC 才能使用和開發應用程式 embedded Visual C++ 專案的建立 embeded Visual C++ 安裝成功後, 啟動 embeded Visual C++, 在 File 功能表下, 選擇 new, 新建一個專案, 如下圖 : 49

51 DMA270 WinCE 5.0 操作流程 新建專案時, 可以選擇如下幾種應用類型, 常用的是 WCE Application 和 WCE MFC AppWizard(exe), 實驗都是使用的 WCE Application 選擇好應用類型後, 再在 CPUs 欄選擇 CPU 的類型,YL-PXA270 教學實驗平台使用的是 WCE ARMV4I, 所以應用的 CPU 類型一定要選擇 WCE ARMV4I 如下圖: 50

52 第二章 實戰篇 選擇應用類型和 CPU 類型以及專案名稱和存放位置後, 用滑鼠按下 OK", 出現如下介面, 這裡主要是選擇應用的視窗類型, 在這裡我們選擇 A Typical Hello World" Application, 這樣專案運作後, 你會看到在視窗裡顯示 Hello World 的字樣 選好視窗類型後, 用滑鼠按下 Finish, 專案建立完成, 安裝如下圖設定編譯環境, 編譯專案 51

53 DMA270 WinCE 5.0 操作流程 2-4 在 WINCE 和桌面系統之間建立通訊連接 可以使用微軟公司提供的一些工具, 並在進行了一些必要的設定後, 就可以在安裝了 WINCE 作業系統的移動設備和 windows 桌面系統之間進行通訊連接, 從而可以實現檔案上傳下載, 遠端調整等功能 使用微軟 ActiveSync 同步傳輸工具進行通訊連接首先下載 ActiveSync 工具的安裝程式 MSASYNC.EXE( 這個工具可以單獨從網路上下載 ), 安裝 運作 然後開始對 ActiveSync 進行設定, 用滑鼠按下功能表 File -> Connection Settings, 在跳出的設定對話方塊中, 選擇允許通過 USB 乙太網路路進行通訊連接, 串列埠就不用選擇了, 以免同 DNW 衝突 如下圖所示 : 52

54 第二章 實戰篇 ActiveSync 可以通過串列埠 USB 網路等方式建立連接,YL-PXA270 預設為 USB 連接 在 WinCE 系統啟動後再連接上桌面系統的 USB 和 PXA270 的方形 USB 間的 USB 傳輸線, 稍等片刻, 桌面系統上提示已經連接上設備 注 : 如果沒有連接成功, 請按如下步驟檢查 : 1) 檢查 USB 傳輸線是否有問題 2) 檢查 USB 埠是否有問題 3) 檢查該 OS 映像檔是否選擇了 ActiveSync" feature 確保上述都沒有問題, 如果還是連不上設備, 則按開發板上的 E" 鍵, 啟動一下 windows CE 連接成功後,ActiveSync 的圖示會變成另外一種顏色, 並且提示連接成功 這時, 打開功能表 File -> Explore, 就可以瀏覽 WINCE 系統上的資源, 也可以通過複製 / 貼上的方式在系統之間複製檔案 ActiveSync 的成功連接是使用所有微軟遠端連接工具的基礎 在 ActiveSync 成功連接後, 就可以進一步使用到 PB 程式的 Tools" 功能表項裡面的許多遠端工具 例如用滑鼠按下 PB 的 Tools -> Remote zoom -> in 功能表, 以運作遠端圖片縮放工具, 這個程 53

55 DMA270 WinCE 5.0 操作流程 式可以實現對遠端移動設備顯示螢幕的縮小 Remote zoom -> in 程式運作起來後, 首先要配置一下平台管理器, 用滑鼠按下它的 Connection -> Configure windows ce platform manager 功能表, 如下圖 : 在跳出的對話方塊中添加一個新設備, 設備名可以取為 PXA270", 如下圖 : 54

56 第二章 實戰篇 設定 PXA270" 設備的屬性, 如下圖 : 用滑鼠按下 Transport" 下拉清單右邊的 Configure" 按鈕, 以設定 TCP/TP 傳輸的設定,HOST IP 一項填入您的桌面機器與 WINCE 相連的乙太網路卡的 IP 位址, 例如下圖 : 設定結束後, 確信您的網路線已經連好 PXA270 的網路和桌面機器的網路卡, 然後用滑鼠按下 Remote zoom -> in 程式的功能表 File -> New Bitmap, 開始進行螢幕縮小 如果用 EVC 或 EVB 編譯了自己編寫的 WINCE 應用程式, 並用滑鼠按下在 tools" 功能表的 Configure platform manager" 功能表項完成配置平台管理器後, 用滑鼠按下運作按鈕, 就可以自動把程式發送到板子上運作, 此外也可以利用 sync 工具的 explorer 將編譯好的程式上傳到 PXA270 上運作 以下是編寫的範例副程式 Hello" 在 PXA270 的 55

57 DMA270 WinCE 5.0 操作流程 WINCE5.0 作業系統上執行的結果, 如下圖 : 56

58 第三章 實驗篇 第三章實驗篇 3-1 實驗一 HELLO 應用程式實驗 實驗目的 1. 瞭解 WinCE 系統下應用程式的開發 2. 瞭解 WinCE 系統的訊息機制 實驗內容 1. 打開一個編譯好的 Hello World" 應用程式 2. 使用 embeded Visual C++ 新建一個 Hello World" 應用程式 3. 使用 embeded Visual C++ 編譯 Hello World", 並將產生的應用上傳到教學實驗平台上運作 實驗設備 1. YL-PXA270XP 教學實驗平台 2. PC 主機 3. 網路線 串列埠連接線 電源 實驗目的 Windows CE 的 WIN32 API 比其他的 32 位元的 Windows 作業系統的 WIN32 API 要小 ; 它只包括大約相當於 Windows NT 的半數的 API 但是 Windows CE 的 WIN32 API 也有其他系統所沒有的特性 例如 : 通知 API 它能夠在作業系統的層次, 而不是在運作 57

59 DMA270 WinCE 5.0 操作流程 的應用程式的層次上處理通知事件 ( 如時脈 ) 觸控螢幕的 API 和對 Windows CE 的資料庫的內部的支援是其他的作業系統所沒有的 觸控螢幕的 API 使用於觸控顯示器的螢幕校正和用戶交互的管理容易實現, 而資料庫的 API 提供了快速簡捷的取用 一般用途的資料庫的工具 另一個關於 Windows CE 的鮮為人知的方面是它的高度的模組化 ; 嵌入式系統開發者 ( 用 Microsoft Windows CE 內含的面向 Visual C++ 的套裝軟體 ) 能夠創建一個對於它們的獨特的硬體平台和應用軟體用戶化了的 Windows CE 的版本 程式碼 #include <windows.h> #include "helloce.h" // For all that Windows stuff // Program-specific stuff // // Global data // const TCHAR szappname[] = TEXT("HelloCE"); HINSTANCE hinst; // Program instance handle // Message dispatch table for MainWindowProc const struct decodeuint MainMessages[] = { WM_PAINT, DoPaintMain, WM_DESTROY, DoDestroyMain, ; //====================================================================== // Program entry point // int WINAPI WinMain (HINSTANCE hinstance, HINSTANCE hprevinstance, LPWSTR lpcmdline, int ncmdshow) { MSG msg; int rc = 0; HWND hwndmain; 58

60 第三章 實驗篇 // Initialize this instance. hwndmain = InitInstance (hinstance, lpcmdline, ncmdshow); if (hwndmain == 0) return 0x10; // Application message loop while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage (&msg); DispatchMessage (&msg); // Instance cleanup return TermInstance (hinstance, msg.wparam); // // InitInstance - Instance initialization // HWND InitInstance (HINSTANCE hinstance, LPWSTR lpcmdline, int ncmdshow) { WNDCLASS wc; HWND hwnd; // Save program instance handle in global variable. hinst = hinstance; #if defined(win32_platform_pspc) // If Pocket PC, only allow one instance of the application HWND hwnd = FindWindow (szappname, NULL); if (hwnd){ SetForegroundWindow ((HWND)(((DWORD)hWnd) 0x01)); return -1; #endif // Register application main window class. wc.style = 0; // Window style 59

61 DMA270 WinCE 5.0 操作流程 wc.lpfnwndproc = MainWndProc; wc.cbclsextra = 0; wc.cbwndextra = 0; wc.hinstance = hinstance; wc.hicon = NULL, // Callback function // Extra class data // Extra window data // Owner handle // Application icon wc.hcursor = LoadCursor (NULL, IDC_ARROW);// Default cursor wc.hbrbackground = (HBRUSH) GetStockObject (WHITE_BRUSH); wc.lpszmenuname = NULL; wc.lpszclassname = szappname; // Menu name // Window class name if (RegisterClass (&wc) == 0) return 0; // Create main window. hwnd = CreateWindow (szappname, TEXT("HelloCE"), // Window class // Window title // Style flags WS_VISIBLE WS_CAPTION WS_SYSMENU, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hinstance, NULL); // x position // y position // Initial width // Initial height // Parent // Menu, must be null // Application instance // Pointer to create // parameters if (!IsWindow (hwnd)) return 0; // Fail code if not created. // Standard show and update calls ShowWindow (hwnd, ncmdshow); UpdateWindow (hwnd); return hwnd; 60

62 第三章 實驗篇 // // TermInstance - Program cleanup // int TermInstance (HINSTANCE hinstance, int ndefrc) { return ndefrc; //====================================================================== // Message handling procedures for main window // // // MainWndProc - Callback function for application window // LRESULT CALLBACK MainWndProc (HWND hwnd, UINT wmsg, WPARAM wparam, LPARAM lparam) { INT i; // // Search message list to see if we need to handle this // message. If in list, call procedure. // for (i = 0; i < dim(mainmessages); i++) { if (wmsg == MainMessages[i].Code) return (*MainMessages[i].Fxn)(hWnd, wmsg, wparam, lparam); return DefWindowProc (hwnd, wmsg, wparam, lparam); // // DoPaintMain - Process WM_PAINT message for window. // LRESULT DoPaintMain (HWND hwnd, UINT wmsg, WPARAM wparam, LPARAM lparam) { PAINTSTRUCT ps; RECT rect; HDC hdc; 61

63 DMA270 WinCE 5.0 操作流程 // Get the size of the client rectangle GetClientRect (hwnd, &rect); hdc = BeginPaint (hwnd, &ps); DrawText (hdc, TEXT ("Hello Windows CE!"), -1, &rect, DT_CENTER DT_VCENTER DT_SINGLELINE); EndPaint (hwnd, &ps); return 0; // // DoDestroyMain - Process WM_DESTROY message for window. // LRESULT DoDestroyMain (HWND hwnd, UINT wmsg, WPARAM wparam, LPARAM lparam) { PostQuitMessage (0); return 0; 62

64 第三章 實驗篇 3-2 實驗二螢幕上繪圖 ( 一 ) 實驗目的 1. 瞭解如何在 WINCE 螢幕上繪圖 2. 掌握撰寫程式方式 實驗內容 1. 螢幕上繪圖 實驗設備 1. Cayman 主機 2. Embedded visual C 實驗原理 Windows 細分成三個主件元件,KERNEL, 處理序和記憶體管理 ;USER, 處理視窗介面和控制項 ; 以及圖形裝置介面 (GDI) 執行低階繪製工作 在 WINCE 中 USER 和 GDI 組合成 GraphicsWindowing 和 event 處理常式 或稱之為 GWE Bitmaps 是圖形化的物件, 用來建立 繪製 操作 以及取回裝置內容中的影像 Windows 內到處可見 Bitmaps, 從開始按鈕上微小的 Windows 標誌, 到標題列上的 Close 按鈕都有 將 Bitmap 想像成是可以繪製在螢幕上 由像素陣列所組成的圖片 和圖片相同的是,Bitmap 擁有描述 Bitmap 中每一個像素的位元陣列 Windows 下的 Bitmap 已經分割成二大類型 : 隸屬於裝置的 Bitmap 以及和裝置無關的 Bitmaps, 並且無法輕易使用不同的特性而呈現在 DCs 中 在下面程式中, 在每一個圖形建立了不同的筆刷, 並且選入裝置內容中, 並且在圖形繪製之後, 從 DC 中撤除了所選入的筆刷, 前三個圖形填入實心的灰階影線 實心比刷使用 GetStockObject 函數載入, 最後一個圖形填入由 CreateDIBPatternBrushPt 所建立筆刷 此一筆刷的建立被隔離至 MyCreateHatchBrush 函式呼叫中, 此函式模仿無法在 WINCE 下使用的 CreateHatchBrush 函式 為了建立影線筆刷, 藉由填入 Bitmap 結構並且設定位元見置黑 - 白的 Bitmap, 已形成影線圖案 因為 Bitmap 是單色模式, 他的總大小, 包括調色盤和標頭, 差不多是 100 位元組 要注意的是, 每一條 Bitmap 的掃描線必須以雙文字對齊, 每一個一位元組掃描線的最後三個位元組並沒有使用 63

65 DMA270 WinCE 5.0 操作流程 最後程式由二行文字寫入下方的矩形作為結束 此文字進一步示範了系統中透明和不透明模式的用法 在此情況下 比較適合使用不透明的繪製模式, 因為影線會遮住了透明模式中的字母 程式中假設在至少 240 個像素寬的顯示的顯示器上執行, 如此一來, 這個程式可以像是在 PPC 上執行 實驗程式碼 #include <windows.h> #include "shapes.h" // For all that Windows stuff // Program-specific stuff // // Global data const TCHAR szappname[] = TEXT ("Shapes"); HINSTANCE hinst; // Program instance handle // Message dispatch table for MainWindowProc const struct decodeuint MainMessages[] = { WM_PAINT, DoPaintMain, WM_DESTROY, DoDestroyMain, ; //====================================================================== // Program entry point int WINAPI WinMain (HINSTANCE hinstance, HINSTANCE hprevinstance, LPWSTR lpcmdline, int ncmdshow) { MSG msg; HWND hwndmain; // Initialize this instance. hwndmain = InitInstance(hInstance, lpcmdline, ncmdshow); if (hwndmain == 0) return 0x10; 64

66 第三章 實驗篇 // Application message loop while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg); DispatchMessage (&msg); // Instance cleanup return TermInstance (hinstance, msg.wparam); // // InitInstance - Instance initialization HWND InitInstance (HINSTANCE hinstance, LPWSTR lpcmdline, int ncmdshow){ WNDCLASS wc; HWND hwnd; // Save program instance handle in global variable. hinst = hinstance; #if defined(win32_platform_pspc) // If Pocket PC, allow only one instance of the application. hwnd = FindWindow (szappname, NULL); if (hwnd){ SetForegroundWindow ((HWND)(((DWORD)hWnd) 0x01)); return 0; #endif // Register application main window class. wc.style = 0; wc.lpfnwndproc = MainWndProc; wc.cbclsextra = 0; wc.cbwndextra = 0; wc.hinstance = hinstance; wc.hicon = NULL, // Window style // Callback function // Extra class data // Extra window data // Owner handle // Application icon 65

67 DMA270 WinCE 5.0 操作流程 wc.hcursor = LoadCursor (NULL, IDC_ARROW);// Default cursor wc.hbrbackground = (HBRUSH) GetStockObject (WHITE_BRUSH); wc.lpszmenuname = NULL; // Menu name wc.lpszclassname = szappname; // Window class name if (RegisterClass (&wc) == 0) return 0; // Create main window. hwnd = CreateWindowEx (WS_EX_NODRAG, szappname, TEXT("Shapes"), WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hinstance, NULL); // Return fail code if window not created. if (!IsWindow (hwnd)) return 0; // Ex Style // Window class // Window title // Style flags // x position // y position // Initial width // Initial height // Parent // Menu, must be null // Application instance // Pointer to create // parameters // Standard show and update calls ShowWindow (hwnd, ncmdshow); UpdateWindow (hwnd); return hwnd; // // TermInstance - Program cleanup // int TermInstance (HINSTANCE hinstance, int ndefrc) { 66

68 第三章 實驗篇 return ndefrc; //====================================================================== // Message handling procedures for MainWindow // // MainWndProc - Callback function for application window // LRESULT CALLBACK MainWndProc (HWND hwnd, UINT wmsg, WPARAM wparam, LPARAM lparam) { INT i; // // Search message list to see if we need to handle this // message. If in list, call procedure. // for (i = 0; i < dim(mainmessages); i++) { if (wmsg == MainMessages[i].Code) return (*MainMessages[i].Fxn)(hWnd, wmsg, wparam, lparam); return DefWindowProc (hwnd, wmsg, wparam, lparam); // // MyCreateHatchBrush - Creates hatched brushes // HBRUSH MyCreateHatchBrush (INT fnstyle, COLORREF clrref) { BRUSHBMP brbmp; BYTE *pbytes; int i; DWORD dwbits[6][2] = { {0x000000ff,0x , {0x ,0x , {0x ,0x , {0x ,0x , {0x101010ff,0x , {0x ,0x , ; 67

69 DMA270 WinCE 5.0 操作流程 if ((fnstyle < 0) (fnstyle > dim(dwbits))) return 0; memset (&brbmp, 0, sizeof (brbmp)); brbmp.bmi.bisize = sizeof (BITMAPINFOHEADER); brbmp.bmi.biwidth = 8; brbmp.bmi.biheight = 8; brbmp.bmi.biplanes = 1; brbmp.bmi.bibitcount = 1; brbmp.bmi.biclrused = 2; brbmp.bmi.biclrimportant = 2; // Initialize the palette of the bitmap. brbmp.dwpal[0] = PALETTERGB(0xff,0xff,0xff); brbmp.dwpal[1] = PALETTERGB((BYTE)((clrref >> 16) & 0xff), (BYTE)((clrref >> 8) & 0xff), (BYTE)(clrref & 0xff)); // Write the hatch data to the bitmap. pbytes = (BYTE *)&dwbits[fnstyle]; for (i = 0; i < 8; i++) brbmp.bbits[i*4] = *pbytes++; // Return the handle of the brush created. return CreateDIBPatternBrushPt (&brbmp, DIB_RGB_COLORS); // // DoPaintMain - Process WM_PAINT message for window. // LRESULT DoPaintMain (HWND hwnd, UINT wmsg, WPARAM wparam, LPARAM lparam) { PAINTSTRUCT ps; RECT rect; 68

70 第三章 實驗篇 HDC hdc; POINT ptarray[6]; HBRUSH hbr, holdbr; TCHAR sztext[128]; GetClientRect (hwnd, &rect); hdc = BeginPaint (hwnd, &ps); // Draw ellipse. hbr = (HBRUSH) GetStockObject (DKGRAY_BRUSH); holdbr = (HBRUSH) SelectObject (hdc, hbr); Ellipse (hdc, 10, 50, 90, 130); SelectObject (hdc, holdbr); // Draw round rectangle. hbr = (HBRUSH) GetStockObject (LTGRAY_BRUSH); holdbr = (HBRUSH) SelectObject (hdc, hbr); RoundRect (hdc, 95, 50, 150, 130, 30, 30); SelectObject (hdc, holdbr); // Draw hexagon using Polygon. hbr = (HBRUSH) GetStockObject (WHITE_BRUSH); holdbr = (HBRUSH) SelectObject (hdc, hbr); ptarray[0].x = 192; ptarray[0].y = 50; ptarray[1].x = 155; ptarray[1].y = 75; ptarray[2].x = 155; ptarray[2].y = 105; ptarray[3].x = 192; ptarray[3].y = 130; ptarray[4].x = 230; ptarray[4].y = 105; 69

71 DMA270 WinCE 5.0 操作流程 ptarray[5].x = 230; ptarray[5].y = 75; Polygon (hdc, ptarray, 6); SelectObject (hdc, holdbr); hbr = (HBRUSH) MyCreateHatchBrush (HS_DIAGCROSS, RGB (0, 0, 0)); holdbr = (HBRUSH) SelectObject (hdc, hbr); Rectangle (hdc, 10, 145, 225, 210); SelectObject (hdc, holdbr); DeleteObject (hbr); SetBkMode (hdc, OPAQUE); lstrcpy (sztext, TEXT ("Opaque background")); ExtTextOut (hdc, 20, 160, 0, NULL, sztext, lstrlen (sztext), NULL); SetBkMode (hdc, TRANSPARENT); lstrcpy (sztext, TEXT ("Transparent background")); ExtTextOut (hdc, 20, 185, 0, NULL, sztext, lstrlen (sztext), NULL); EndPaint (hwnd, &ps); return 0; // // DoDestroyMain - Process WM_DESTROY message for window // LRESULT DoDestroyMain (HWND hwnd, UINT wmsg, WPARAM wparam, LPARAM lparam) { PostQuitMessage (0); return 0; 70

72 第三章 實驗篇 實驗步驟 (1) 通過 ActiveSync 將 shapes.exe 上傳到 Windows CE,( 或者將 shapes.exe 複製到 USB 隨身碟, 然後將 USB 隨身碟插入教學實驗平台 ) (2) 運作 shapes.exe 71

73 DMA270 WinCE 5.0 操作流程 3-3 實驗三螢幕上繪圖 ( 二 ) 實驗目的 1. 瞭解如何在 WINCE 螢幕上繪圖 2. 掌握撰寫程式方式 實驗內容 1. 螢幕上繪圖 實驗設備 1. Cayman 主機 2. Embedded visual C 實驗原理當滑鼠游標移過顯示畫面時, 此點的最上層視窗會接收 WM_MOUSEMOVE 訊息, 如果使用者單擊滑鼠左鍵, 視窗會接收到 WM_LBUTTONDOWN 或 LB_RBUTTONDOWN 訊息 當使用者放開滑鼠上的按鈕時, 視窗會接收到 WM_LBUTTONUP 或 WM_RBUTTONUP 訊息 如果使用者按下與放開滑鼠的滾輪時, 視窗會在 WM_MBUTTONUP 訊息之後, 接收到 WM_MBUTTONDOWN 訊息 就所有訊息而言,wParam 和 lparam 參數以相同的值載入 wparam 參數儲存了一組位元旗標, 表示目前所按下的鍵是 CTRL 或 Shift 鍵 當使用其他版本的 windows 時, ALT 鍵的狀態資訊並沒有在這些訊息中, 當訊息傳送時為了取得 ALT 鍵的狀態, 使用 GetKeyState 函式 lparam 參數儲存了兩個 16 位元的值, 表示在螢幕上敲擊的位置 位序位的 16 位元值包含了相對於視窗區域左上角位置的 x 座標, 而高位序的 16 位元值包含了 y 座標 如果使用者雙擊螢幕, 也就是說, 在預定的一小段時間內, 在相同的位置上敲擊螢幕兩次的話,Windows 會傳送一個 WM_LBUTTONDBLCLK 訊息致被雙擊視窗, 但是, 只有在該視窗類別使用 CS_DBLCLKS 樣式註冊才會發生 當視窗類別使用 RegisterClass. 註冊時, 類別樣式才得以設定 可以藉由比較傳送至視窗的訊息, 來區分單擊和雙擊的動作, 當產生雙擊動作時, 視窗首先會接收到來 WM_LBUTTONDOWN 和 WM_LBUTTONUP 訊息, 在 72

74 第三章 實驗篇 WM_LBUTTONDOWN 之後傳送 WM_LBUTTONDBLCLK 訊息 秘訣在於以任何方式限制 WM_LBUTTONDOWN 行為, 已排除在後續 WM_LBUTTONDBLCLK 訊息上的行動 如果使用者轉動滑鼠的滾輪, 視窗會接收到 WM_MOUSEWHEEL 訊息, 就這個訊息而言,lParam 的內容和其他滑鼠訊息相同, 都是滑鼠游標的水平和垂直位置, 低位序的 wparam 參數包含相同的位元旗標, 表示目前所按下鍵 高位序的 wparam 參書包含滾輪所轉動的距離, 已幾個 WHEEL_DELTA 常數來表示 如果此值是正數, 轉動的方向是遠離使用這的方向 負數表示轉動是朝著使用者的方向 當使用者按下螢幕的尖筆時, 該點下的最上層視窗會接收到輸入焦點, 如果此視窗之前都不曾擁有, 則會接收到 WM_LBUTTONDOWN 訊息 當使用者提起尖筆, 視窗接收到 WM_LBUTTONUP 訊息 當尖筆放在螢幕上而於相同的視窗上移動尖筆時, 會使得 WM_MOUSEMOVE 訊息傳送至該視窗中 使用者在螢幕上輸入, 並且將結果儲存為油墨 (ink), 第一個步驟中, 最好的方法是儲存傳入每一個 WM_MOUSEMOVE 訊息的尖筆點 GetMouseMovePoints 回傳數個不會產生 WM_MOUSEMOVE 訊息的尖筆點, 此函式會接收一個點的陣列, 陣列大小 ( 已點計 ) 以及一個將會接收傳送回應用程式點數的整數指標 一但接收後, 這些額外的點可以用來填入最後一個 WM_MOUSEMOVE 訊息和目前訊息之間的空白 GetMousePoints 確實給你一調曲線 他回傳的點是觸空面板的解析度而不是螢幕解析度, 這個觸控面板解析度的設定一般都是螢幕解析度的四倍, 因此, 你必須將 GetMousePoint 所回傳的座標除以 4, 而將她們轉換成螢幕座標 額外的解析度有助於程式的執行 實驗程式碼 #include <windows.h> #include "pentrac.h" // For all that Windows stuff // Program-specific stuff // Global data const TCHAR szappname[] = TEXT ("PenTrac"); HINSTANCE hinst; // Program instance handle // Message dispatch table for MainWindowProc const struct decodeuint MainMessages[] = { WM_LBUTTONDOWN, DoMouseMain, 73

75 DMA270 WinCE 5.0 操作流程 WM_MOUSEMOVE, DoMouseMain, WM_DESTROY, DoDestroyMain, ; /// Program entry point int WINAPI WinMain (HINSTANCE hinstance, HINSTANCE hprevinstance, LPWSTR lpcmdline, int ncmdshow) { MSG msg; int rc = 0; HWND hwndmain; // Initialize this instance. hwndmain = InitInstance (hinstance, lpcmdline, ncmdshow); if (hwndmain == 0) return 0x10; // Application message loop while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg); DispatchMessage (&msg); // Instance cleanup return TermInstance (hinstance, msg.wparam); // // InitApp - Application initialization HWND InitInstance (HINSTANCE hinstance, LPWSTR lpcmdline, int ncmdshow) { WNDCLASS wc; HWND hwnd; #if defined(win32_platform_pspc) // If Pocket PC, allow only one instance of the application hwnd = FindWindow (szappname, NULL); 74

76 第三章 實驗篇 if (hwnd){ SetForegroundWindow ((HWND)(((DWORD)hWnd) 0x01)); return 0; #endif // Save program instance handle in global variable. hinst = hinstance; // Register application main window class. wc.style = 0; // Window style wc.lpfnwndproc = MainWndProc; // Callback function wc.cbclsextra = 0; // Extra class data wc.cbwndextra = 0; // Extra window data wc.hinstance = hinstance; // Owner handle wc.hicon = NULL, // Application icon wc.hcursor = LoadCursor (NULL, IDC_ARROW);// Default cursor wc.hbrbackground = (HBRUSH) GetStockObject (WHITE_BRUSH); wc.lpszmenuname = NULL; // Menu name wc.lpszclassname = szappname; // Window class name if (RegisterClass (&wc) == 0) return 0; // Create main window. hwnd = CreateWindowEx (WS_EX_NODRAG, szappname, TEXT ("PenTrac"), WS_VISIBLE WS_CAPTION WS_SYSMENU, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hinstance, NULL); // Return fail code if window not created. if (!IsWindow (hwnd)) return 0; // Standard show and update calls ShowWindow (hwnd, ncmdshow); UpdateWindow (hwnd); 75

77 DMA270 WinCE 5.0 操作流程 return hwnd; // // TermInstance - Program cleanup // int TermInstance (HINSTANCE hinstance, int ndefrc) { return ndefrc; // Message handling procedures for MainWindow // // MainWndProc - Callback function for application window // LRESULT CALLBACK MainWndProc (HWND hwnd, UINT wmsg, WPARAM wparam, LPARAM lparam) { INT i; // // Search message list to see if we need to handle this // message. If in list, call procedure. // for (i = 0; i < dim(mainmessages); i++) { if (wmsg == MainMessages[i].Code) return (*MainMessages[i].Fxn)(hWnd, wmsg, wparam, lparam); return DefWindowProc (hwnd, wmsg, wparam, lparam); // // DoMouseMain - Process WM_LBUTTONDOWN and WM_MOUSEMOVE messages // for window. // LRESULT DoMouseMain (HWND hwnd, UINT wmsg, WPARAM wparam, LPARAM lparam) { POINT pt[64]; POINT ptm; 76

78 第三章 實驗篇 UINT i, upoints = 0; HDC hdc; ptm.x = LOWORD (lparam); ptm.y = HIWORD (lparam); hdc = GetDC (hwnd); // If shift and mouse move, see if any lost points. if (wmsg == WM_MOUSEMOVE) { if (wparam& MK_SHIFT) GetMouseMovePoints (pt, 64, &upoints); for (i = 0; i < upoints; i++) { pt[i].x /= 4; // Convert move pts to screen coords pt[i].y /= 4; // Covert screen coordinates to window coordinates MapWindowPoints (HWND_DESKTOP, hwnd, &pt[i], 1); SetPixel (hdc, pt[i].x, pt[i].y, RGB (255, 0, 0)); SetPixel (hdc, pt[i].x+1, pt[i].y, RGB (255, 0, 0)); SetPixel (hdc, pt[i].x, pt[i].y+1, RGB (255, 0, 0)); SetPixel (hdc, pt[i].x+1, pt[i].y+1, RGB (255, 0, 0)); // The original point is drawn last in case one of the points // returned by GetMouseMovePoints overlaps it. SetPixel (hdc, ptm.x, ptm.y, RGB (0, 0, 0)); SetPixel (hdc, ptm.x+1, ptm.y, RGB (0, 0, 0)); SetPixel (hdc, ptm.x, ptm.y+1, RGB (0, 0, 0)); SetPixel (hdc, ptm.x+1, ptm.y+1, RGB (0, 0, 0)); ReleaseDC (hwnd, hdc); // Kill time to make believe we are busy. Sleep(25); return 0; 77

79 DMA270 WinCE 5.0 操作流程 // // DoDestroyMain - Process WM_DESTROY message for window. // LRESULT DoDestroyMain (HWND hwnd, UINT wmsg, WPARAM wparam, LPARAM lparam) { PostQuitMessage (0); return 0; 實驗步驟 (1) 通過 ActiveSync 將 pentrac.exe 上傳到 Windows CE,( 或者將 pentrac.exe 複製到 USB 隨身碟, 然後將 USB 隨身碟插入教學實驗平台 ) (2) 運作 pentrac.exe 78

80 第三章 實驗篇 3-4 實驗四螢幕上繪圖 ( 三 ) 實驗目的 1. 瞭解如何在 WINCE 螢幕上製作小遊戲 2. 掌握撰寫程式方式 實驗內容 1. 螢幕上製作小遊戲 實驗設備 1. Cayman 主機 2. Embedded visual C 實驗原理 為了說明尖筆的程式設計, 所以撰寫一個小遊戲來做實驗, 這個不允許你和電腦對戰, 也無法決定遊戲的結束, 只繪製遊戲面板, 並且追蹤 X 和 O 的紀錄 TicTacl 中的動作主要是在三個共用程式中 :DrawBoard DrawXO 和 DoLButtonUpMain 前二個共用程式執行負責繪製遊戲面板 決定面板上敲擊的位置的公用程式是 DoLButtonUpMain 顧名思義, 這個公用程式的呼叫是為了回應 WM_LBUTTONUP 訊息 第一個動作式呼叫以下函式 : BOOL PtInRect (const RECT *lprc, POINT pt); 這個函式判斷敲擊之處是否在遊戲面板上, 程式會知道敲擊的位置, 因為在 lparam 值中接收此項訊息 面板矩形區域在程式開始 DoDizeMain 時予以計算 一但敲擊定位在面板上時, 程式會藉由垂直線和水平線交叉而的分割面板內敲擊點的座標, 判斷遊戲板內相關儲存格的位置 面板矩形區域是在 DoSizeMain 公用程式執行期間計算出來, 呼叫此公用程式以回應 WM_SIZE 訊息似乎很奇怪, 但他必須支援, 因為視窗會經常地調整大小, 初次建立之後, 以及每一次的最小化和還原 你可能會這麼想著, 可以在 WM_CREATE 訊息期間決定視窗的大小 lparam 參數指向 CREATESTRUCT 結構, 此結構儲存了視窗的起始大小和位置 使用這些數值的問題在於, 所得的大小是視窗總大小, 而不是我們所需要的用戶區域大小 在 Windows CE 下, 大部分的視窗沒有標題列和邊界, 但有些則二 79

81 DMA270 WinCE 5.0 操作流程 者兼備並且擁有滑動軸, 因此使用這些數值會造成無法想像的困擾 就我們的 TicTacl 範例而言, 我們擁有一個有效地使用筆尖, 但不能稱作完整的程式, 為了重新啟動遊戲, 我們必須結束並重新開啟 TicTacl 我們無法還原某個移動動作或先由 O 開始 實驗程式碼 #include <windows.h> #include <commctrl.h> #include "tictac1.h" // For all that Windows stuff // Command bar includes // Program-specific stuff // // Global data const TCHAR szappname[] = TEXT ("TicTac1"); HINSTANCE hinst; // Program instance handle // State data for game RECT rectboard = {0, 0, 0, 0; RECT rectprompt; BYTE bboard[9]; BYTE bturn = 0; // Used to place game board. // Used to place prompt. // Keeps track of X's and O's. // Keeps track of the turn. // Message dispatch table for MainWindowProc const struct decodeuint MainMessages[] = { WM_SIZE, DoSizeMain, WM_PAINT, DoPaintMain, WM_LBUTTONUP, DoLButtonUpMain, WM_DESTROY, DoDestroyMain, ; //============================================================ // Program entry point // int WINAPI WinMain (HINSTANCE hinstance, HINSTANCE hprevinstance, 80

82 第三章 實驗篇 LPWSTR lpcmdline, int ncmdshow) { MSG msg; HWND hwndmain; // Initialize this instance. hwndmain = InitInstance (hinstance, lpcmdline, ncmdshow); if (hwndmain == 0) return 0x10; // Application message loop while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg); DispatchMessage (&msg); // Instance cleanup return TermInstance (hinstance, msg.wparam); // // InitInstance - Instance initialization // HWND InitInstance (HINSTANCE hinstance, LPWSTR lpcmdline, int ncmdshow) { WNDCLASS wc; HWND hwnd; // Save program instance handle in global variable. hinst = hinstance; #if defined(win32_platform_pspc) // If Pocket PC, allow only one instance of the application. hwnd = FindWindow (szappname, NULL); if (hwnd){ SetForegroundWindow ((HWND)(((DWORD)hWnd) 0x01)); return 0; 81

83 DMA270 WinCE 5.0 操作流程 #endif // Register application main window class. wc.style = 0; // Window style wc.lpfnwndproc = MainWndProc; // Callback function wc.cbclsextra = 0; // Extra class data wc.cbwndextra = 0; // Extra window data wc.hinstance = hinstance; // Owner handle wc.hicon = NULL, // Application icon wc.hcursor = LoadCursor (NULL, IDC_ARROW);// Default cursor wc.hbrbackground = (HBRUSH) GetStockObject (WHITE_BRUSH); wc.lpszmenuname = NULL; // Menu name wc.lpszclassname = szappname; // Window class name if (RegisterClass (&wc) == 0) return 0; // Create main window. hwnd = CreateWindowEx (WS_EX_NODRAG, szappname, TEXT ("TicTac1"), WS_VISIBLE WS_CAPTION WS_SYSMENU, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hinstance, NULL); // Return fail code if window not created. if (!IsWindow (hwnd)) return 0; // Standard show and update calls ShowWindow (hwnd, ncmdshow); UpdateWindow (hwnd); return hwnd; // // TermInstance - Program cleanup // int TermInstance (HINSTANCE hinstance, int ndefrc) { 82

84 第三章 實驗篇 return ndefrc; //============================================================// Message handling procedures for MainWindow // // MainWndProc - Callback function for application window LRESULT CALLBACK MainWndProc (HWND hwnd, UINT wmsg, WPARAM wparam, LPARAM lparam) { INT i; // // Search message list to see if we need to handle this // message. If in list, call procedure. // for (i = 0; i < dim(mainmessages); i++) { if (wmsg == MainMessages[i].Code) return (*MainMessages[i].Fxn)(hWnd, wmsg, wparam, lparam); return DefWindowProc(hWnd, wmsg, wparam, lparam); // // DoSizeMain - Process WM_SIZE message for window. // LRESULT DoSizeMain (HWND hwnd, UINT wmsg, WPARAM wparam, LPARAM lparam) { RECT rect; INT i; // Adjust the size of the client rect to take into account // the command bar height. GetClientRect (hwnd, &rect); // Initialize the board rectangle if not yet initialized. if (rectboard.right == 0) { 83

85 DMA270 WinCE 5.0 操作流程 // Initialize the board. for (i = 0; i < dim(bboard); i++) bboard[i] = 0; // Define the playing board rect. rectboard = rect; rectprompt = rect; // Layout depends on portrait or landscape screen. if (rect.right - rect.left > rect.bottom - rect.top) { rectboard.left += 20; rectboard.top += 10; rectboard.bottom -= 10; rectboard.right = rectboard.bottom - rectboard.top + 10; rectprompt.left = rectboard.right + 10; else { rectboard.left += 20; rectboard.right -= 20; rectboard.top += 10; rectboard.bottom = rectboard.right - rectboard.left + 10; return 0; rectprompt.top = rectboard.bottom + 10; // // DoPaintMain - Process WM_PAINT message for window. // LRESULT DoPaintMain (HWND hwnd, UINT wmsg, WPARAM wparam, LPARAM lparam) { 84

86 第三章 實驗篇 PAINTSTRUCT ps; RECT rect; HFONT hfont, holdfont; HDC hdc; GetClientRect (hwnd, &rect); hdc = BeginPaint (hwnd, &ps); // Draw the board. DrawBoard (hdc, &rectboard); // Write the prompt to the screen. hfont = (HFONT)GetStockObject (SYSTEM_FONT); holdfont = (HFONT)SelectObject (hdc, hfont); if (bturn == 0) DrawText (hdc, TEXT (" X's turn"), -1, &rectprompt, DT_CENTER DT_VCENTER DT_SINGLELINE); else DrawText (hdc, TEXT (" O's turn"), -1, &rectprompt, DT_CENTER DT_VCENTER DT_SINGLELINE); SelectObject (hdc, holdfont); EndPaint (hwnd, &ps); return 0; // DoLButtonUpMain - Process WM_LBUTTONUP message for window. // LRESULT DoLButtonUpMain (HWND hwnd, UINT wmsg, WPARAM wparam, LPARAM lparam) { POINT pt; INT cx, cy, ncell = 0; 85

87 DMA270 WinCE 5.0 操作流程 pt.x = LOWORD (lparam); pt.y = HIWORD (lparam); // See if pen on board. If so, determine which cell. if (PtInRect (&rectboard, pt)){ // Normalize point to upper left corner of board. pt.x -= rectboard.left; pt.y -= rectboard.top; // Compute size of each cell. cx = (rectboard.right - rectboard.left)/3; cy = (rectboard.bottom - rectboard.top)/3; // Find column. ncell = (pt.x / cx); // Find row. ncell += (pt.y / cy) * 3; // If cell empty, fill it with mark. if (bboard[ncell] == 0) { if (bturn){ bboard[ncell] = 2; bturn = 0; else { bboard[ncell] = 1; bturn = 1; InvalidateRect (hwnd, NULL, FALSE); else { // Inform the user of the filled cell. MessageBeep (0); return 0; 86

88 第三章 實驗篇 return 0; // DoDestroyMain - Process WM_DESTROY message for window. // LRESULT DoDestroyMain (HWND hwnd, UINT wmsg, WPARAM wparam, LPARAM lparam) { PostQuitMessage (0); return 0; //============================================================ // Game-specific routines // // DrawXO - Draw a single X or O in a square. void DrawXO (HDC hdc, HPEN hpen, RECT *prect, INT ncell, INT ntype) { POINT pt[2]; INT cx, cy; RECT rect; cx = (prect->right - prect->left)/3; cy = (prect->bottom - prect->top)/3; // Compute the dimensions of the target cell. rect.left = (cx * (ncell % 3) + prect->left) + 10; rect.right = rect.right = rect.left + cx - 20; rect.top = cy * (ncell / 3) + prect->top + 10; rect.bottom = rect.top + cy - 20; // Draw an X? if (ntype == 1) { pt[0].x = rect.left; pt[0].y = rect.top; pt[1].x = rect.right; pt[1].y = rect.bottom; 87

89 DMA270 WinCE 5.0 操作流程 Polyline (hdc, pt, 2); pt[0].x = rect.right; pt[1].x = rect.left; Polyline (hdc, pt, 2); // How about an O? else if (ntype == 2) { Ellipse (hdc, rect.left, rect.top, rect.right, rect.bottom); return; // DrawBoard - Draw the tic-tac-toe board. // VK_MENU void DrawBoard (HDC hdc, RECT *prect) { HPEN hpen, holdpen; POINT pt[2]; LOGPEN lp; INT i, cx, cy; // Create a nice thick pen. lp.lopnstyle = PS_SOLID; lp.lopnwidth.x = 5; lp.lopnwidth.y = 5; lp.lopncolor = RGB (0, 0, 0); hpen = CreatePenIndirect (&lp); holdpen = (HPEN)SelectObject (hdc, hpen); cx = (prect->right - prect->left)/3; cy = (prect->bottom - prect->top)/3; // Draw lines down. pt[0].x = cx + prect->left; 88

90 第三章 實驗篇 pt[1].x = cx + prect->left; pt[0].y = prect->top; pt[1].y = prect->bottom; Polyline (hdc, pt, 2); pt[0].x += cx; pt[1].x += cx; Polyline (hdc, pt, 2); // Draw lines across. pt[0].x = prect->left; pt[1].x = prect->right; pt[0].y = cy + prect->top; pt[1].y = cy + prect->top; Polyline (hdc, pt, 2); pt[0].y += cy; pt[1].y += cy; Polyline (hdc, pt, 2); // Fill in X's and O's. for (i = 0; i < dim (bboard); i++) DrawXO (hdc, hpen, &rectboard, i, bboard[i]); SelectObject (hdc, holdpen); DeleteObject (hpen); return; 實驗步驟 (1) 通過 ActiveSync 將 tictac1.exe 上傳到 Windows CE,( 或者將 tictac1.exe 複製到 USB 隨身碟, 然後將 USB 隨身碟插入教學實驗平台 ) (2) 運作 tictac1.ex 89

91 DMA270 WinCE 5.0 操作流程 3-5 實驗五通知 實驗目的 1. 瞭解如何在 WINCE 螢幕上製作小遊戲 2. 掌握撰寫程式方式 實驗內容 1. 螢幕上製作小遊戲 實驗設備 1. Cayman 主機 2. Embedded visual C 實驗原理 Microsoft Windows CE 中所使用的 API 超過 Windows XP API 的領域是通知介面 Windows CE 應用程式可以登錄為在預定時間的時間啟動 或是當任何一組系統事件發生時啟動 應用程式也可以登錄一個使用者通知 在使用者通知中, 系統會在特定的時間的時間點通知使用者, 而應用程式並不會自己再該時間點啟動 通知介面只會根據少許的函式來達到, 其中, 最重要的函式是 CeSetUserNotificationEx 這是一個多用途的函式提共三種類型的排程功能: 使用者通知 系統通知 以及計時器通知 CeSetUserNotificationEx 取代了三個獨立函式 -CeSetUserNotification CeRunAppAtEvent 以及 CeRunAppAtTime- 這些獨立的函式基本上功能比較陽春 Windows CE 應用程式可以使用 CeSetUserNotificationEx 函式, 排定在某個時間點通知使用者 當通知時間來臨時, 系統會藉由顯示一個對話方塊 播放一個音樂檔 震動裝置或是閃爍外部的 LED 來警示使用者 如果在所設定的通知時間點來臨時, 系統正處於關機狀態的話,Windows CE 會開啟系統 因為 Windows CE 系統擁有自動關機的功能, 如果通知啟動時, 系統會將自己重回開機狀態 Windows CE 也將有設定通知的應用程式圖示顯示在工作列上 使用者可選擇單擊通知對話方塊上的 OK 按下 System Case 上的 Notify 按鈕, 或者在某些系統上, 敲擊應用程式的工作列 Annunciator 圖示, 此舉會啟動有登錄通知的應用程式以表示收到通知, 在使用者通知設定之後, 你 90

92 第三章 實驗篇 可以藉由呼叫 CeSetUserNotificationEx 函式來進行修改 在下面的範例程式,NoteDemo, 示範了每一個通知函式, 讓你能夠設定使用者通知 系統通知 以及計時通知, 此程式呈現一個有五個按鈕的簡易對話方塊 前二個按鈕允許你設定和配置使用者通知, 接下來的二個按鈕讓你設定系統和計時通知, 最後一個按鈕清空使用 NoteDemo 所設定的通知 按鈕上方的間隔填入命令列, 當應用程式啟動時被傳送 這個空白區域也會因為使用者通知, 而當令一個 NoteDemo 執行個體開始時顯示一個訊息 當 NoteDemo 開始執行時, 他會檢查命令列, 藉以判斷他是否由使用者通知所開啟, 如果是的話, 程式會試圖找尋另一個正在執行中應用程式的執行個體 如果程式找到的話, 會將一個訊息傳入第一個執行個體中, 知會他是使用者通知 因為這是一個範例程式, 第二個執行個體並不會自行終止, 如果是商用程式的話, 應該要繼續判斷其他的執行個體 計時器通知使用一個具名的事件來作為他的信號, 而不會啟動應用程式的第二個複本, 為了監視事件,NoteDemo 在主視窗建立之前, 建立第二個執行緒 MonitorThread 公用程式等候為計時器通知所建立的事件控制碼 當 NoteDemo 終止時, 他會為執行緒設定一個結束旗標, 並且知會事件本身, 如此一來, 也使得 MonitorThread 終止執行 最後一個按鈕負責清除 NoteDemo 應用程式所排定的通知, 其中, 有一項有趣的工作 : 他是如何得知安排了哪些通知呢? 他是否保存了一分已經排定的通知的紀錄清單呢? 還好, 並不需要這麼作,NoteDemo 只需要查詢所有應用程式的通知排程詢出所要的通知 實驗程式碼 #include <windows.h> #include <notify.h> #include "NoteDemo.h" // For all that Windows stuff // For notification defines // Program-specific stuff // // Global data const TCHAR szappname[] = TEXT ("NoteDemo"); HINSTANCE hinst; HWND g_hmain; // Program instance handle 91

93 DMA270 WinCE 5.0 操作流程 CE_USER_NOTIFICATION g_ceun; // User notification structure TCHAR szdlgtitle[] = TEXT ("Notification Demo"); TCHAR szdlgtext[] = TEXT ("Times Up!"); TCHAR szsound[max_path] = TEXT ("alarm1.wav"); // Used for timer event notification TCHAR szeventname[] = TEXT ("Bob"); HANDLE g_hnoteevent = 0; BOOL g_fcontinue = TRUE; // Message dispatch table for MainWindowProc const struct decodeuint MainMessages[] = { WM_INITDIALOG, DoInitDialogMain, WM_COMMAND, DoCommandMain, MYMSG_TELLNOTIFY, DoTellNotifyMain, ; // Command Message dispatch for MainWindowProc const struct decodecmd MainCommandItems[] = { IDOK, DoMainCommandExit, IDCANCEL, DoMainCommandExit, IDD_ADDUSERNOT, DoMainCommandAddUserNotification, IDD_CFGUSERNOT, DoMainCommandConfigUserNotification, IDD_ADDSYSNOT, DoMainCommandAddSysNotification, IDD_ADDTIMENOT, DoMainCommandAddTimerNotification, IDD_CLEARNOT, DoMainCommandClearNotifications, ; //============================================================ // Program entry point int WINAPI WinMain (HINSTANCE hinstance, HINSTANCE hprevinstance, LPWSTR lpcmdline, int ncmdshow) { INT i; TCHAR sztext[max_path]; 92

94 第三章 實驗篇 WCHAR *pptr; HANDLE hnotify; HWND hwnd; HANDLE hthread; hinst = hinstance; if (*lpcmdline) { pptr = lpcmdline; // Parse the first word of the command line. for (i = 0; (i < dim(sztext)-1) && (*pptr > TEXT (' ')); i++) sztext[i] = *pptr++; sztext[i] = TEXT ('\0'); // Check to see if app started due to notification. if (lstrcmp (sztext, APP_RUN_TO_HANDLE_NOTIFICATION) == 0) { // Acknowledge the notification. GetModuleFileName (hinst, sztext, sizeof (sztext)); CeHandleAppNotifications (sztext); // Get handle of command line. hnotify = (HANDLE)_wtol (pptr); // Look to see if another instance of the app is running. hwnd = FindWindow (NULL, szappname); if (hwnd){ SendMessage (hwnd, MYMSG_TELLNOTIFY, 0, (LPARAM)hNotify); // I should terminate this app here, but I don't so you // can see what happens. return 0; 93

95 DMA270 WinCE 5.0 操作流程 // Do a little initialization of CE_USER_NOTIFICATION. memset (&g_ceun, 0, sizeof (g_ceun)); g_ceun.actionflags = PUN_DIALOG; g_ceun.pwszdialogtitle = szdlgtitle; g_ceun.pwszdialogtext = szdlgtext; g_ceun.pwszsound = szsound; g_ceun.nmaxsound = sizeof (szsound); // Create secondary thread for timer event notification. g_hnoteevent = CreateEvent (NULL, FALSE, FALSE, szeventname); hthread = CreateThread (NULL, 0, MonitorThread, hwnd, 0, (DWORD *)&i); if (hthread == 0) return -1; // Display dialog box as main window. DialogBoxParam (hinstance, szappname, NULL, MainDlgProc, (LPARAM)lpCmdLine); // Signal notification thread to terminate g_fcontinue = FALSE; SetEvent (g_hnoteevent); WaitForSingleObject (hthread, 1000); CloseHandle (hthread); CloseHandle (g_hnoteevent); return 0; //============================================================ // Message handling procedures for main window // // MainDlgProc - Callback function for application window BOOL CALLBACK MainDlgProc (HWND hwnd, UINT wmsg, WPARAM wparam, LPARAM lparam) { 94

96 第三章 實驗篇 INT i; // // Search message list to see if we need to handle this // message. If in list, call procedure. // for (i = 0; i < dim(mainmessages); i++) { if (wmsg == MainMessages[i].Code) return (*MainMessages[i].Fxn)(hWnd, wmsg, wparam, lparam); return FALSE; // // DoInitDialogMain - Process WM_INITDIALOG message for window. // BOOL DoInitDialogMain (HWND hwnd, UINT wmsg, WPARAM wparam, LPARAM lparam) { g_hmain = hwnd; if (*(LPTSTR)lParam) Add2List (hwnd, (LPTSTR)lParam); return FALSE; // // DoCommandMain - Process WM_COMMAND message for window. BOOL DoCommandMain (HWND hwnd, UINT wmsg, WPARAM wparam, LPARAM lparam){ WORD iditem, wnotifycode; HWND hwndctl; INT i; // Parse the parameters. iditem = (WORD) LOWORD (wparam); wnotifycode = (WORD) HIWORD (wparam); hwndctl = (HWND) lparam; 95

97 DMA270 WinCE 5.0 操作流程 // Call routine to handle control message. for (i = 0; i < dim(maincommanditems); i++) { if (iditem == MainCommandItems[i].Code) { (*MainCommandItems[i].Fxn)(hWnd, iditem, hwndctl, wnotifycode); return TRUE; return FALSE; // // DoTellNotifyMain - Process MYMSG_TELLNOTIFY message for window. // BOOL DoTellNotifyMain (HWND hwnd, UINT wmsg, WPARAM wparam, LPARAM lparam) { Add2List (hwnd, TEXT ("Notification %d reported"), lparam); SetForegroundWindow ((HWND)((DWORD)hWnd 0x01)); return 0; //============================================================ // Command handler routines // // DoMainCommandExit - Process Program Exit command. LPARAM DoMainCommandExit (HWND hwnd, WORD iditem, HWND hwndctl, WORD wnotifycode) { EndDialog (hwnd, 0); return 0; // // DoMainCommandAddUserNotification - Process Add User Notify button. // LPARAM DoMainCommandAddUserNotification (HWND hwnd, WORD iditem, 96

98 第三章 實驗篇 HWND hwndctl, WORD wnotifycode) { SYSTEMTIME st, ste; TCHAR szexename[max_path], sztext[128]; TCHAR szargs[128] = TEXT("This is my user notification string."); CE_NOTIFICATION_TRIGGER nt; HANDLE hnotify; // Initialize time structure with local time. GetLocalTime (&st); // Do a trivial amount of error checking. st.wminute++; if (st.wminute > 59) { st.whour++; st.wminute -= 60; // Set end time 10 minutes past start. ste = st; // Do a trivial amount of error checking. ste.wminute += 10; if (ste.wminute > 59) { ste.whour++; ste.wminute -= 60; memset (&nt, 0, sizeof (CE_NOTIFICATION_TRIGGER)); nt.dwsize = sizeof (CE_NOTIFICATION_TRIGGER); nt.dwtype = CNT_PERIOD; nt.lpszapplication = szexename; nt.lpszarguments = szargs; nt.ststarttime = st; nt.stendtime = ste; GetModuleFileName (hinst, szexename, sizeof (szexename)); 97

99 DMA270 WinCE 5.0 操作流程 hnotify = CeSetUserNotificationEx (0, &nt, &g_ceun); // Tell the user the notification was set. if (hnotify) wsprintf (sztext, TEXT ("User notification set for %d:%02d:%02d"), st.whour, st.wminute, st.wsecond); else wsprintf (sztext, TEXT ("User notification failed. rc = %d"), GetLastError()); MessageBox (hwnd, sztext, szappname, MB_OK); return 0; // // DoMainCommandConfigUserNotification - Process Config user // notification button. // LPARAM DoMainCommandConfigUserNotification (HWND hwnd, WORD iditem, HWND hwndctl, WORD wnotifycode) { // Display the system-provided configuration dialog. CeGetUserNotificationPreferences (hwnd, &g_ceun); return 0; // // DoMainCommandAddSysNotification - Process Add Sys notify button. LPARAM DoMainCommandAddSysNotification (HWND hwnd, WORD iditem, HWND hwndctl, WORD wnotifycode) { DialogBox (hinst, TEXT ("SysNotifyConfig"), hwnd, SetEventNotifyDlgProc); return 0; 98

100 第三章 實驗篇 // // DoMainCommandAddTimerNotification - Process add timer notify button. LPARAM DoMainCommandAddTimerNotification (HWND hwnd, WORD iditem, HWND hwndctl, WORD wnotifycode) { SYSTEMTIME st; HANDLE hnotify; CE_NOTIFICATION_TRIGGER nt; TCHAR szexename[max_path], sztext[128]; TCHAR szargs[128] = TEXT("This is my timer notification string."); // Initialize time structure with local time. GetLocalTime (&st); // Do a trivial amount of error checking. if (st.wminute == 59) { st.whour++; st.wminute = 0; else st.wminute++; memset (&nt, 0, sizeof (CE_NOTIFICATION_TRIGGER)); nt.dwsize = sizeof (CE_NOTIFICATION_TRIGGER); nt.dwtype = CNT_TIME; nt.lpszapplication = szexename; nt.lpszarguments = szargs; nt.ststarttime = st; lstrcpy (szexename, NAMED_EVENT_PREFIX_TEXT); lstrcat (szexename, szeventname); // Set the notification. hnotify = CeSetUserNotificationEx (0, &nt, NULL); if (hnotify) wsprintf (sztext, TEXT ("Timer notification set for %d:%02d:%02d"), st.whour, st.wminute, st.wsecond); 99

101 DMA270 WinCE 5.0 操作流程 else wsprintf (sztext, TEXT ("Timer notification failed. rc = %d"), GetLastError()); MessageBox (hwnd, sztext, szappname, MB_OK); return 0; // // DoMainCommandClearNotifications - Clear all notifications pointing // to this application. Note: this is a fairly large stack frame. LPARAM DoMainCommandClearNotifications (HWND hwnd, WORD iditem, HWND hwndctl, WORD wnotifycode) { PBYTE pbuff = NULL; PCE_NOTIFICATION_INFO_HEADER pnih; HANDLE hnothandles[128]; // Assume this is large enough. int rc, ncnt = 0; TCHAR szexename[max_path], sztext[128]; DWORD i, dwsize, nhandcnt = 0; // Get our filename. GetModuleFileName (hinst, szexename, sizeof (szexename)); pbuff = (PBYTE)LocalAlloc (LPTR, 8192); if (!pbuff) { MessageBox (hwnd, TEXT ("Out of memory"), szappname, MB_OK); return 0; rc = CeGetUserNotificationHandles (hnothandles, dim (hnothandles), &nhandcnt); if (rc) { for (i = 0; i < nhandcnt; i++) { // Query info on a single handle. rc = CeGetUserNotification (hnothandles[i], 8192, &dwsize, pbuff); 100

102 第三章 實驗篇 if (rc) { pnih = (PCE_NOTIFICATION_INFO_HEADER)pBuff; if (!lstrcmp (pnih->pcent->lpszapplication, szexename)){ if (CeClearUserNotification (pnih->hnotification)) ncnt++; wsprintf (sztext, TEXT ("Cleared %d notifications"), ncnt); MessageBox (hwnd, sztext, szappname, MB_OK); else MessageBox (hwnd, TEXT ("Could not query handles"), szappname, MB_OK); LocalFree (pbuff); return 0; // // MySetEventNotification - Sets event notifications int MySetEventNotification (HWND hwnd, DWORD dwevent) { TCHAR szargs[] = TEXT("This is my event notification string."); CE_NOTIFICATION_TRIGGER nt; HANDLE hnotify; TCHAR szexename[max_path], sztext[128]; memset (&nt, 0, sizeof (CE_NOTIFICATION_TRIGGER)); nt.dwsize = sizeof (CE_NOTIFICATION_TRIGGER); nt.dwtype = CNT_EVENT; nt.dwevent = dwevent; nt.lpszapplication = szexename; nt.lpszarguments = szargs; GetModuleFileName (hinst, szexename, sizeof (szexename)); // Set the notification. 101

103 DMA270 WinCE 5.0 操作流程 hnotify = CeSetUserNotificationEx (0, &nt, NULL); if (hnotify) wsprintf (sztext, TEXT ("Event notification set for %08x"), dwevent); else wsprintf (sztext, TEXT("Set Event notification failed rc: %d"), GetLastError()); MessageBox (hwnd, sztext, szappname, MB_OK); return 0; // // Add2List - Add string to the report list box. // void Add2List (HWND hwnd, LPTSTR lpszformat,...) { int i, nbuf; TCHAR szbuffer[512]; va_list args; va_start(args, lpszformat); nbuf = _vstprintf(szbuffer, lpszformat, args); i = SendDlgItemMessage (hwnd, IDD_OUTPUT, WM_SETTEXT, 0, (LPARAM)(LPCTSTR)szBuffer); va_end(args); //============================================================ // SetEventNotifyDlgProc - Callback function for Event dialog box // BOOL CALLBACK SetEventNotifyDlgProc (HWND hwnd, UINT wmsg, WPARAM wparam, LPARAM lparam) { DWORD dwevent; 102

104 第三章 實驗篇 switch (wmsg) { case WM_COMMAND: { WORD iditem = LOWORD (wparam); switch (iditem) { case IDOK: dwevent = 0; // IsDlgButtonChecked isn't defined in Win CE, so // a macro has been defined. if (IsDlgButtonChecked (hwnd, IDC_SYNC_END) == 1) dwevent = NOTIFICATION_EVENT_SYNC_END; if (IsDlgButtonChecked (hwnd, IDC_SERIAL_DETECT) == 1) dwevent = NOTIFICATION_EVENT_RS232_DETECTED; if (IsDlgButtonChecked (hwnd, IDC_DEVICE_CHANGE) == 1) dwevent = NOTIFICATION_EVENT_DEVICE_CHANGE; if (IsDlgButtonChecked (hwnd, IDC_TIME_CHANGE) == 1) dwevent = NOTIFICATION_EVENT_TIME_CHANGE; if (IsDlgButtonChecked (hwnd, IDC_RESTORE_END) == 1) dwevent = NOTIFICATION_EVENT_RESTORE_END; if (IsDlgButtonChecked (hwnd, IDC_POWER_UP) == 1) dwevent = NOTIFICATION_EVENT_WAKEUP; if (IsDlgButtonChecked (hwnd, IDC_TZ_CHANGE) == 1) dwevent = NOTIFICATION_EVENT_TZ_CHANGE; // Call my set event notification function above. MySetEventNotification (hwnd, dwevent); EndDialog (hwnd, 1); return TRUE; 103

105 DMA270 WinCE 5.0 操作流程 case IDCANCEL: EndDialog (hwnd, 0); return TRUE; break; return FALSE; //============================================================ // MonitorThread - Monitors event for timer notificaiton DWORD WINAPI MonitorThread (PVOID parg) { int rc; while (g_fcontinue) { rc = WaitForSingleObject (g_hnoteevent, INFINITE); if (!g_fcontinue) break; if (rc == WAIT_OBJECT_0) SendMessage (g_hmain, MYMSG_TELLNOTIFY, 0, (LPARAM)g_hNoteEvent); else break; return 0; 實驗步驟 (1) 通過 ActiveSync 將 NoteDemo.exe 上傳到 Windows CE,( 或者將 NoteDemo.exe 複製到 USB 隨身碟, 然後將 USB 隨身碟插入教學實驗平台 ) (2) 運作 NoteDemo.ex 104

106 第三章 實驗篇 實驗六 WinCE 下註冊表查看器的使用 實驗目的 瞭解 WinCE 下註冊表查看器的原理 瞭解 Windows CE 註冊表結構 掌握修改 Windows CE 註冊表 實驗內容 查看 WinCE 下的註冊表 修改註冊表的值, 改變 COM 埠的設定 實驗設備 DMA-PXA270 教學實驗平台 PC 主機 網路線 串列埠 連接線 電源 實驗原理 註冊表是 WinCE 系統儲存關於系統配置資訊的資料庫, 包括了系統運作時需要調整的運作方式的設定 Windows 註冊表中包括的項目有 : 每個用戶的配置檔 電腦上安裝的程式和每個程式可以建立的文件檔案類型 檔案夾和程式圖示的屬性設定 系統中的硬體 正在使用的埠等 註冊表按層次結構來組織, 由項 子選項 配置單元和值項組成 註冊表中包括如下各項 : HKEY_CURRENT_USER: 包含當前登錄用戶的配置資訊的根目錄 用戶檔案夾 螢幕顏色和 控制面板 " 設定儲存在此處 該資訊被稱為用戶配置檔 HKEY_USERS: 包含電腦上所有用戶的配置檔的根目錄 HKEY_CURRENT_USER 是 HKEY_USERS 的子選項 HKEY_LOCAL_MACHINE: 包含針對該系統 ( 對於任何用戶 ) 的配置資訊 HKEY_CLASSES_ROOT: 是 HKEY_LOCAL_MACHINE\Software 的子選項 此處儲存的資訊可以確保當使用 Windows 資源管理器打開檔案時, 將使用正確的應用程式打開對應的檔案類型 HKEY_CURRENT_CONFIG: 包含本地系統在系統啟動時所用的硬體配置檔案資 105

107 DMA270 WinCE 5.0 操作流程 訊 對於註冊表的修改, 需要使用專門的編輯器完成, 在 WinCE 中為我們提供了這個工具 而在 Platform Builder 5.0 中微軟新提供了一個針對多用戶系統的註冊表編輯器 在此要特別強調一點 : 一般來講註冊表不須要用戶自己修改, 因為其中包括了 WinCE 啟動和運作所必須的全部配置, 錯誤的設定將會導致應用程式無法運作 系統出錯, 直至系統崩潰或無法啟動 如果需要對註冊表進行編輯, 務必事先進行註冊表項目備份! 實驗步驟 1) 連接 USB Devices 的連接線, 保證 PC 主機通過 ActiveSync 能與運作 windows CE 的教學實驗平台連接 打開 Platform Builder 5.0, 並用滑鼠按下 Tools/Remote Registry Editor" 選單, 如下圖示 : 打開註冊表查看器如下圖示, 這樣就可以查看 修改 WinCE 的註冊表了 2) 選擇 Windows CE Device 為 Default Device" 106

108 第三章 實驗篇 如果連接不上, 請取消後在 connection 下選擇 Configure Windows CE Platform Manager" 將 Default Device" 的 Properties 配置成如下圖所示, 即將 Transport 和 Startup 都設定成 "Microsoft ActiveSync", 並連接上網路線, 且設為同一個網域 : 107

109 DMA270 WinCE 5.0 操作流程 連接上 windows CE device 後, 按照下面的方式 : 108

110 第三章 實驗篇 找到 TOUCH 的鍵值,TOUCH 配置的是螢幕定位點值, 使用者可以藉由更改設定來達到改變螢幕大小 練習題改變其螢幕定位設定值, 來改變螢幕大小 109

111 DMA270 WinCE 5.0 操作流程 實驗七 CF 卡讀寫實驗 實驗目的 瞭解 CF 卡的相關特性 掌握 Intel PXA270 對 CF 卡的操作 實驗內容 編寫程式, 實現向 CF 卡抹除 寫入一個檔案, 並讀出檢測 實驗設備 Intel PXA270 教學實驗平台 Platform Builder 和 Embeded Visual C++ 網路線 串列埠連接線 電源 CF 卡 實驗原理 1.CF 卡的特點 CompactFlash 卡全稱為 標準快閃記憶體卡 ", 簡稱 CF 卡 ". CompactFlash 提供了完整的 PCMCIA-ATA 功能而且通過 ATA/ATAPI-4 相容 TrueIDE 和 68 PIN 介面的 PCMCIA 卡不同, 同樣遵從 ATA 協定的 CompactFlash 的介面只有 50 PIN CF 卡使用 flash 作為儲存媒介, 無需供電也能保存資料, 而且工作時耗電量也很低, 它在 3.3V 或者 5V 的電壓下工作, 其耗電量只相當於傳統儲存設備如磁帶 硬碟的 3% 或更低, 適合用在移動設備上 ;CF 卡由兩個基本部分組成 : 控制晶片和快閃記憶體模組, 快閃記憶體用於儲存資訊, 控制晶片用來實現與主機的連接及控制資料在快閃記憶體模組中的傳輸 110

112 第三章 實驗篇 2.CF 卡工作原理現在的 CF 卡基本都使用 NAND 型 flash, CF 卡內部控制器設計完全比照硬碟, 而且使用標準的 ATA/IDE 介面介面, 可以很容易的通過 IDE 介面與電腦連接, 而且早已實現無驅動設計, 使用非常方便 CF 卡在自身設計上也做出了軟硬體兩方面的配合 : 一是硬體提供判斷條件 CF 卡在自身電路上提供了兩個用來檢測 CF 卡是否存在的接腳 ( 暫稱 CD1 和 CD2) CD1 和 CD2 的有效電位均為低電位, 當主機檢測到與其相連的 CD1 和 CD2 兩個接腳同時為低電位時, 可判斷出 CF 卡與主機相連 ; 當主機檢測到與其相連的 CD1 和 CD2 有一個接腳不為低電位, 則可判斷出 CF 卡未與主機相連 二是軟體 首先選定義總體變數 ( 如 : IsExist) 用於記錄 CF 卡是否與主機相連, 當 IsExist 為 0 時表示 CF 卡未與主機相連 ; 當 IsExist 為 1 時表示 CF 卡與主機相連 然後, 在每次操作 CF 卡時都先檢測 CF 卡的 CD1 和 CD2 接腳, 當檢測到 CD1 和 CD2 接腳為低電位且 IsExist 為 0 時重置 CF 卡, 重新檢 111

113 DMA270 WinCE 5.0 操作流程 測 CF 卡的 FAT 表統計還剩餘多少空間可以分配, 檢測完 FAT 表後置變數 IsExist 為 1; 當檢測到 CD1 和 CD2 接腳為低電位且 IsExist 為 1 時, 繼續 CF 卡的正常操作 ; 當檢測到 CD1 和 CD2 為高時, 停止 CF 卡操作, 設定變數 IsExist 為 0 CF 卡的暫存器也都是 8bit 的, 只有資料暫存器是 16bit CF 卡控制器中包含兩組暫存器 : 命令暫存器和控制暫存器, 這兩個暫存器組通過 REG 信號進行區分 CF 卡工作在記憶體方式時, 按照 ATA 標準以暫存器方式傳送資料 命令和位址, 命令暫存器用來接受命令和傳輸資料, 控制暫存器用來進行磁片控制 當 CF 卡工作在 I/O 方式時, 控制暫存器組主要用於控制 CF 卡的工作方式 ; 命令暫存器組被分配在與 ATA 標準相容的位址空間 當 CF 卡工作在 I/O 方式下, 命令暫存器組的位址空間為 IF0H~1F7H 和 3F6H~3F7H; 當 CF 卡工作在暫存器方式下, 命令暫存器組的位址空間為 1F0H~1FFH CF 卡的暫存器包括 : 資料暫存器 (R/W), 用於對磁區的讀寫操作 主機通過該暫存器向 CF 卡控制器寫入或從 CF 卡控制暫存器讀出磁區緩衝區的資料 ; 錯誤暫存器 (R) 和特性暫存器 (W), 錯誤暫存器反映控制暫存器在診斷方式或操作方式下的錯誤原因 特性暫存器一般情況下不使用 磁區數暫存器 (R/W), 用來記錄讀 寫命令的磁區數目 ; 磁區號暫存器 (R/W), 用來記錄讀 寫和校驗命令指定的起始磁區號 ; 柱面號暫存器 (R/W), 用來記錄讀 寫 校驗和定址命令指定的柱面號 ; 驅動器 / 磁頭暫存器 (R/W), 記錄讀 寫 校驗和尋找命令指定的驅動器號 磁頭號和定址方式 (CHS 模式或 LBA 模式 ); 狀態暫存器 (R) 和命令暫存器 (W), 狀態暫存器反映 CF 卡驅動器執行命令後的狀態, 讀該暫存器要清除中斷請求信號, 命令暫存器接收主機發送的 CF 卡工作的控制命令 CF 卡的磁區定址有兩種方式 : 物理定址方式 (CHS) 和邏輯定址方式 (LBA) 物理定址方式使用柱面 磁頭和磁區號表示一個特定的磁區, 起始磁區是 0 磁軌 0 磁頭 1 磁區, 接下來是 2 磁區, 一直到 EOF 磁區 ; 接下來是同一柱面 1 頭 1 磁區等 邏輯定址方式將整個 CF 卡同一定址 邏輯區塊位元元址和物理位元元址的關係為 :LBA 位址 =( 柱面號 磁頭數 + 磁頭號 ) 磁區數 + 磁區數 -1 在 CF 卡上寫入一個檔案的過程是這樣的, 在 CF 卡初始化後 (CF 卡開啟電源重置和統計剩餘空間等工作已經完成 ), 控制器中 DSP 開始向 CF 卡的一些暫存器填寫必要的資訊, 如向磁區號暫存器填寫讀寫資料的起始磁區號 (LBA 位址 ) 和磁區數暫存器填寫讀寫資料所占的磁區個數等, 然後向 CF 卡的命令暫存器寫入 CF 卡操作的命令, 112

114 第三章 實驗篇 如寫入操作則向 CF 卡的命令暫存器寫入 30H, 讀取操作向 CF 卡的命令暫存器寫入 20H 等 刪除或者再編寫程式的過程相似 CF 卡與硬碟有很多相似之處, 不過有一點是完全不同的, 那就是 CF 卡沒有機械結構, 所以一些操作是以虛擬方式進行 CF 卡工作時一般採用邏輯定址方式, 它沒有磁頭和磁軌的轉換操作, 因此在取用連續磁區時, 操作速度比物理定址方式快, CF 卡與可以完全像硬碟一樣使用 3.CF 卡協議 Compact Flash 協會制定了 CF+/Compact Flash 規格, 最新版本為 V2.0 CF 卡遵循 ATA 標準製造, 不過它的介面是 50 PIN 而不是 68 PIN, 分成兩排, 每排 25 個 PIN CF 卡不是硬碟那樣的針型介面而是 50mil(1.27 mm) 的孔型介面, 因此不容易被損壞, 這一設計和 PC 卡類似 CF+ 是 Compact Flash 的衍生技術規格,CF+ 的物理規格和 CF 完全相同, 但 CF+ 卡並不是 CF 卡那樣的 ATA 快閃記憶體記憶體, 而主要是相同規格的 I/O 設備, 如 CF 串列埠卡 CF modem CF 藍芽 CF USB 卡 CF 網卡 CF GPS 卡 CF GPRS 卡等. CF 卡分為兩類 :Type I 和 Type II, 二者的規格和特性基本相同 從下表大家可以看出,Type II 型 CF 卡和 Type I 型 CF 卡相比, 只是在外形上顯得厚了一些 Type I CF/CF+ 卡 Type II CF/CF+ 卡長 36.4±0.15mm (1.433±0.006in.) 36.4±0.15mm (1.433±0.006in.) 寬 42.80±0.10mm (1.685±0.004in.) 42.80±0.10mm (1.685±0.004in.) 厚 3.3mm±0.10mm(0.130±0.004in.) 5.0mm maximum(0.1968in.maximum) 4.CF 卡介面電路 CF 卡有三種工作模式 :Memory 方式,I/O 方式以及 True IDE 方式. 在這裡我們選擇的是 True IDE 方式 DMA-PXA270 教學平台採用的是 TrueIDE 模式,50 PIN 的接腳介面, 完全與硬碟的接腳介面一樣,CF 卡的介面原理圖如下 : 113

115 DMA270 WinCE 5.0 操作流程 在 TrueIDE 模式下, 關鍵接腳說明 : A2~A0 :A2~A0 被用來挑選 8 個 Task file 暫存器, 其他的位址線拉低 ; CD1,CD2 : 用來檢測 CF 卡 ; CS0,CS1 :CS0: 選擇 Task file 暫存器 ; CS1: 用來選擇狀態和設備控制暫存器 ; CSEL : 主 / 從模式選擇, 內部上拉 ; 0 : 主模式 ; 斷開 : 從模式 ; D15~D0 : 資料線, 傳輸的資料是 8 位元時,D7~D0 傳輸資料 ; 傳輸的資料是 16 位元時,D15~D0 傳輸資料 ; DMARQ :DMA 傳輸請求 ; IQRD :I/O 讀取信號 ; 114

116 第三章 實驗篇 IQWR :I/O 寫入信號 ; ATASEL :TrueIDE 模式致能, 要工作在 TrueIDE 模式下, 該接腳要拉低 ; DMACK :DMA 傳輸應答, 這裡沒有用到 ; RESET : 低電位重置 ; IORDY :IDRDY 信號 ; WE : 要拉高, 與 VCC 相連 ; 5.Windows CE 儲存管理器介紹像硬碟 CF 卡等儲存設備在 Windows CE 中屬於週邊儲存設備, 對這些週邊儲存設備以及它們使用的檔案系統和區塊設備驅動程式的管理都是由儲存管理器負責的 儲存管理器的功能由系統中的 fsdmgr.dll 模組實現的, 它包含區塊設備驅動程式管理器 分區管理器以及檔案系統驅動程式管理器 Windows CE 下儲存管理器的體系結構如下 : 從圖可以看出, 儲存管理器是一個分層結構, 一次完整的磁片 I/O 操作必需經過儲存管理器的各個層 首先到達的是篩檢程式層, 它的功能是加密 壓縮和病毒掃描等工作 之後到達的是檔案系統驅動程式, 檔案系統驅動程式層對參數進行格式化, 將檔案 115

117 DMA270 WinCE 5.0 操作流程 名轉換為區塊設備驅動程式可以識別的設備位址 在這之後, 就可以經分區管理器或直接交由區塊設備驅動程式完成最終的 I/O 操作 檔案系統驅動程式的作用是向用戶提供一個按名取用的檔案系統介面, 它建立在區塊設備驅動程式之上, 完成了對區塊設備驅動的進一步抽像, 把毫無規律的資料區塊組織成檔案, 提供檔操作的函數介面 Windows CE 支援大多數 Windows 桌面平台上使用的檔案 I/O 函數, 比如 CreateFile ReadFile WriteFile 和 CloseHandle 等 Win32 API 同時,Windows CE 仍然遵循使用控制碼對檔案進行取用的方法 分區驅動程式管理儲存設備的分區, 並負責分區的裝載和卸載,Windows CE 可以同時支援多個分區驅動程式, 但是對一個指定的儲存設備來講只能使用一個分區驅動程式, 由它解釋設備上的所有分區 區塊設備驅動主要是提供對儲存設備的分塊操作, 區塊的大小一般是固定的, 常用的是 512 位元組 1KB 位元組 2KB 位元組和 4KB 位元組 區塊設備驅動程式向上層輸出一個介面, 應用程式通過 CreateFile 和 ReadFile 這些標準的檔案系統 API 對區塊設備進行取用 6.CF 卡的取用過程下面以 CreateFile 的執行過程, 說明取用 CF 卡的過程 當使用 CreateFile 打開 CF 卡時, 執行的流程如下 : Application CreateFile CoreDll xxx CreateFilew NK SC CreateFileW FileSys FS CreateFileW CoreDLL xxx AFS CreateFilew 116

118 第三章 實驗篇 FSDMGR FSDMGR CreateFile FATFSD FAT CreateFileW FATFSD OpenName FATFSD OpenPath FATFSD CreateName FATFSD CommitBufferSet FATFSD CommitBuffer FATFSD WriteVolume FATFSD ReadWriteDisk FATFSD ReadWriteDisk2 117

119 DMA270 WinCE 5.0 操作流程 從執行流程可以看出, 當發生系統調整到最終執行 FAT_CreateFileW, 中間經過了 COREDLL,NK,FILESYS,FSDMGR 這些程式調整, 使用 ReadFile WriteFile 取用 CF 卡時, 也需要經過這幾個模組 實驗步驟 1) 插上 CF 卡, 等 Windows CE 識別 CF 卡以後, 再操作以下步驟 如果 Windows CE 識別了 CF 卡, 在根目錄下, 能看到 儲存卡 " 目錄, 如果沒有找到, 請將 CF 卡拔下來, 再試著插上, 直到找 CF 卡 2) 通過 ActiveSync 將 CFTest.exe 上傳到 Windows CE,( 或者將 CFTest.exe 複製到 USB 隨身碟, 然後將 USB 隨身碟插入教學實驗平台 ) 3) 雙擊 CFTest.exe 圖示, 運作 CFTest.exe 4) 在 CFTest 功能表下, 選擇 Write, 首先想 CF 卡裡寫入一個檔案, 在提供的實驗程式裡, 是寫入 Test.txt 檔, 檔裡的內容是 ucdragon:this is a test 5) 在 CF 卡的目錄下, 即 儲存卡 " 目錄下, 找到 Test.txt 文件 6) 用串列埠線將 PC 主機的 COM1 與實驗箱的 UART1 連起來,( 如果您還不知道如何連接的話, 請參照 DMA-PXA270 的使用手冊 7) 在 CFTest 功能表下, 選擇 Read, 將剛才寫入的檔案讀取出來, 檔案的內容通過串列埠資訊顯示出來, 所以, 從串列埠列印資訊, 能夠看到列印出來了 ucdragon:this is a test CF 應用程式編寫程式實例相關函數說明 : 對區塊設備一般使用下面幾個 API 函數操作 : CreateFile 在指定的設備上打開或者建立一個檔案 ReadFile 讀取文件 WriteFile 寫入文件 完整的程式請看用戶光碟 \wince\application\cftest 目錄 練習題 參照示例程式, 自己編寫一個程式取用 CF 卡, 包括對 CF 的讀和寫 118

120 第三章 實驗篇 實驗八 SD 卡介面實驗 實驗目的 認識 SD 卡匯流排協定及工作原理 掌握 SD 卡儲存設備的使用方法 實驗內容 SD 卡讀 \ 寫實驗 實驗設備 DMA-PXA270 實驗箱 SD 儲存卡一張 實驗原理 1.SD 卡匯流排協定及工作原理 SD 卡是可靠數位儲存卡 (Secure Digital Memory Card) 的英文縮寫 它是由松下電器 Matsushita Electric Industrial Co., Ltd 東芝 Toshiba Corp. 和 SanDisk 聯合推出,1999 年 8 月才首次發佈 SD 卡資料傳送和物理規範由 MMC 發展而來, 它是為滿足最新的視聽類消費電子產品對安全 容量 性能等有特殊要求的環境而設計的 SD 卡作為一種新型的儲存設備, 具有以下特點 : 內置加密技術, 適應基於 SDMI 協議的著作版權保護功能 ; 高速資料傳送 ; 高儲存容量 ; 體積輕小, 便於攜帶, 具有很強的抗衝擊 SD 卡的一些電氣參數 : 物理特性 : 大小和 MMC 差不多, 尺寸為 32mm x 24mm x 2.1mm 長寬和 MMC 一樣, 只是厚了 0.7mm, 以容納更大容量的儲存單元 電源要求 : 電壓 3.3V±10%;5.0V±10% 讀取電流 :[email protected];[email protected] 寫入電流 :[email protected];[email protected] 119

121 DMA270 WinCE 5.0 操作流程 資料傳輸速度 :2M/s 使用環境 : 抗衝擊 :50Gs@11ms 抗震動 :15Gs peak- to-peak 使用溫度 :0 55 保存溫度 : SD 卡基於 9 針介面, 最大可工作在 25MHz 下面是 SD 卡的結構 : SD 卡接腳說明 : 2.SD 卡匯流排 SD 儲存卡定義了兩種可選擇的匯流排協定, 分別是 SD 和 SPI 與 SD 卡通訊的主機一方可以透明的選擇與 SD 的通訊模式 1) SD 匯流排 SD 匯流排包括以下的信號 : 120

122 第三章 實驗篇 CLK: 主機與卡之間的同步時脈 CMD: 雙向的命令 / 反饋信號 DAT0-DAT3: 4 位雙向的資料傳輸線 VDD, VSS1,VSS2: 電源和地信號通過同步星型拓撲,SD 匯流排可以接一個主 SD 卡, 或者多個從 SD 卡 時脈, 電源和地信號是所有卡公用的 主機和每張 SD 卡的 CMD, DAT0-DAT3 信號連線必須點對點的進行連接 以下是 SD 匯流排連接圖 : 2) SPI 匯流排相容 SD 卡的 SPI 通訊模式是一種通過 SPI 通道取用 SD 卡的方式 SPI 標準僅僅定義了物理連接方式, 並未包括完整的資料傳輸協議 SD 卡的 SPI 匯流排實現方式使用了和 SD 匯流排相同的命令集 從應用的角度來看, 使用 SPI 匯流排模式的好處是它對主機的性能要求降至最低, 另一方面, 它也為產品設計成最小化作出了努力 它的不利之處是降低了系統的性能, 也沒有 SD 匯流排那樣更多的連接選項 一般而言, 相容 SD 卡的 SPI 匯流排包含以下信號 : CS: 主機到卡晶片之間的晶片選擇選信號 CLK: 主機與卡之間的同步時脈 DataIn: 主機到卡之間的資料登錄信號 DataOut: 主機到卡之間的資料輸出信號以下是 SPI 匯流排連接圖 : 121

123 DMA270 WinCE 5.0 操作流程 3. 匯流排協定 1)SD 匯流排協定 SD 匯流排上的通訊是以命令封包, 反饋封包和資料封包進行的, 這幾種封包格式都包含起始位和停止位元 命令封包命令封包用來傳輸了一個操作命令的旗號 反饋封包反饋封包是從位址卡或者所有的連接卡發送給主機的作為對以前接收到的命令封包做出應答的旗號 數據封包資料封包用來在卡和主機之間進行真正的有用的資料傳輸 資料是通過資料連結進行傳輸的 SD 匯流排協定的資料傳輸是以資料區塊的方式進行的 資料區塊之後通常跟著 CRC 校驗碼 在協定中定義了資料傳輸的方式可以是單區塊和多區塊傳輸 多區塊傳輸在進行寫卡操作時的速度比單區塊傳輸快得多 多塊傳輸會在 CMD 線路上出現 122

124 第三章 實驗篇 一個停止命令封包時中斷傳輸 以下是對 SD 卡進行讀操作時的資料塊傳輸時序圖 : 寫入操作和讀取操作在時序上的不同在於資料線路 DAT0 上多了一個寫入操作忙的信號 以下是對 SD 卡進行寫操作時的資料區塊傳輸時序圖 : BUS BUS 123

125 DMA270 WinCE 5.0 操作流程 2)SPI 匯流排雖然 SD 通道是面向有起止位元的控制封包和資料流程格式的傳輸, 但是 SPI 通道是面向位元組的傳輸 SPI 的命令和資料塊都是按 8 個 Bit 為單位進行分組的, 和 SD 協定相似,SPI 的資訊也分為控制封包, 反饋封包和資料封包, 所有主機和卡之間的通訊都被主機進行控制, 主機通過拉低 CS 信號以開始一個匯流排事務 SPI 的反饋方式和 SD 協定相比有以下三個方面的不同 : (1) 被選中的卡必須時刻對命令封包做出回應 (2) 使用兩種新的回應結構 (8 位元或 16 位 ) (3) 當卡獲取資料出問題時, 它將發出一個出錯反饋封包通知主機, 而不是使用超時檢測的方式 除了需要對命令封包做出反饋之外, 在進行寫卡操作期間, 還需要對每一個發送到卡的資料區塊發一個特別的資料反饋旗號 單區塊和多區塊的資料讀取命令在 SPI 模式中也得到支援 然而, 為了遵守 SPI 工業標準, 僅有兩種 ( 無方向 ) 的信號的得到使用 以下是 SPI 模式的讀操作的時序圖 : 一個合法的資料區塊的結尾應當包括 16 位元的 CRC 校驗部分,CRC 校驗值是按照標準的 CCITT 的 X 的 16 次方 +X 的 12 次方 +X 的 5 次方 +1 產生的 一旦資料讀取出現錯誤, 卡就不會再傳輸資料, 取而代之的是發送一個資料出錯旗 124

126 第三章 實驗篇 號給主機 下圖描繪了資料讀取出錯時的處理時序 : 在 SPI 模式中也支援單區塊和多區塊的資料寫命令 卡從主機端接收到一個資區料塊之後, 它就會發一個資料響應旗號給主機, 如果接收的資料經校驗無錯, 就把資料寫入卡的儲存介質中 如果卡正在忙於往儲存介質中寫資料時, 它會持續發一個 工作忙 " 的旗號給主機 以下是 SPI 模式的寫操作的時序圖 : 125

127 DMA270 WinCE 5.0 操作流程 4.Intel PXA270 的 SD 卡控制暫存器 Intel PXA270 整合了 SD(Secure Digital Interface) 控制暫存器, 以下是 MMC/SD/SDIO 控制器與 SD 卡的關係 5.Intel PXA270 的 SD 卡介面原理圖下面列出 PXA270 的 SD 卡介面原理圖如下 : 6.SD 卡使用的檔案系統介紹像硬碟,CF 卡等儲存設備在 Windows CE 中屬於週邊儲存設備, 對這些週邊儲存設備以及它們使用的檔案系統和區塊設備驅動程式的管理都是由儲存管理器負責的 儲存管理器的功能由系統中的 fsdmgr.dll 模組實現的, 它包含區塊設備驅動程式管理器 分區管理器以及檔案系統驅動程式管理器 Windows CE 下儲存管理器的體系結構如下 : 126

128 第三章 實驗篇 從圖可以看出, 儲存管理器是一個分層結構, 一次完整的磁片 I/O 操作必需經過儲存管理器的各個層 首先到達的是篩檢程式層, 它的功能是加密 壓縮和病毒掃描等工作 之後到達的是檔案系統驅動程式, 檔案系統驅動程式層對參數進行格式化, 將檔案名轉換為區塊設備驅動程式可以識別的設備位址 在這之後, 就可以經分區管理器或直接交由區塊設備驅動程式完成最終的 I/O 操作 檔案系統驅動程式的作用是向用戶提供一個按名取用的檔案系統介面, 它建立在區塊設備驅動程式之上, 完成了對區塊設備驅動的進一步抽像, 把毫無規律的資料區塊組織成檔案, 提供檔操作的函數介面 Windows CE 支援大多數 Windows 桌面平台上使用的檔案 I/O 函數, 比如 CreateFile ReadFile WriteFile 和 CloseHandle 等 Win32 API 同時,Windows CE 仍然遵循使用控制碼對檔案進行取用的方法 分區驅動程式管理, 管理儲存設備的分區, 並負責分區的裝載和卸載,Windows CE 可以同時支援多個分區驅動程式, 但是對一個指定的儲存設備來講只能使用一個分區驅動程式, 由它解釋設備上的所有分區 區塊設備驅動主要是提供對儲存設備的分區塊操作, 區塊的大小一般是固定的, 常用的是 512 位元組 1KB 位元組 2KB 位元組和 4KB 位元組 區塊設備驅動程式向上層輸出一個介面, 應用程式通過 CreateFile 和 ReadFile 這些標準的檔案系統 API 對區塊設備進行取用 127

129 DMA270 WinCE 5.0 操作流程 7. 在 Windows CE 裡,SD 的取用過程 請看上一節 CF 的取用過程,SD 卡和 CF 卡都屬於週邊儲存設備, 取用方式相同 實驗過程 1) 插上 SD 卡, 等 Windows CE 識別 SD 卡以後, 再操作以下步驟 如果 Windows CE 識別了 SD 卡, 在根目錄下, 能看到 卸除式磁碟 ", 如果沒有找到, 請將 SD 卡拔下, 再試著插上, 直到找 SD 卡 2) 通過 ActiveSync 將 SDTest.exe 上傳到 Windows CE,( 或者將 CFTest.exe 複製到 USB 隨身碟, 然後將 USB 隨身碟插入教學實驗平台 ) 3) 用滑鼠雙擊 SDTest.exe 圖示, 運 SDTest.exe 4) 在 SDTest 功能表下, 選擇 Write, 首先向 SD 卡裡寫入一個檔案, 在提供的實驗程式裡, 是寫入 Test.txt 檔, 檔案裡的內容是 " DMATEK:This is a test" 5) 在 SD 卡的目錄下, 即 卸除式磁碟 " 目錄下, 找到 Test.txt 文件 6) 用串列埠線將 PC 主機的 COM1 與實驗箱的 UART1 連起來,( 如果您還不知道如何連接的話, 請參照 DMA-PXA270 的使用手冊 ) 7) 在 SDTest 功能表下, 選擇 Read, 將剛才寫入的檔案讀取出來, 檔案的內容通過串列埠資訊顯示出來, 所以, 從串列埠列印資訊, 能夠看到列印出來了 ucdragon:this is a test SD 卡應用程式編寫程式實例相關函數說明 : 對區塊設備一般使用下面幾個 API 函數操作 : CreateFile 在指定的設備上打開或者建立一個檔案 ReadFile 讀取文件 WriteFile 寫入文件完整的程式請看用戶光碟 \wince\application\sdtest 目錄 練習題 參照示例程式, 自己編寫一個程式取用 CF 卡, 包括對 CF 的讀和寫 128

The golden pins of the PCI card can be oxidized after months or years

The golden pins of the PCI card can be oxidized after months or years Q. 如何在 LabWindows/CVI 編譯 DAQ Card 程式? A: 請參考至下列步驟 : 步驟 1: 安裝驅動程式 1. 安裝 UniDAQ 驅動程式 UniDAQ 驅動程式下載位置 : CD:\NAPDOS\PCI\UniDAQ\DLL\Driver\ ftp://ftp.icpdas.com/pub/cd/iocard/pci/napdos/pci/unidaq/dll/driver/

More information

TPM BIOS Infineon TPM Smart TPM Infineon TPM Smart TPM TPM Smart TPM TPM Advanced Mode...8

TPM BIOS Infineon TPM Smart TPM Infineon TPM Smart TPM TPM Smart TPM TPM Advanced Mode...8 Smart TPM Rev. 1001 Smart TPM Ultra TPM Smart TPM TPM...3 1. BIOS... 3 2. Infineon TPM Smart TPM... 4 2.1. Infineon TPM...4 2.2. Smart TPM...4 3. TPM... 5 3.1. Smart TPM TPM...5 3.2. Advanced Mode...8

More information

epub83-1

epub83-1 C++Builder 1 C + + B u i l d e r C + + B u i l d e r C + + B u i l d e r C + + B u i l d e r 1.1 1.1.1 1-1 1. 1-1 1 2. 1-1 2 A c c e s s P a r a d o x Visual FoxPro 3. / C / S 2 C + + B u i l d e r / C

More information

indows CE 1996 Semiconductor Industry Association (SIA) Windows CE Windows Embedded CE 6.0 Windows CE Windows Embedded CE 6.0 Micr

indows CE 1996 Semiconductor Industry Association (SIA) Windows CE Windows Embedded CE 6.0 Windows CE Windows Embedded CE 6.0 Micr Windows Embedded CE 6.0 Windows Embedded CE 6.0 : Windows Embedded CE 6.0 : Windows CE Windows Embedded CE 6.0 API CE 6.0 Windows CE W indows CE 1996 Semiconductor Industry Association (SIA) 1994 1000

More information

Autodesk Product Design Suite Standard 系統統需求 典型使用用者和工作流程 Autodesk Product Design Suite Standard 版本為為負責建立非凡凡產品的設計師師和工程師, 提供基本概念設計計和製圖工具, 以取得令人驚驚嘆

Autodesk Product Design Suite Standard 系統統需求 典型使用用者和工作流程 Autodesk Product Design Suite Standard 版本為為負責建立非凡凡產品的設計師師和工程師, 提供基本概念設計計和製圖工具, 以取得令人驚驚嘆 Autodesk Product Design Suite Standard 20122 系統統需求 典型使用用者和工作流程 Autodesk Product Design Suite Standard 版本為為負責建立非凡凡產品的設計師師和工程師, 提供基本概念設計計和製圖工具, 以取得令人驚驚嘆的產品設計計 Autodesk Product Design Suite Standard 版本中中包括以下軟體體產品

More information

Microsoft Word zw

Microsoft Word zw 第 1 章 Android 概述 学习目标 : Android Android Android Studio Android Android APK 1.1 1. 智能手机的定义 Smartphone 2. 智能手机的发展 1973 4 3 PC IBM 1994 IBM Simon PDA PDA Zaurus OS 1996 Nokia 9000 Communicator Nokia 9000

More information

CC213

CC213 : (Ken-Yi Lee), E-mail: [email protected] 9 [P.11] : Dev C++ [P.12] : http://c.feis.tw [P.13] [P.14] [P.15] [P.17] [P.23] Dev C++ [P.24] [P.27] [P.34] C / C++ [P.35] 10 C / C++ C C++ C C++ C++ C ( ) C++

More information

概述

概述 OPC Version 1.6 build 0910 KOSRDK Knight OPC Server Rapid Development Toolkits Knight Workgroup, eehoo Technology 2002-9 OPC 1...4 2 API...5 2.1...5 2.2...5 2.2.1 KOS_Init...5 2.2.2 KOS_InitB...5 2.2.3

More information

任務二 : 產生 20 個有炸彈的磚塊, 放在隨機的位置編輯 Block 類別的程式碼 import greenfoot.; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) Write a description of class

任務二 : 產生 20 個有炸彈的磚塊, 放在隨機的位置編輯 Block 類別的程式碼 import greenfoot.; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) Write a description of class 踩地雷遊戲 高慧君南港高中 開啟專案 MineSweep 任務一 : 產生 30X20 個磚塊編輯 Table 類別的程式碼 import greenfoot.; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) import java.util.arraylist; Write a description of class MyWorld

More information

ebook50-11

ebook50-11 11 Wi n d o w s C A D 53 M F C 54 55 56 57 58 M F C 11.1 53 11-1 11-1 MFC M F C C D C Wi n d o w s Wi n d o w s 4 11 199 1. 1) W M _ PA I N T p W n d C W n d C D C * p D C = p W n d GetDC( ); 2) p W n

More information

Windows XP

Windows XP Windows XP What is Windows XP Windows is an Operating System An Operating System is the program that controls the hardware of your computer, and gives you an interface that allows you and other programs

More information

PowerPoint Presentation

PowerPoint Presentation 1 概 述 概 述 基 本 概 念 回 顾 微 软 的 嵌 入 式 平 台 WinCE 系 统 定 制 简 介 WinCE 应 用 开 发 简 介 2 嵌 入 式 系 统 - 基 本 概 念 回 顾 嵌 入 式 系 统 什 么 是 嵌 入 式 系 统 嵌 入 式 系 统 特 点 嵌 入 式 系 统 的 二 种 应 用 模 式 嵌 入 式 系 统 结 构 嵌 入 式 操 作 系 统 什 么 是 嵌 入

More information

46 2011 11 467 數位遊戲式學習系統 7 2011 11 467 47 3 DBGameSys 48 2011 11 467 正規化資料模組 如何配置並儲存電子化資料 以 便減少資料被重覆儲存的程序 DBGameSys的主要功能模組包 學習者 審核評分模組 含 正規化資料模組 審核評分 模組 高分列表模組3大區塊 系統資料庫 在正規化資料模組的執行 高分列表模組 過程中 先要求學習者瀏覽遊戲

More information

Symantec™ Sygate Enterprise Protection 防护代理安装使用指南

Symantec™ Sygate Enterprise Protection 防护代理安装使用指南 Symantec Sygate Enterprise Protection 防 护 代 理 安 装 使 用 指 南 5.1 版 版 权 信 息 Copyright 2005 Symantec Corporation. 2005 年 Symantec Corporation 版 权 所 有 All rights reserved. 保 留 所 有 权 利 Symantec Symantec 徽 标 Sygate

More information

ARM JTAG实时仿真器安装使用指南

ARM JTAG实时仿真器安装使用指南 ARM JTAG Version 1.31 2003. 11. 12 ARM JTAG ARM JTAG.3 ARM 2.1.4 2.2.4 ARM JTAG 3.1 18 3.2 18 3.2.1 Multi-ICE Server.18 3.2.2 ADS..21 ARM JTAG 4.1 Multi-ICE Server 33 4.1.1 Multi-ICE Server..... 33 4.1.2

More information

(Load Project) (Save Project) (OffLine Mode) (Help) Intel Hex Motor

(Load Project) (Save Project) (OffLine Mode) (Help) Intel Hex Motor 1 4.1.1.1 (Load) 14 1.1 1 4.1.1.2 (Save) 14 1.1.1 1 4.1.2 (Buffer) 16 1.1.2 1 4.1.3 (Device) 16 1.1.3 1 4.1.3.1 (Select Device) 16 2 4.1.3.2 (Device Info) 16 2.1 2 4.1.3.3 (Adapter) 17 2.1.1 CD-ROM 2 4.1.4

More information

Bus Hound 5

Bus Hound 5 Bus Hound 5.0 ( 1.0) 21IC 2007 7 BusHound perisoft PC hound Bus Hound 6.0 5.0 5.0 Bus Hound, IDE SCSI USB 1394 DVD Windows9X,WindowsMe,NT4.0,2000,2003,XP XP IRP Html ZIP SCSI sense USB Bus Hound 1 Bus

More information

投影片 1

投影片 1 軟體說明書繁體中文 RGB A 目錄 - CONTENTS 01 09 15 17 22 軟體主介面 巨集設定說明 主介面概觀 個人設定檔 (Profiles) 一般模式 / 遊戲模式 按鍵功能分配 巨集管理器概觀 巨集管理器 巨集錄製設定 巨集錄製時間列表 插入指令 閃移系統 - I.S.S (Instant Shift System) 燈光設定更新韌體 閃移系統啟動鈕設定說明 燈光設定介面 介面區域一

More information

AL-M200 Series

AL-M200 Series NPD4754-00 TC ( ) Windows 7 1. [Start ( )] [Control Panel ()] [Network and Internet ( )] 2. [Network and Sharing Center ( )] 3. [Change adapter settings ( )] 4. 3 Windows XP 1. [Start ( )] [Control Panel

More information

BOOL EnumWindows(WNDENUMPROC lparam); lpenumfunc, LPARAM (Native Interface) PowerBuilder PowerBuilder PBNI 2

BOOL EnumWindows(WNDENUMPROC lparam); lpenumfunc, LPARAM (Native Interface) PowerBuilder PowerBuilder PBNI 2 PowerBuilder 9 PowerBuilder Native Interface(PBNI) PowerBuilder 9 PowerBuilder C++ Java PowerBuilder 9 PBNI PowerBuilder Java C++ PowerBuilder NVO / PowerBuilder C/C++ PowerBuilder 9.0 PowerBuilder Native

More information

ebook140-8

ebook140-8 8 Microsoft VPN Windows NT 4 V P N Windows 98 Client 7 Vintage Air V P N 7 Wi n d o w s NT V P N 7 VPN ( ) 7 Novell NetWare VPN 8.1 PPTP NT4 VPN Q 154091 M i c r o s o f t Windows NT RAS [ ] Windows NT4

More information

INTRODUCTION TO COM.DOC

INTRODUCTION TO COM.DOC How About COM & ActiveX Control With Visual C++ 6.0 Author: Curtis CHOU [email protected] This document can be freely release and distribute without modify. ACTIVEX CONTROLS... 3 ACTIVEX... 3 MFC ACTIVEX

More information

<4D F736F F D D342DA57CA7DEA447B14D2DA475B57BBB50BADEB27AC3FEB14DA447B8D5C344>

<4D F736F F D D342DA57CA7DEA447B14D2DA475B57BBB50BADEB27AC3FEB14DA447B8D5C344> 1. 請 問 誰 提 出 積 體 電 路 (IC) 上 可 容 納 的 電 晶 體 數 目, 約 每 隔 24 個 月 (1975 年 更 改 為 18 個 月 ) 便 會 增 加 一 倍, 效 能 也 將 提 升 一 倍, 也 揭 示 了 資 訊 科 技 進 步 的 速 度? (A) 英 特 爾 (Intel) 公 司 創 始 人 戈 登. 摩 爾 (Gordon Moore) (B) 微 軟 (Microsoft)

More information

int *p int a 0x00C7 0x00C7 0x00C int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++;

int *p int a 0x00C7 0x00C7 0x00C int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++; Memory & Pointer [email protected] 2.1 2.1.1 1 int *p int a 0x00C7 0x00C7 0x00C7 2.1.2 2 int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++; 2.1.3 1. 2. 3. 3 int A,

More information

Panaboard Overlayer help

Panaboard Overlayer help Panaboard Overlayer Image Capture Software for Electronic Whiteboard (Panaboard) ... 3... 5... 6... 13...14 Panaboard Overlayer 1. 2. 3. 4. 4-1. 4-2. [ / ] ( ) 4-3. 5. 6. 6-1. 6-2. [ / ] ( ) 7. Panaboard

More information

IP505SM_manual_cn.doc

IP505SM_manual_cn.doc IP505SM 1 Introduction 1...4...4...4...5 LAN...5...5...6...6...7 LED...7...7 2...9...9...9 3...11...11...12...12...12...14...18 LAN...19 DHCP...20...21 4 PC...22...22 Windows...22 TCP/IP -...22 TCP/IP

More information

1

1 磁軌式讀卡機 1288 系列 使用手冊 Version 1.0 1 2 3 4 5 6 7 8 9 10 11 12 1288 MSR Micro controller : With Decoder Open Visual COM port to read data (UART Interface) From 1288 Or direct control 1288 by sending Command

More information

ebook140-9

ebook140-9 9 VPN VPN Novell BorderManager Windows NT PPTP V P N L A V P N V N P I n t e r n e t V P N 9.1 V P N Windows 98 Windows PPTP VPN Novell BorderManager T M I P s e c Wi n d o w s I n t e r n e t I S P I

More information

PPBSalesDB.doc

PPBSalesDB.doc Pocket PowerBuilder SalesDB Pocket PowerBuilder PDA Pocket PowerBuilder Mobile Solution Pocket PowerBuilder Pocket PowerBuilder C:\Program Files\Sybase\Pocket PowerBuilder 1.0 %PPB% ASA 8.0.2 ASA 9 ASA

More information

, 7, Windows,,,, : ,,,, ;,, ( CIP) /,,. : ;, ( 21 ) ISBN : -. TP CIP ( 2005) 1

, 7, Windows,,,, : ,,,, ;,, ( CIP) /,,. : ;, ( 21 ) ISBN : -. TP CIP ( 2005) 1 21 , 7, Windows,,,, : 010-62782989 13501256678 13801310933,,,, ;,, ( CIP) /,,. : ;, 2005. 11 ( 21 ) ISBN 7-81082 - 634-4... - : -. TP316-44 CIP ( 2005) 123583 : : : : 100084 : 010-62776969 : 100044 : 010-51686414

More information

Chapter 2

Chapter 2 2 (Setup) ETAP PowerStation ETAP ETAP PowerStation PowerStation PowerPlot ODBC SQL Server Oracle SQL Server Oracle Windows SQL Server Oracle PowerStation PowerStation PowerStation PowerStation ETAP PowerStation

More information

Simulator By SunLingxi 2003

Simulator By SunLingxi 2003 Simulator By SunLingxi [email protected] 2003 windows 2000 Tornado ping ping 1. Tornado Full Simulator...3 2....3 3. ping...6 4. Tornado Simulator BSP...6 5. VxWorks simpc...7 6. simulator...7 7. simulator

More information

ActiveX Control

ActiveX Control ActiveX Control For Visual Basic 2005.NET [ 版本 : 1.0] 1 安裝 Windows 驅動程式 請依照下列步驟 : 1. 執行 Windows 驅動程式安裝程式 ( 此範例為 PIO-DIO) 驅動程式位置 : CD:\NAPDOS\PCI\PIO-DIO\dll_ocx\Driver http://ftp.icpdas.com/pub/cd/iocard/pci/napdos/pci/pio-dio/dll_ocx/driver/

More information

Microsoft Word - DIR-615_B2_Manual_1.00_T_.doc

Microsoft Word - DIR-615_B2_Manual_1.00_T_.doc D-Link DIR-615 Wireless N Broadband Router DIR-615...4 DIR-615...6...7 DIR-615...10 IP...10 DIR-615...15 DIR-615...24 DIR-615...29 D-Link DWA-645 DIR-615...30 Windows XP SP2...32 Windows Vista...35 (1)

More information

BlackBerry Classic Smartphone-用户指南

BlackBerry Classic Smartphone-用户指南 BlackBerry Classic Smartphone 版 本 : 10.3.1 用 户 指 南 发 布 日 期 : 2015-03-02 SWD-20150302151727377 目 录 设 置 和 基 本 知 识... 6 当 前 版 本 的 新 特 色...6 BlackBerry 智 能 手 机 简 介... 14 设 备 一 览... 14 BlackBerry Classic 键...16

More information

EK-STM32F

EK-STM32F STMEVKIT-STM32F10xx8 软 件 开 发 入 门 指 南 目 录 1 EWARM 安 装... 1 1.1 第 一 步 : 在 线 注 册... 1 1.2 第 二 步 : 下 载 软 件... 2 1.3 第 三 步 : 安 装 EWARM... 3 2 基 于 STMEVKIT-STM32F10xx8 的 示 例 代 码 运 行... 6 2.1 GPIO Demo... 6 2.2

More information

mvc

mvc Build an application Tutor : Michael Pan Application Source codes - - Frameworks Xib files - - Resources - ( ) info.plist - UIKit Framework UIApplication Event status bar, icon... delegation [UIApplication

More information

目次 

目次  軟 體 工 程 期 末 報 告 網 路 麻 將 91703014 資 科 三 黃 偉 嘉 91703024 資 科 三 丘 祐 瑋 91703030 資 科 三 江 致 廣 1 目 次 壹 前 言 (Preface) P.4 貳 計 畫 簡 述 及 預 期 效 益 (Project Description and Expected Results) P.4 參 系 統 開 發 需 求 (System

More information

r_09hr_practical_guide_kor.pdf

r_09hr_practical_guide_kor.pdf PRACTICAL GUIDE TO THE EDIROL R-09HR 3 4 PRACTICAL GUIDE TO THE EDIROL R-09HR 5 Situation 1 6 1 2 3 PRACTICAL GUIDE TO THE EDIROL R-09HR WAV MP3 WAV 24 bit/96 khz WAV 16 bit/44.1 khz MP3 128 kbps/44.1

More information

Microsoft Word - Mail2000_SecurityPatch_

Microsoft Word - Mail2000_SecurityPatch_ Mail2000 安全性加強程式 網擎資訊軟體股份有限公司謹呈 1 Mail2000 安全性加強程式 Introduction Mail2000 安全性加強程式, 是針對 Mail2000 V4.0 以上版本, 包括 V4.0 及 V4.5 版本所提供, 以加強系統的安全性, 減少因惡意信件而引起的安全性問題 版本名稱 Mail2000 版本作業系統檔案名稱 V4.0 單一網域版本 V4.0 SDSS

More information

穨UPSentry_SC_.PDF

穨UPSentry_SC_.PDF 3Phase UPSentry For: Windows 95/98/Me Windows NT40/2000/XP Table of Contents Chapter 0 Getting Started 0-1 0-1 0-1 0-2 Chapter 1 3Phase UPSentry 1-1 1-1 1-1 1-1 1-3 Chapter 2 3Phase UPSentry 2-1 Chapter

More information

作 業 系 統 簡 介 光 有 電 腦 硬 體, 會 不 容 易 使 用 必 須 要 有 適 當 的 程 式, 才 方 便 操 作 硬 體 衍 生 作 業 系 統 需 求 : 提 供 方 便 使 用 者 執 行 程 式 平 台 有 效 使 用 各 種 電 腦 硬 體 資 源 Jingo C. Lia

作 業 系 統 簡 介 光 有 電 腦 硬 體, 會 不 容 易 使 用 必 須 要 有 適 當 的 程 式, 才 方 便 操 作 硬 體 衍 生 作 業 系 統 需 求 : 提 供 方 便 使 用 者 執 行 程 式 平 台 有 效 使 用 各 種 電 腦 硬 體 資 源 Jingo C. Lia 第 三 章 作 業 系 統 概 論 Reporter : Jingo C. Liao 廖 正 宏 E-mail : [email protected] 章 節 列 表 1. 什 麼 是 作 業 系 統 2. 作 業 系 統 的 主 要 功 能 3. 作 業 系 統 的 核 心 程 式 4. 作 業 系 統 的 演 進 歷 史 5. 常 見 流 行 的 作 業 系 統 Jingo C. Liao

More information

輕鬆學 Dreamweaver CS5 網頁設計..\Example\Ch0\ \.html..\example\ch0\ \mouse.txt..\example\ch0\ \ _Ok.html 學習重點 JavaScript 複製程式碼 mouse.txt Ctrl+C Ctrl+C 0-4

輕鬆學 Dreamweaver CS5 網頁設計..\Example\Ch0\ \.html..\example\ch0\ \mouse.txt..\example\ch0\ \ _Ok.html 學習重點 JavaScript 複製程式碼 mouse.txt Ctrl+C Ctrl+C 0-4 JAVA Extension 0..\Example\Ch0\ \ T.html..\Example\Ch0\ \ T.txt T.txt..\Example\Ch0\ \ T_Ok.html 提示 :. Marquee Marquee Font Color #FFFFFF BG Color #867bf Width 90 Height 50. T.txt Ctrl+C your scrolling

More information

Paratune用户手册

Paratune用户手册 PARATERA Paratune 用 户 手 册 v4.0 北 京 并 行 科 技 有 限 公 司 2013 / 10 目 录 1 手 册 说 明... 5 1.1 关 于 手 册... 5 1.2 排 版 约 定... 5 1.3 名 词 解 释... 5 1.4 相 关 文 档... 6 1.5 信 息 反 馈... 6 2 Paratune 简 介... 7 2.1 软 件 界 面 与 主

More information

VB程序设计教程

VB程序设计教程 高 等 学 校 教 材 Visual Basic 程 序 设 计 教 程 魏 东 平 郑 立 垠 梁 玉 环 石 油 大 学 出 版 社 内 容 提 要 本 书 是 按 高 等 学 校 计 算 机 程 序 设 计 课 程 教 学 大 纲 编 写 的 大 学 教 材, 主 要 包 括 VB 基 础 知 识 常 用 程 序 结 构 和 算 法 Windows 用 户 界 面 设 计 基 础 文 件 处

More information

Desktop Management Guide

Desktop Management Guide Ĵ* 商 用 台 式 机 文 档 部 件 号 312947-AA1 2003 詤 3 本 指 南 介 绍 了 预 装 在 某 些 机 型 上 的 安 全 保 护 功 能 和 智 能 管 理 功 能 的 定 义 及 使 用 说 明 2002 Hewlett-Packard Company 2002 Hewlett-Packard Development Company, L.P. HP Hewlett

More information

Serial ATA ( Nvidia nforce430)...2 (1) SATA... 2 (2) B I O S S A T A... 3 (3) RAID BIOS RAID... 6 (4) S A T A... 9 (5) S A T A (6) Microsoft Win

Serial ATA ( Nvidia nforce430)...2 (1) SATA... 2 (2) B I O S S A T A... 3 (3) RAID BIOS RAID... 6 (4) S A T A... 9 (5) S A T A (6) Microsoft Win Serial ATA ( Nvidia nforce430)...2 (1) SATA... 2 (2) B I O S S A T A... 3 (3) RAID BIOS RAID... 6 (4) S A T A... 9 (5) S A T A... 11 (6) Microsoft Windows 2000... 14 Ác Åé å Serial ATA ( Nvidia nforce430)

More information

User’s Manual

User’s Manual SNAP 500 打 印 机 用 户 手 册 1 用 户 手 册 SNAP TM 500 打 印 机 2015 年 8 月 24 日 AVERY DENNISON Manual Edition 2.5 2 SNAP 500 打 印 机 用 户 手 册 WARNING This device complies with Part 15 of the FCC Rules. Operation is subject

More information

0 0 = 1 0 = 0 1 = = 1 1 = 0 0 = 1

0 0 = 1 0 = 0 1 = = 1 1 = 0 0 = 1 0 0 = 1 0 = 0 1 = 0 1 1 = 1 1 = 0 0 = 1 : = {0, 1} : 3 (,, ) = + (,, ) = + + (, ) = + (,,, ) = ( + )( + ) + ( + )( + ) + = + = = + + = + = ( + ) + = + ( + ) () = () ( + ) = + + = ( + )( + ) + = = + 0

More information

1.ai

1.ai HDMI camera ARTRAY CO,. LTD Introduction Thank you for purchasing the ARTCAM HDMI camera series. This manual shows the direction how to use the viewer software. Please refer other instructions or contact

More information

Guide to Install SATA Hard Disks

Guide to Install SATA Hard Disks SATA RAID 1. SATA. 2 1.1 SATA. 2 1.2 SATA 2 2. RAID (RAID 0 / RAID 1 / JBOD).. 4 2.1 RAID. 4 2.2 RAID 5 2.3 RAID 0 6 2.4 RAID 1.. 10 2.5 JBOD.. 16 3. Windows 2000 / Windows XP 20 1. SATA 1.1 SATA Serial

More information

Ác Åé å Serial ATA ( Sil3132) S A T A (1) SATA (2) BIOS SATA (3)* RAID BIOS RAID (4) SATA (5) SATA (a) S A T A ( S A T A R A I D ) (b) (c) Windows XP

Ác Åé å Serial ATA ( Sil3132) S A T A (1) SATA (2) BIOS SATA (3)* RAID BIOS RAID (4) SATA (5) SATA (a) S A T A ( S A T A R A I D ) (b) (c) Windows XP Serial ATA ( Sil3132)...2 (1) SATA... 2 (2) B I O S S A T A... 3 (3) RAID BIOS RAID... 6 (4) S A T A... 10 (5) S A T A... 12 Ác Åé å Serial ATA ( Sil3132) S A T A (1) SATA (2) BIOS SATA (3)* RAID BIOS

More information

T1028_Manual_KO_V3 0.pdf

T1028_Manual_KO_V3 0.pdf 2009 : 2009/09 PC Microsoft, MS-DOS, Windows, Windows Sound System Microsoft Corporation Intel, Atom Intel Corporation Sound Blaster, Sound Blaster ProCreative Technology I AC AC AC AC AC - 115 V/60 Hz

More information

錄...1 說...2 說 說...5 六 率 POST PAY PREPAY DEPOSIT 更

錄...1 說...2 說 說...5 六 率 POST PAY PREPAY DEPOSIT 更 AX5000 Version 1.0 2006 年 9 錄...1 說...2 說...3...4 說...5 六...6 6.1 率...7 6.2 POST PAY...8 6.3 PREPAY DEPOSIT...9 6.4...10 6.5...11 更...12...12 LCD IC LED Flash 更 兩 RJ11 ( ) DC ON OFF ON 狀 狀 更 OFF 復 狀 說

More information

目 录

目 录 1 Quick51...1 1.1 SmartSOPC Quick51...1 1.2 Quick51...1 1.3 Quick51...2 2 Keil C51 Quick51...4 2.1 Keil C51...4 2.2 Keil C51...4 2.3 1 Keil C51...4 2.4 Flash Magic...9 2.5 ISP...9 2.6...10 2.7 Keil C51...12

More information

使用手冊

使用手冊 使用手冊 版權所有 2013 年 Microtek International, Inc. 保留所有權利 商標 Microtek MII MiiNDT ScanWizard Microtek International, Inc. Windows Microsoft Corporation 重要須知 Microtek Microtek Windows Microsoft Windows I49-004528

More information

投影片 1

投影片 1 9 1 9-1 Windows XP Windows Server 2003 Mac OS Linux, 都 (OS, Operating System ) 2 3 , 來, 行 3 理 行 4 ,, (UI, User Interface), 滑, 令 列 (CLI, Command-Line Interface) (GUI, Graphical User Interface) 2 5 令 列,

More information

Oracle 4

Oracle 4 Oracle 4 01 04 Oracle 07 Oracle Oracle Instance Oracle Instance Oracle Instance Oracle Database Oracle Database Instance Parameter File Pfile Instance Instance Instance Instance Oracle Instance System

More information

RUN_PC連載_12_.doc

RUN_PC連載_12_.doc PowerBuilder 8 (12) PowerBuilder 8.0 PowerBuilder PowerBuilder 8 PowerBuilder 8 / IDE PowerBuilder PowerBuilder 8.0 PowerBuilder PowerBuilder PowerBuilder PowerBuilder 8.0 PowerBuilder 6 PowerBuilder 7

More information

PaPaGO! PaPaGO! PaPaGO! PaPaGO! PaPaGO! PaPaGO!

PaPaGO! PaPaGO! PaPaGO! PaPaGO! PaPaGO! PaPaGO! PaPaGO! 7 COPILOT Pocket PC Design for Microsoft Pocket PC 2002/2003/2003 se Version 7.3 http://www.mactiotnech.com 1 ...5...6...7...9...11 2.1...11 2.2 PaPaGO!...11 2.3 PaPaGO!...17 2.5...19...20 PaPaGO!...21

More information

FY.DOC

FY.DOC 高 职 高 专 21 世 纪 规 划 教 材 C++ 程 序 设 计 邓 振 杰 主 编 贾 振 华 孟 庆 敏 副 主 编 人 民 邮 电 出 版 社 内 容 提 要 本 书 系 统 地 介 绍 C++ 语 言 的 基 本 概 念 基 本 语 法 和 编 程 方 法, 深 入 浅 出 地 讲 述 C++ 语 言 面 向 对 象 的 重 要 特 征 : 类 和 对 象 抽 象 封 装 继 承 等 主

More information

Microsoft PowerPoint - Lecture7II.ppt

Microsoft PowerPoint - Lecture7II.ppt Lecture 8II SUDOKU PUZZLE SUDOKU New Play Check 軟體實作與計算實驗 1 4x4 Sudoku row column 3 2 } 4 } block 1 4 軟體實作與計算實驗 2 Sudoku Puzzle Numbers in the puzzle belong {1,2,3,4} Constraints Each column must contain

More information

IC-900W Wireless Pan & Tilt Wireless Pan & Tilt Remote Control / Night Vision FCC ID:RUJ-LR802UWG

IC-900W Wireless Pan & Tilt Wireless Pan & Tilt Remote Control / Night Vision FCC ID:RUJ-LR802UWG IC-900W Wireless Pan & Tilt Wireless Pan & Tilt Remote Control / Night Vision FCC ID:RUJ-LR802UWG --------------------------------------------TABLE OF CONTENTS------------------------------------------

More information

els0xu_zh_nf_v8.book Page Wednesday, June, 009 9:5 AM ELS-0/0C.8

els0xu_zh_nf_v8.book Page Wednesday, June, 009 9:5 AM ELS-0/0C.8 els0xu_zh_nf_v8.book Page Wednesday, June, 009 9:5 AM ELS-0/0C.8 Yamaha ELS-0/0C..8 LCD ELS-0/0C v. typeu LCD ELS-0/0C typeu / -6 / [SEARCH] / - ZH ELS-0/0C.8 els0xu_zh_nf_v8.book Page Wednesday, June,

More information

<A4E2BEF7B4FAB8D5B3F8A F52322E786C7378>

<A4E2BEF7B4FAB8D5B3F8A F52322E786C7378> 製表日期 : 2008 年 9 月 17 日 Mobile Java Applet 手機安裝測試報告表 已完成測試機型數量 :317 台 ; 無問題 ( 可安裝 / 可執行 ) 機型 :315 台無法使用 :2 台 ; 特殊註記機型 :2 台 廠牌 機型 測試狀況 OK 不 OK 安裝資料夾 ( 目錄 ) 備註 NOKIA N95 應用程式 NOKIA 6110 應用程式 NOKIA 3120 應用程式

More information

Microsoft Word - InoTouch Editor编程软件手册2012.2.10.doc

Microsoft Word - InoTouch Editor编程软件手册2012.2.10.doc 目 录 第 一 章 关 于 InoTouch Editor 编 程 软 件 的 安 装... - 6-1.1 InoTouch 系 列 HMI 和 InoTouch Editor 软 件 的 简 介... - 6-1.2 安 装 InoTouch Editor 编 程 软 件... - 10-1.3 系 统 连 接 图... - 12-1.4 InoTouch 系 列 人 机 界 面 的 系 统 设

More information

基于UML建模的管理管理信息系统项目案例导航——VB篇

基于UML建模的管理管理信息系统项目案例导航——VB篇 PowerBuilder 8.0 PowerBuilder 8.0 12 PowerBuilder 8.0 PowerScript PowerBuilder CIP PowerBuilder 8.0 /. 2004 21 ISBN 7-03-014600-X.P.. -,PowerBuilder 8.0 - -.TP311.56 CIP 2004 117494 / / 16 100717 http://www.sciencep.com

More information

Microsoft Word - Front cover_white.doc

Microsoft Word - Front cover_white.doc Real Time Programme 行 情 报 价 程 序 Seamico Securities Public Company Limited WWW.SEAMICO.COM Table of Content 目 录 开 始 使 用 开 始 使 用 Z Net 程 序 程 序 1 股 票 观 察 者 4 每 日 股 票 按 时 间 的 交 易 查 询 10 多 股 同 列 13 股 票 行 情

More information

ICD ICD ICD ICD ICD

ICD ICD ICD ICD ICD MPLAB ICD2 MPLAB ICD2 PIC MPLAB-IDE V6.0 ICD2 usb PC RS232 MPLAB IDE PC PC 2.0 5.5V LED EEDATA MPLAB ICD2 Microchip MPLAB-IDE v6.0 Windows 95/98 Windows NT Windows 2000 www.elc-mcu.com 1 ICD2...4 1.1 ICD2...4

More information

Oxford iSolution下載及安裝指南

Oxford iSolution下載及安裝指南 Oxford isolution 下載及安裝指南 Download and Installation Guide 系統要求 System Requirements... 2 Oxford isolution 安裝步驟 Windows 個人電腦 Oxford isolution Installation Steps For Windows PCs... 3 Oxford isolution 安裝步驟

More information

* 2

* 2 * 2 1. A 3. A 2. B A. 1. 1 2. 1 3 4 4 6 p 123456 7 bk bl bm bn 7 bo cm 9 8 cl ck bt bs br bp bq 1 2 3 4 5 6 7 8 9 bk bl bm 0 bn bo bp bq br bs bt p ck 8 2 4 6 cl cm cq cp co cn cn co cp cq 10 . [8]

More information

CU0594.pdf

CU0594.pdf 8 SOHO 1 3 003 SOHO SOHO Coder Programmer HTML CSS PHP JavaScrip 009 LECTURE 1-1 1 048 PART 2 LECTURE 1-1 1 049 SOHO Landing Page Landing 050 PART 2 LECTURE 1-1 1 SEO SEO P.093 SEO SEO SEO SEO SEO 051

More information

Windows 2000 Server for T100

Windows 2000 Server for T100 2 1 Windows 95/98 Windows 2000 3.5 Windows NT Server 4.0 2 Windows DOS 3.5 T200 2002 RAID RAID RAID 5.1 Windows 2000 Server T200 2002 Windows 2000 Server Windows 2000 Server Windows 2000 Server 3.5 for

More information

AutoCAD 用戶如何使用 ArchiCAD

AutoCAD 用戶如何使用 ArchiCAD AutoCAD 用戶如何使用 ArchiCAD AutoCAD用戶如何使用ArchiCAD ( 中文版 ) 由 Scott MacKenzie, Simon Gilbert, Geoffrey Moore Langdon, David Byrnes, Ralph Grabowski 編寫 龍庭資訊有限公司 1/73 - 2. 3. 4. -

More information

GIGA-BYTE TECHNOLOGY CO., LTD. ( GBT ) GBT GBT, GBT

GIGA-BYTE TECHNOLOGY CO., LTD. ( GBT ) GBT GBT, GBT GIGA-BYTE TECHNOLOGY CO., LTD. (GBT ) GBT GBT, GBT 2003 7 9 1. 1.1.... 3 1.2.... 3 2. 2.1.... 4 2.2.... 5 2.3.... 6 3. 3.1. Win98/98SE or WinME,Win2000Win XP... 8 3.1.1... 8 3.1.2 Direct X... 9 3.1.3...

More information

封面-12

封面-12 第十二章 701Client TECHNOLOGY CO.,LTD. 701Client 701Server 701Client "701Client", 12-1 :supervisor :supervisor : 1. : 00~99 100 2. : 00~63 ( 63 / / ) 3. : 18 9 4. : 18 9 5. 12-2 TECHNOLOGY CO.,LTD. 701Client

More information

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc References (Section 5.2) Hsuan-Tien Lin Deptartment of CSIE, NTU OOP Class, March 15-16, 2010 H.-T. Lin (NTU CSIE) References OOP 03/15-16/2010 0 / 22 Fun Time (1) What happens in memory? 1 i n t i ; 2

More information

P4V88+_BIOS_CN.p65

P4V88+_BIOS_CN.p65 1 Main H/W Monitor Boot Security Exit System Overview System Time System Date [ 17:00:09] [Wed 12/22/2004] BIOS Version : P4V88+ BIOS P1.00 Processor Type : Intel (R) Pentium (R) 4 CPU 2.40 GHz Processor

More information

投影片 1

投影片 1 數位相片基礎編修 Photoshop,,,, 2 ,, 3 / 4 3-1,...,, Photoshop,,, 5 5 6 ,,..., 5,,, 7 3-2,...,,, 8 , Photoshop,,, / 9 10 ,,,,,, 03-02.jpg,,,,, Photoshop " ", Photoshop 11 12 / /, Photoshop, 13 14 ,,, " " " " 6

More information

案號 :LP 京年升 : 16-LP 第一組個人電腦 鎮億年 : 16-LP 項次契約金額廠牌型號產地品名共同規格 acer Veriton M2640G 臺灣 ASUS MD330 臺灣 MSI 微星科技捷元 GENUINE ProDesk 400 G3

案號 :LP 京年升 : 16-LP 第一組個人電腦 鎮億年 : 16-LP 項次契約金額廠牌型號產地品名共同規格 acer Veriton M2640G 臺灣 ASUS MD330 臺灣 MSI 微星科技捷元 GENUINE ProDesk 400 G3 一般型電腦 Pentium 1 16,400 Lenovo 10GQ 3.5GHz(Windows 作業系統 )( 獨立主機不含螢幕 ) 1. 處理器 :INTEL Pentium 3.5GHz( 含 ) 以 2 16,294 聯強 LEMEL BSMI61H1GAA Lenovo 10GQ 聯強 LEMEL BSMI61H1GAA 一般型電腦 Pentium 3.5GHz(Windows 作業系統

More information

Microsoft PowerPoint - gp2.ppt

Microsoft PowerPoint - gp2.ppt Windows 視窗程式設計 (1) 靜宜大學資訊管理學系蔡奇偉副教授 大綱 Windows 視窗系統的特性 Windows API MSDN 線上說明文件 匈牙利 (Hungarian) 命名法 一個最少行的 Windows 視窗程式 Windows 程式的事件處理模型 視窗程式的骨架 1 Windows 視窗系統的特性 圖形化的人機介面 圖形顯示器 視窗 滑鼠 + 鍵盤 Multiprocessing

More information

2 : ; :

2 : ; : 4 CH 1 2 : ; : 1 2 2 3 3 4 4 5 5 6 1 6 2 8 3 11 6 13 1 13 2 14 14 1 15 2 16 3 17 4 18 5 22 6 23 7 24 7 CF 32 8 46 9 : 80GB HD 48 3 3 1 : 4 / / 4 9 2 CHANNEL 1 : 1 3 CHANNEL 2 : 2 4 CHANNEL 3 : 3 5 CHANNEL

More information

1

1 守大學電機系 電腦視覺 報告 單元一 數位影像 : 格式和操作 參考解答 MIAT( 機器智慧與自動化技術 ) 實驗室 中華民國 93 年 9 月 29 日 1. (a) 如果指紋影像 finger300x300 的取像面積是 14(mm)x14(mm), 請計算取像系統的 dpi (b) 如果 kaoshiung512x512 遙測影像的覆蓋面積是 5(Km)x5(Km), 請計算該影像的解析度

More information

PCM-3386用户手册.doc

PCM-3386用户手册.doc PCM-3386 BBPC-4x86 10/100M PC/104 (Lanry technology Co. Ltd. Zhuhai) 38 1012836 (Address: Room 1012,Linhai Building,No. 38,west of Shihua Road,Zhuhai City,Guangdong Province,China) (post code)519015 (phone)0756-3366659

More information

Important Notice SUNPLUS TECHNOLOGY CO. reserves the right to change this documentation without prior notice. Information provided by SUNPLUS TECHNOLO

Important Notice SUNPLUS TECHNOLOGY CO. reserves the right to change this documentation without prior notice. Information provided by SUNPLUS TECHNOLO Car DVD New GUI IR Flow User Manual V0.1 Jan 25, 2008 19, Innovation First Road Science Park Hsin-Chu Taiwan 300 R.O.C. Tel: 886-3-578-6005 Fax: 886-3-578-4418 Web: www.sunplus.com Important Notice SUNPLUS

More information

untitled

untitled PowerBuilder Tips 利 PB11 Web Service 年度 2 PB Tips PB9 EAServer 5 web service PB9 EAServer 5 了 便 web service 來說 PB9 web service 力 9 PB11 release PB11 web service 力更 令.NET web service PB NVO 論 不 PB 來說 說

More information

P4VM800_BIOS_CN.p65

P4VM800_BIOS_CN.p65 1 Main H/W Monitor Boot Security Exit System Overview System Time System Date [ 17:00:09] [Fri 02/25/2005] BIOS Version : P4VM800 BIOS P1.00 Processor Type : Intel (R) Pentium (R) 4 CPU 2.40 GHz Processor

More information

WinMDI 28

WinMDI 28 WinMDI WinMDI 2 Region Gate Marker Quadrant Excel FACScan IBM-PC MO WinMDI WinMDI IBM-PC Dr. Joseph Trotter the Scripps Research Institute WinMDI HP PC WinMDI WinMDI PC MS WORD, PowerPoint, Excel, LOTUS

More information

untitled

untitled DOP www.deltaww.com DOP (RS232/RS485/ RS422) DOP USB SD 30 100 PLC Best Performance Huma Beautiful Display Beneficial Feature 1 DOP LED 65536 2D n Machine Interface s 2 DOP-B DOP-B 4.3 inches Wide B03S211

More information

1. Revo Uninstaller Pro Revo Uninstaller Pro Revo Uninstaller Pro Revo Uninstaller Pro Revo Uninsta ller Pro Revo Uninstaller Pro Revo Uninstaller Pro

1. Revo Uninstaller Pro Revo Uninstaller Pro Revo Uninstaller Pro Revo Uninstaller Pro Revo Uninsta ller Pro Revo Uninstaller Pro Revo Uninstaller Pro 1. 2. 3. 3.1. 3.2. 3.2.1. 3.2.2. 3.2.3. 3.3. 3.4. 3.5. 4. 5. 5.1. 5.2. 5.3. Windows 5.4. 5.5. 5.6. 5.7. 5.8. 6. 6.1. 6.2. 6.2.1. 6.2.2. 6.3. 6.3.1. 6.3.2. 6.4. 6.4.1. 6.4.2. 6.4.3. 6.5. 6.6. 7. 8. 9. Revo

More information

Programming Microsoft Windows CE .NET.doc

Programming Microsoft Windows CE .NET.doc Programming Microsoft Windows CE.NET, Third Edition by Douglas Boling Microsoft Press 2003 (1224 pages) ISBN:0735618844 作者对如何把 Windows 嵌入式程序设计经验应用到 Windows CE.NET 环境里做了娴熟的示范 这这个环境里, 可以为支持 Windows 的 Pocket

More information