Embedded/zh TW

From Lazarus wiki
Revision as of 07:41, 14 February 2020 by Trev (talk | contribs) (Fixed syntax highlighting)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigationJump to search

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單元

有用的鏈結