WinCE port/zh TW

From Lazarus wiki
Jump to: navigation, search

English (en) italiano (it) português (pt) русский (ru) 中文(台灣)‎ (zh_TW)

為WinCE進行的Free Pascal移植已經相當完整了,這個移植工作是由Yury Sidorov所進行的,而WinCE API的標頭檔則是由Oliver (Oro06)移植的。

狀態

  • FPC 2.2.0 以後的版本已經都可以支援WinCE應用程式了。
  • 支援ARM CPU。
  • 現在已支援以下的作業系統:
    • Pocket PC 2002 – WinCE 3.0版
    • Pocket PC 2003 – WinCE 4.20版
    • Pocket PC 2003第二版 – WinCE 4.21版
    • Windows Mobile 5 – WinCE 5.0版
    • Windows Mobile 6 – WinCE 5.2版
  • RTLFCL 的單元檔都能用在WinCE上面了。

下載交叉編譯器

要開始開發WinCE應用程式最簡單的方法,就是下載最新版的Win32平台的FPC跟Win32平台版本的arm-wince交叉編譯器。

您可以從這裡下載: http://www.freepascal.org/download.var

首先請安裝Win32平台的FPC,然後安裝arm-wince的交叉編譯器安裝程式。

從原始碼建置WinCE交叉編譯器 (直接下載預先編譯好的交叉編譯程式比較快,就可以跳過這四個步驟直接開始寫程式了)

在教學手冊裡面有部分路徑只是用來展示教學如何建置編譯器用的,請將那些路徑從您的IDE系統中移除。

步驟一 – 交叉編譯工具程式

這些工具程式是建置執行檔時需要的基礎,例如連結程式、編譯器、建立函式庫的程式等等。

您需要為arm-wince建置交叉編譯工具程式,或者您也可以從這裡取得適用Win32平台的預先編譯好的工具程式: ftp://ftp.freepascal.org/pub/fpc/contrib/cross/arm-wince-binutils.zip

將這個zip檔解壓到您機器上的目錄上,例如: C:\Programas\arm


步驟二 – 交叉編譯器

現在您已經可以使用FPC交叉編譯器(為ARM處理器建置的版本)來建置應用程式了。請先準備FPC 2.1.x版本的原始碼,以及FPC 2.0.4版以後的Win32平台FPC程式。

您可以從SVN取得最新版的FPC原始碼: http://www.freepascal.org/develop.html#svn

以下的動作中,我們假設您的Win32平台FPC 編譯器安裝的路徑如下: C:\Programas\fpc\bin\i386-win32

而您的FPC 2.1版的原始碼是放在這個目錄裡的: C:\Programas\fpc


步驟三 – 開始建置

要建置交叉編譯器,PATH這個環境變數需要設定正確,因為在Windows系統裡面,安裝程式會使用到這個環境變數。要確認這個環境變數是否設定正確,您可以建立一個批次檔:

PATH=C:\Programas\fpc\bin\i386-win32;C:\Programas\arm
make cycle CPU_TARGET=arm OS_TARGET=wince

請把上面這個批次檔放在C:\Programas\fpc\compiler這個目錄中,然後開啟一個Windows命令提示字元視窗,切換到該目錄,執行該批次檔。

在整個編譯過程中,您應該不會看到任何錯誤才對。(譯者已經在2008/1/5測試過,的確沒有問題)

您還需要把交叉編譯器程式ppccrossarm.exe放在C:\Programas\fpc\compiler目錄中;另外還需要把一些.o.ppu檔案放在C:\Programas\fpc\rtl\units\arm-wince目錄裡面。

編譯完成後,請將這幾個檔案放到安裝Free Pascal的目錄中: ppccrossarm.exe必須放在C:\Programas\fpc\bin\arm-wince目錄中,而wince相關的單元檔則是要放在C:\Programas\fpc\units\arm-wince目錄中。


步驟四 – 設定

您需要在C:\Programas\fpc\bin\arm-wince中建立fpc.cfg這個設定檔,才能正確的使用ppccrossarm.exe這個交叉編譯器程式。

