Embedded/zh CN

From Lazarus 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单元

有用的链接