Difference between revisions of "Embedded/zh CN"

From Free Pascal wiki
Jump to navigationJump to search
m (New page: {{Embedded}} 对嵌入式target(目标操作系统,目标架构)的支持正在开发中,只支持少数控制器。尽管如此,为嵌入式arm设备做程序还是可行...)
 
m (Fixed syntax highlighting)
 
(7 intermediate revisions by 2 users not shown)
Line 1: Line 1:
 
{{Embedded}}
 
{{Embedded}}
  
    对嵌入式target(目标操作系统,目标架构)的支持正在开发中,只支持少数控制器。尽管如此,为嵌入式arm设备做程序还是可行的。嵌入式target没有操作系统,只有几kB的RAM和几十kB的flash。一个典型的target就是NXP公司的LPC家族的流行的设备诸如LPC2124,它拥有16kB的RAM和256kB的flash,使用ARM7的指令集。
+
对嵌入式target(目标操作系统,目标架构)的支持正在开发中,只支持少数控制器。尽管如此,为嵌入式arm设备做程序还是可行的。嵌入式target没有操作系统,只有几kB的RAM和几十kB的flash。一个典型的target就是NXP公司的LPC家族的流行的设备诸如LPC2124,它拥有16kB的RAM和256kB的flash,使用ARM7的指令集。
  
 
= 嵌入式移植 =
 
= 嵌入式移植 =
Line 20: Line 20:
 
获取ARM嵌入式binutils。
 
获取ARM嵌入式binutils。
  
For windows, they are available at http://svn.freepascal.org/svn/fpcbuild/binaries/i386-win32. You can either checkout the whole directory with or download only arm-embedded-ar.exe, arm-embedded-as.exe, arm-embedded-ld.exe, arm-embedded-strip.exe, arm-embedded-objdump.exe and arm-embedded-objcopy.exe manually. Put these utils in a directory included in your path.
+
对于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变量包含的目录。
  
Build FPC for arm-embedded:
+
编译FPC对arm-embedded的支持:
  
 
   cd fpc
 
   cd fpc
 
   make clean buildbase installbase CROSSINSTALL=1 OS_TARGET=embedded CPU_TARGET=arm
 
   make clean buildbase installbase CROSSINSTALL=1 OS_TARGET=embedded CPU_TARGET=arm
  
This builds only the compiler and the rtl instead of the whole FPC. Because of the limited capabilities of the embedded systems supposed to be used, building all packages is not usefull. However, one must be carefull to avoid overwriting an existing arm compiler on the system. If this is the case, INSTALL_PREFIX should be used to install into a different directory and switch between those.
+
以上的命令仅仅编译编译器和rtl,因为受限于嵌入式系统的性能编译所有的包是无意义的。不管怎样,要小心不要覆盖了已经存在于系统上的arm编译器。如果这可能发生,INSTALL_PREFIX必须被指定,以使得新构建出的编译器被放入另一个文件夹。
  
=== Testing ===
+
=== 测试 ===
  
