Embedded/zh TW

From Free Pascal wiki
Jump to navigationJump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

English (en) español (es) 中文(中国大陆)‎ (zh_CN) 中文(台灣)‎ (zh_TW)

對嵌入式target(目標作業系統,目標架構)的支援正在開發中,只支援少數控制器。儘管如此,為嵌入式arm設備做程式還是可行的。嵌入式target沒有作業系統,只有幾kB的RAM和幾十kB的flash。一個典型的target就是NXP公司的LPC家族的流行的設備諸如LPC2124,它擁有16kB的RAM和256kB的flash,使用ARM7的指令集。

嵌入式移植

狀態

  • 僅僅在svn上的2.3.1版本才能得到可用的支持
  • 當前僅有arm嵌入式設備得到支援
  • 當前支持的控制器僅限於NXP LPC和ATMEL AT91控制器。如果你有興趣對其他控制器提供支援,請在這兒捐獻你的代碼fpc-devel mailing list然後寫封信使得我們可以討論是否加入這個支援。

ARM嵌入式

構建

從svn上獲取最新的FPC源碼:

 svn co http://svn.freepascal.org/svn/fpc/trunk fpc

獲取ARM嵌入式binutils。

對於windows,他們可以在 http://svn.freepascal.org/svn/fpcbuild/binaries/i386-win32 得到。你可以checkout所有的目錄或者僅僅手工下載arm-embedded-ar.exe,arm-embedded-as.exe,arm-embedded-ld.exe,arm-embedded-strip.exe,arm-embedded-objdump.exe和arm-embedded-objcopy.exe。把這些utils放到被PATH變數包含的目錄。

編譯FPC對arm-embedded的支持:

 cd fpc
 make clean buildbase installbase CROSSINSTALL=1 OS_TARGET=embedded CPU_TARGET=arm

以上的命令僅僅編譯編譯器和rtl,因為受限於嵌入式系統的性能編譯所有的包是無意義的。不管怎樣,要小心不要覆蓋了已經存在於系統上的arm編譯器。如果這可能發生,INSTALL_PREFIX必須被指定,以使得新構建出的編譯器被放入另一個檔夾。

測試

你可以在下面找到一個簡單的示例程式。按照說明把它保存到tled1.pp。這個程式是為諸如LOIMEX的LPC-WEB(http://www.olimex.com/dev/lpc-e2124.html)之類的開發板寫的。當你按下鍵1,led1就會同時亮起來。同樣的,按下鍵2,然後led2亮起來。

procedure Wait(d : dword);
begin
  while d<>0 do
    dec(d);
end;


begin
  { 初始化PLL }
  InitPLL(2,1);

  { 初始化LEDs }
  { 埠 0.8: output }
  TBitvector32(GPIO0_IODIR)[8]:=1;
  { 埠 0.10: output }
  TBitvector32(GPIO0_IODIR)[10]:=1;

  { 關閉兩個LEDs }
  TBitvector32(GPIO0_IOSET)[8]:=1;
  TBitvector32(GPIO0_IOSET)[10]:=1;

  { 初始化鍵盤輸入 }
  { 埠 0.9: input }
  TBitvector32(GPIO0_IODIR)[9]:=0;
  { 埠 0.15: input }
  TBitvector32(GPIO0_IODIR)[15]:=0;

  { 閉環 }
  while true do
    begin

      { 鍵 1 被按下 }
      if TBitvector32(GPIO0_IOPIN)[15]=0 then
        begin
          { 打開 LED, 置反邏輯 }
          TBitvector32(GPIO0_IOCLR)[8]:=1;
          { 等待 }
          Wait(500000);
          {  關閉 LED, 置反邏輯 }
          TBitvector32(GPIO0_IOSET)[8]:=1;
      end;

      { 鍵 2 被按下 }
      if TBitvector32(GPIO0_IOPIN)[9]=0 then
        begin
          { 打開 LED, 置反邏輯 }
          TBitvector32(GPIO0_IOCLR)[10]:=1;
          { 等待 }
          Wait(500000);
          { 關閉 LED, 置反邏輯 }
          TBitvector32(GPIO0_IOSET)[10]:=1;
      end;
    end;
end.

如果FPC arm-embedded已經如上述所說,被正確安裝了,這個程式可以這樣來編譯:

 fpc -Parm -Tembedded -Wplpc2124 tled1.pp

其中:

 -Parm

告訴編譯器以arm作為目標架構編譯

 -Tembedded

告訴編譯器為嵌入式平臺編譯

 -Wplpc2124

告訴編譯起為NXP LPC 2124編譯。這樣做有兩個作用:首先,一個單元(在這裏是lpc21x4)包含了啟動代碼和埠配置。控制器的定義也被載入。其次,編譯器可以使用一個適合這個控制器的鏈結腳本。

最後得到一個可用於NXP flash編程器的 .hex 文件。

加入新的控制器

加入一個新的控制器需要基本的三個步驟:首先,擴展編譯器以使得它能識別控制器的名字。然後加入一個鏈結腳本。最後創建一個包含註冊的定義和啟動代碼的rtl單元。

為編譯器增加控制器類型

為編譯器增加鏈結腳本

創建一個包含註冊的定義和啟動代碼的rtl單元

有用的鏈結