arduino - 使用 Ada 对 Arduino 进行编程

标签 arduino ada avr

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

方法一:

修改 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" compilation error

太好了,我遇到了编译问题,但我看不到错误。

方法2:

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

Project warning: object directory "avr_lib/avr5/obj" not found Project library directory "C:\WinAVR-20100110\lib\gnat\avr_lib\avr5\lib\" does not exist

后一个问题很明显是因为我没有正确设置 GPS 来告诉它微 Controller 和架构的值,但我似乎找不到任何东西来解决这个问题。

方法3:

要使用直接使用 makefile 设置的 WinAVR,这会给出错误:

avr-gnatmake: RTS path not valid: missing adainclude and adalib directories

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

平台:Windows 7。

<小时/>

结合上面两个答案,我现在已经成功链接了我的示例代码。至于它是否能在Arduino上运行,那是另一个问题了。

非常感谢您的帮助。

我发现走到这一步有点令人沮丧,我想知道是否还有其他人可能会放弃 Arduino 上的 Ada 并返回到 Arduino IDE,从而错过学习的机会具有更多结构的语言。有许多误导性的页面也没有帮助。

最佳答案

您可能想看看论文 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;

由您的主文件或库导入。

关于arduino - 使用 Ada 对 Arduino 进行编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15723946/

相关文章:

arduino - 监控 Arduino 上的 6 个模拟输入引脚

c++ - Arduino RP2040 Pico 唯一 ID

erlang - 用 Ada 写的 Erlang?

io - Ada.Text_IO.End_Of_File 缓冲副作用

linux - Linux 中的 AVR 汇编器

java - Arduino 和 Android UDP 数据报

macos - 触发 mac 应用程序以从声音或其他物理(现实世界)事件开始

ada - GNAT Studio - 不能使用非核心 Ada 库

c - 如何将 .o 文件转换为 .elf 文件?

timer - 如何用定时器在AVR(ATmega8)中设置微秒延迟?