Below you find a simple example program, save it as tled1.pp to follow the description. The program is made for development boards like the LPC-WEB from OLIMEX (http://www.olimex.com/dev/lpc-e2124.html). When you press button 1, led 1 lights for a certain time, same for button 2 and led 2.
+
你可以在下面找到一个简单的示例程序。按照说明把它保存到tled1.pp。这个程序是为诸如LOIMEX的LPC-WEB(http://www.olimex.com/dev/lpc-e2124.html)之类的开发板写的。当你按下键1,led1就会同时亮起来。同样的,按下键2,然后led2亮起来。
  
<delphi>
+
<syntaxhighlight lang=pascal>
 
procedure Wait(d : dword);
 
procedure Wait(d : dword);
 
begin
 
begin
Line 42: Line 42:
  
 
begin
 
begin
   { initialize PLL }
+
   { 初始化PLL }
 
   InitPLL(2,1);
 
   InitPLL(2,1);
  
   { initialize LEDs }
+
   { 初始化LEDs }
   { port 0.8: output }
+
   { 端口 0.8: output }
 
   TBitvector32(GPIO0_IODIR)[8]:=1;
 
   TBitvector32(GPIO0_IODIR)[8]:=1;
   { port 0.10: output }
+
   { 端口 0.10: output }
 
   TBitvector32(GPIO0_IODIR)[10]:=1;
 
   TBitvector32(GPIO0_IODIR)[10]:=1;
  
   { turn off both LEDs }
+
   { 关闭两个LEDs }
 
   TBitvector32(GPIO0_IOSET)[8]:=1;
 
   TBitvector32(GPIO0_IOSET)[8]:=1;
 
   TBitvector32(GPIO0_IOSET)[10]:=1;
 
   TBitvector32(GPIO0_IOSET)[10]:=1;
  
   { initialize button inputs }
+
   { 初始化键盘输入 }
   { port 0.9: input }
+
   { 端口 0.9: input }
 
   TBitvector32(GPIO0_IODIR)[9]:=0;
 
   TBitvector32(GPIO0_IODIR)[9]:=0;
   { port 0.15: input }
+
   { 端口 0.15: input }
 
   TBitvector32(GPIO0_IODIR)[15]:=0;
 
   TBitvector32(GPIO0_IODIR)[15]:=0;
  
   { endless loop}
+
   { 死循环 }
 
   while true do
 
   while true do
 
     begin
 
     begin
  
       { button 1 pressed }
+
       { 1 被按下 }
 
       if TBitvector32(GPIO0_IOPIN)[15]=0 then
 
       if TBitvector32(GPIO0_IOPIN)[15]=0 then
 
         begin
 
         begin
           { turn on LED, inverse logic }
+
           { 打开 LED, 置反逻辑 }
 
           TBitvector32(GPIO0_IOCLR)[8]:=1;
 
           TBitvector32(GPIO0_IOCLR)[8]:=1;
           { wait }
+
           { 等待 }
 
           Wait(500000);
 
           Wait(500000);
           {  turn off LED, inverse logic }
+
           {  关闭 LED, 置反逻辑 }
 
           TBitvector32(GPIO0_IOSET)[8]:=1;
 
           TBitvector32(GPIO0_IOSET)[8]:=1;
 
       end;
 
       end;
  
       { button 2 pressed }
+
       { 2 被按下 }
 
       if TBitvector32(GPIO0_IOPIN)[9]=0 then
 
       if TBitvector32(GPIO0_IOPIN)[9]=0 then
 
         begin
 
         begin
           { turn on LED, inverse logic }
+
           { 打开 LED, 置反逻辑 }
 
           TBitvector32(GPIO0_IOCLR)[10]:=1;
 
           TBitvector32(GPIO0_IOCLR)[10]:=1;
           { wait }
+
           { 等待 }
 
           Wait(500000);
 
           Wait(500000);
           { turn off LED, inverse logic }
+
           { 关闭 LED, 置反逻辑 }
 
           TBitvector32(GPIO0_IOSET)[10]:=1;
 
           TBitvector32(GPIO0_IOSET)[10]:=1;
 
       end;
 
       end;
 
     end;
 
     end;
 
end.
 
end.
</delphi>
+
</syntaxhighlight>
  
If FPC for arm-embedded is installed as described above, the program can be compiled by
+
如果FPC arm-embedded已经如上述所说,被正确安装了,这个程序可以这样来编译:
  
 
   fpc -Parm -Tembedded -Wplpc2124 tled1.pp
 
   fpc -Parm -Tembedded -Wplpc2124 tled1.pp
  
 +
其中:
 
   -Parm
 
   -Parm
 
+
告诉编译器以arm作为目标架构编译
tells the compiler to compile for arm.
 
  
 
   -Tembedded
 
   -Tembedded
 
+
告诉编译器为嵌入式平台编译
tells the compiler to compile for the embedded target.
 
  
 
   -Wplpc2124
 
   -Wplpc2124
 +
告诉编译起为NXP LPC 2124编译。这样做有两个作用:首先,一个单元(在这里是lpc21x4)包含了启动代码和端口配置。控制器的定义也被加载。其次,编译器可以使用一个适合这个控制器的链接脚本。
  
tells the compiler to compile for the NXP LPC 2124. This has two effects: first, a unit (lpc21x4 in this case) containing the startup code and the port etc. definitions for this controller is loaded. Further, the compiler uses a linker script which fits the needs of this controller.
+
最后得到一个可用于NXP flash编程器的 .hex 文件。
 
 
The result of the compiler is a .hex file which can be programmed by the NXP flash programming utility.
 
  
=== Adding new controllers ===
+
=== 加入新的控制器 ===
  
Adding a new controller type requires basically three steps: first, extend the compiler so it knows about the name of the controller then add a linker script and finally create an rtl unit with the register definitions and the startup code.
+
加入一个新的控制器需要基本的三个步骤:首先,扩展编译器以使得它能识别控制器的名字。然后加入一个链接脚本。最后创建一个包含注册的定义和启动代码的rtl单元。
  
==== Add the controller type to the compiler ====
+
==== 为编译器增加控制器类型 ====
  
==== Add the linker script to the compiler ====
+
==== 为编译器增加链接脚本 ====
  
==== Create an rtl unit with startup code and register definitions ====
+
==== 创建一个包含注册的定义和启动代码的rtl单元 ====
  
=== Useful links ===
+
=== 有用的链接 ===
 
* http://de.wikipedia.org/wiki/Intel_HEX
 
* http://de.wikipedia.org/wiki/Intel_HEX
 
* http://www.nxp.com/products/microcontrollers/support/software_download/lpc2000/
 
* http://www.nxp.com/products/microcontrollers/support/software_download/lpc2000/

Latest revision as of 08:41, 14 February 2020

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

有用的链接