請先在C:\Programas\fpc\bin\arm-wince目錄中建立一個名為fpc.cfg的新純文字檔案,然後把以下這幾行設定加入該檔案裡面:

-Twince
-FuC:\Programas\fpc\units\arm-wince
-XParm-wince-
-FDC:\Programas\arm

最後再把C:\Programas\fpc\bin\arm-winceC:\Programas\fpc\bin\i386-win32這兩個路徑加入您的PATH 環境變數裡面即可。

步驟四變形 – 進行設定,讓編譯器保留建置Win32跟WinCE兩種應用程式的能力

如果您要讓同一份FPC能夠編譯Win32跟WinCE的應用程式專案,請這樣設定: * 把交叉編譯器ppcrossarm.exe程式直接複製到fpc/bin/i386-win目錄裡面。

  • 直接編輯安裝FPC時自動產生的fpc.cfg,並把以下這幾行加進設定檔:
-FuC:\path_to_fpc\units\arm-wince
-XParm-wince-
-FDC:\path_to_arm_binutils

現在,如果您要編譯WinCE的應用程式,請在編譯時指定要建置的平台與CPU種類就行了。

附註: 如果您是用Lazarus的話,就不用弄得這麼複雜了,請確定您的編譯器路徑是設定為"fpc.exe",而非"ppc386.exe"即可。

編譯一個測試用的專案

在您建置了交叉編譯器,或安裝了從網站上下載的交叉編譯器程式之後,您就可以開始撰寫測試用的專案了,以下是引導您建立簡單Hello world應用程式的教學。

步驟一 – 安裝與設定模擬器

您需要Windows CE模擬器,並設定它好讓ActiveSync能與模擬器連線,ActiveSync需要安裝PocketCMD,這是一個命令提示字元工具,好用來執行您的Hellow world程式。

請從微軟的網站下載Pocket PC,這些模擬器都是模擬ARM CPU的。

要把模擬器設定來跟ActiveSync連線,則請參考這裡,這部分的教學跟英文版網頁的不太一樣,因為譯者已經把自己在Vista上面使用Windows Mobile 6模擬器的設定心得寫成中文與大家分享了。

步驟二 – 安裝命令提示字元工具

請下載由SymbolicTools所提供的”PocketCMD”,請從這裡下載

如果需要Pocket PC命令提示字元工具相關資訊,請參考 WinCE port notes

步驟三 – 進行編譯

提供給您編譯用的範例程式,我們假設這個檔案存為test.pas:

program test;

{$apptype console}

var
  Str: string;
begin
  WriteLn('Software Developed with:');
  WriteLn('The Free Pascal Compiler');
  WriteLn('');
  WriteLn('Please, enter your name:');
  ReadLn(Str);
  WriteLn('Your name is: ' + Str);
end.

要編譯test.pas這個程式的命令為:

ppcrossarm test.pas

編譯完成後,會產生一個名為test.exe的執行檔,請將之複製到您的Windows CE模擬裝置上面來執行。

這裡提供了一些用這個方式建置出來的應用程式的螢幕截圖。

為WinCE應用程式進行偵錯

GDB可以透過ActiveSync對您的WinCE應用程式進行遠端偵錯,您可以從這個網址下載Win32平台上對arm-wince模擬器進行偵錯的GDB 6.4: ftp://ftp.freepascal.org/pub/fpc/contrib/cross/gdb-6.4-win32-arm-wince.zip

幾個提示:

  • 在執行GDB的時候,請加上--tui這個參數,這樣一來,GDB的偵錯圖形介面就會出現,這會讓您的偵錯更舒適一點。
  • 在您的Pascal原始碼裡面,換行符號只能使用Unix的換行符號(LF),不然GDB會回報說原始碼有錯。

如何使用:

首先,把您的Pocket PC模擬裝置進行”連接底座”的程序,好跟ActiveSync進行連線。

然後啟動gdb:

gdb --tui <位於您電腦上的執行檔>

如果您要使用提示字元模式進行偵錯,則請在GDB的提示字元中直接輸入:

run或是r

