用Ada编程Arduino

时间:2013-03-30 21:59:04

标签: arduino ada avr

我无法让avr-elf-windows和WinAVR工作。我已经设法构建了avr-elf-windows(ATmega2560)提供的示例。但是,如果我尝试扩展使用另一个芯片或开始使用WinAVR提供的软件包和项目,我会一直遇到错误,我无法解决。

方法1:

修改ATmega2560示例以使用WinAVR程序包。

更改:

with Atmega2560; use Atmega2560;

为:

with AVR; use AVR;
with AVR.Atmega328p; use AVR.atmega328p;

创建项目文件以包含:

with "C:\WinAVR-20100110\lib\gnat\avr.gpr";
with "C:\WinAVR-20100110\lib\gnat\avr_app.gpr";

正在运行make我收到以下错误:

  

avr-gnatmake:“C:\ WinAVR-20100110 \ lib \ gnat \ avr_lib \ avr-int_img.adb”编译错误

很好,我有编译问题,但我看不到错误。

方法2:

在GPS中打开上述项目文件。将构建设置更改为gnatmake。 GPS现在开始报告错误和警告:

  

项目警告:找不到对象目录“avr_lib / avr5 / obj”   项目库目录“C:\ WinAVR-20100110 \ lib \ gnat \ avr_lib \ avr5 \ lib \”不存在

后一个问题很明显是我没有正确设置GPS以告诉它微控制器和架构的价值,但我似乎无法找到解决这个问题的任何东西。

方法3:

使用makefile直接设置WinAVR,然后给出错误:

  

avr-gnatmake:RTS路径无效:缺少adainclude和adalib目录

如果我按照我可以通过搜索网络找到的说明,我只能找到在Linux下构建所需库的详细信息。

平台:Windows 7。


结合上面两个答案,我现在设法链接我的示例代码。至于它是否适用于Arduino,这是一个不同的问题。

非常感谢你的帮助。

到目前为止,我发现它有点令人沮丧,我想知道是否还有其他人可能会放弃Arduino上的Ada并回到Arduino IDE,因此错过了学习的机会一种结构更多的语言。有许多误导性的页面也无济于事。

3 个答案:

答案 0 :(得分:6)

您可能需要查看论文Integrating 8-bit AVR Micro-Controllers in Ada。基本上您可以使用GPS项目文件arduino.gpr,如

project Arduino is

   for Source_Dirs use (".", "src");
   for Object_Dir use "obj";
   for Exec_Dir use "bin";
   for Main use ("main.adb");

   package Compiler is 
    for Default_Switches ("ada") use ("-mmcu=avr5");
   end Compiler;

   package Ide is
      for Gnat use "avr-gnat";
      for Gnatlist use "avr-gnatls";
      for Debugger_Command use "avr-gdb";
   end Ide;

   package Builder is
      for Executable_Suffix use ".elf";
      for Default_Switches ("ada") use ("--RTS=rts-zfp");
   end Builder;

   package Linker is
      for Default_Switches ("ada") use ("obj\crtm328p._o", "-nostdlib", "-lgcc", "-mavr5", "-Tdata=0x00800200", "-mmcu=avr5");
   end Linker;

end Arduino;

你可以编写ATmega328P的规范,如

with Interfaces; use Interfaces;
with System;

package ATmega328P is

   -- PORTB: Port B Data Register
   PORTB : Unsigned_8;
   for PORTB'Address  use System'To_Address (16#25#);

   -- DDRB: Port B Data Direction Register
   DDRB : Unsigned_8;
   for DDRB'Address  use System'To_Address (16#24#);

   -- PINB: Port B Input Pins
   PINB : Unsigned_8;
   for PINB'Address  use System'To_Address (16#23#);

end ATmega328P;

由主文件或图书馆导入。

答案 1 :(得分:3)

如果这不是直接答案,请耐心等待;我只在Linux上使用了AVR-Ada工具链,因此我们可能不得不迭代解决方案,除非其他人首先发现问题。

解密的第一件事是你拥有哪种版本的AVR-Ada工具:

您需要的项目文件(使用avr-ada 1.1)

with "C:\WinAVR-20100110\lib\gnat\avr.gpr";

现在使用avr-ada 1.2.1,您需要(而不是)

with "C:\WinAVR-20100110\lib\gnat\avr_app.gpr";

用于构建应用程序,<same path>/avr_lib.gpr用于库。

我认为你不需要两者!他们可能会相互冲突。

我不知道Windows二进制版本的状态,但如果您需要最新版本(建议:这是一个真正的改进),您可能需要从源代码构建它。

方法1 :您是否从命令行运行Make?如果是这样的话,我希望看到他们所有血腥细节的错误。

方法2 :在这里帮不了你,我不太了解GPS。但是我可以说在Linux上[where where] / avr / lib / gnat / avr_lib中没有“avr5”文件夹。 (AVR5对于328p是正确的)

相反,有一个[wherever] / avr / lib / avr5包含libc和其他C相关对象 - 包括其链接器中的Rego名称的crtm328p.o,以及[wherever] / lib / gcc /包含libgcc.a的avr / 4.7.2 / avr5文件夹。您可能需要找到前者并将GPS指向它......

方法3 :这看起来最容易解决。 “gnatmake”命令需要-RTS =选项指向328p的正确RTS。假设正确安装了RTS,这应该是--RTS=rts/avr5

或者,完整的路径应该起作用。在这里,那将是

--RTS=/opt/avr_472_gnat/lib/gcc/avr/4.7.2/rts/avr5
在Windows上,您可能需要四处寻找正确的路径。 使用方法1,这个-RTS选项由avr_app.gpr自动生成。

答案 2 :(得分:1)

似乎安装了3或4个工具链,提供了WinAvr的一个方面,AvrAda会导致严重的问题(包括WinAvr,Avr-Ada,Cygwin,Adacore和MinWG的AVR编译器)。

从全新的Win7或Win8安装开始,执行以下操作:

Install WinAVR-20100110 to C:\WinAVR-20100110

Copy the content of the Avr-Ada-1.2.0_bin to C:\avr-ada-1.2.0

Add C:\avr-ada-1.2.0\bin to the PATH 

Compiling the content of each of the examples in C:\avr-ada-1.2.0\share\doc\avr-ada\apps identifies that some DLLs are missing: libiconv-2.dll, libgmp-10.dll, libmpc-2.dll, libmpfr-1.dll

These can be found in a MinGW installtion. 
Create a virtual machine to install MinGW on, in order to ensure it did not mess with the main PC. 
Copy the missing DLLs in C:\WinAVR-20100110\bin

The example in DS1820 will not compile due to crc_lib being missing. 

In order to upload to the Arduino the makefiles must be modified for your local installation, board type etc.