GDB會把您的執行檔複製到模擬裝置上的\gdb目錄,並開始執行它。

以下是最常用的幾個GDB命令與縮寫:

  • r 參數 - 執行程式,並把參數傳遞給要偵錯的程式。
  • s - 單步執行-進入副程式.
  • n - 單步執行.
  • ni - 單步執行,直接跨越組合語言指令。
  • c - 繼續執行程式 (直接執行,不會再繼續單步執行了)
  • br <函式名稱> - 在function_name上設定一個中斷點。使用PASCALMAIN就可以在程式開始的地方設定中斷點。
  • br <原始碼檔案名稱>:<行號> - 在指定檔案的第幾行上面直接設定中斷點。
  • disas - 顯示當前位置的組合語言指令碼(進行反組譯)。
  • x/fmt 記憶體位址 - 用指定的格式把該記憶體位址的資料顯示出來。您可以輸入"help x"來讀取更多跟顯示格式相關的資訊。
  • bt - 反向偵測,把呼叫堆疊(call stack)裡面的資料顯示出來。
  • where - 顯示當前的這一行是屬於哪個函式,以及呼叫目前這個函式的呼叫者是誰。
  • q - 離開gdb.

您也可以在以下網址參閱它的說明文件: http://www.gnu.org/software/gdb/documentation

建置FPC函式庫

如果您要把FPC的函式庫建置出Arm-WinCE版本的話,請切換到函式庫的目錄,並執行以下指令:

PATH=C:\Programas\fpc\bin\i386-win32;C:\Programas\fpc\compiler;C:\Programas\arm
make OS_TARGET=wince CPU_TARGET=arm PP=ppcrossarm.exe

舉例來說,如果您要建置FCL,請切換到fpc\fcl目錄,然後執行上面的指令,建置完成後,Arm-WinCE版本的FPC函式庫就會建置在fpc\fcl\units\arm-wince目錄裡面了。

說明文件

一些跟WinCE相關的註記

  • 如果您發生無法辨識的錯誤: "Uknown error! Error code : 0xc1",而在發生這錯誤時,是有使用dll的話,這錯誤可能是因為使用了該dll所開放的某些函式,請確認該dll檔的export區段,以及您使用到的函式名稱是否正確。

WinCE 移植註記

  • chdir這個函式永遠都會錯誤,因為WinCE並沒有提供當前所在目錄的功能。
  • 要描述到所有檔案的時候,一定必須是絕對路徑(從\開始)
  • WinCE是個Unicode的OS,所有在API裡面使用到的字串參數,其型別一定得是PWideChar)
  • WinCE並不支援環境變數。
  • WinCE預設並不支援命令提示字元模式的應用程式,但您可以自己安裝一些套件,讓它支援命令提示字元。所以請記得,FPC為WinCE建立的專案預設都是圖形介面的應用程式,如果您要建立命令提示字元的應用程式,您得自己在執行編譯器的時候加上-WC這個參數,或者在主程式原始碼檔案裡面加入{$APPTYPE CONSOLE}這個關鍵字。

要讓WinCE能支援命令提示字元模式,您必須要安裝下列程式的其中之一:

    • 由SymbolicTools 提供的PocketCMD,我們也推薦您安裝這個程式,可以從這裡取得。
    • 微軟所提供的PPC Command Shell,它是Microsoft Windows Mobile Developer Power Toys的一部分,您可以從 這裡取得

PPC Command Shell的功能比PocketCMD少,而且還有些問題。執行上述兩個程式的時候,不管原來是否已經有命令模式字元視窗在執行中,都會開啟一個新的命令模式字元視窗。

    • 要讓Windows Mobile 5跟6使用命令提示字元輸出,請把登錄值作以下的設定:"HKEY_LOCAL_MACHINE\Drivers\Console\OutputTo" to 0.

參考文件

相關連截

以下是跟ARM CPU架構相關的一些文件:

貢獻與聯繫

如果您有任何跟WinCE移植相關的問題,請與Yury Sidorov連繫(只能寫英文喔, 他是俄羅斯人)