4

我正在尝试使用 AVR-Ada 实现任务功能,但是当我运行 make 时,我收到以下错误消息:

C:\avr_test>make
avr-gcc.exe (GCC) 4.3.3
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

ADA_PROJECT_PATH= avr-gnatmake -XMCU=atmega8 -p -Pbuild.gpr  -XAVRADA_MAIN=led_on avr-gcc -c --RTS=rts/avr4 -gnatec=C:\avr-ada\lib\gnat\gnat.adc -gdwarf-2 -gnatwp -gnatwu gnatn -gnatp -gnatVn -Os -gnatef -fverbose-asm -frename-registers -mmcu=atmega8 gnateDMCU=atmega8 -fdata-sections -ffunction-sections -I- -gnatA C:\avr_test\led_on.adb
c:\avr_test\led_on.adb:3:06: warning: unit "task_bla" is not referenced
c:\avr_test\task_bla.ads:3:04: construct not allowed in configurable run-time mode
c:\avr_test\task_bla.ads:3:04: violation of restriction "no_tasking" at C:\avr-ada\lib    \gnat\gnat.adc:124
avr-gnatmake: "c:\avr_test\led_on.adb" compilation error
make: ** [led_on.elf] Erro 4

那么,我该怎么做才能启用任务功能呢?

我的包只有非常简单的测试任务:(我只是想检查任务功能)

-- led_on.adb
with AVR; use AVR;
with AVR.MCU;
with task_bla;
procedure LED_On is
 LED : Boolean renames MCU.PortB_Bits (3);
begin
 MCU.DDRB_Bits := (others => DD_Output);
 LED := Low;
end LED_On;

-- task_bla.ads
package task_bla is
 task test;
end task_bla;

-- task_bla.adb
package task_bla is
 task body test is
  loop
   null;
  end loop;
 end test;
end task_bla;
4

3 回答 3

3

我发现了什么可能是这方面的线索。我正在更详细地阅读 AVR-Ada 文档,我在AVR-Ada Sourceforge 文档http://sourceforge.net/apps/mediawiki/avr-ada/index.php?title=Status的状态区域找到了这个:

AVR-Ada 目前是基于 gcc-4.3.3 的 V1.1。

提供的 Ada 运行时系统 (RTS) 在大多数情况下甚至不是运行时系统。它更像是一个编译时系统:-)。RTS 中的大多数文件仅在编译时需要。因此,我们还不支持异常或任务(多线程)。

有一些 AVR 特定的支持。类型和接口定义、定时例程、eeprom 访问、UART,最重要的是大多数 AVR 部件的必要端口和中断定义。

因此,任务功能最初未启用/可用。深入了解文档,我在http://sourceforge.net/apps/mediawiki/avr-ada/index.php?title=InstallRunTimeSystem中找到了这个:

安装运行时间系统

安装 Ada 运行时系统和 AVR 支持库

构建和安装 Ada 交叉编译器后,您需要一个基本的运行时系统 (RTS)。

解压 AVR-Ada 源代码分发包后,在顶级目录中运行 configure 和 make。配置从已安装的 gcc 确定安装路径(PREFIX)。有关不同的 make 目标,请参阅 Makefile 中的注释。您应该首先构建和安装 RTS,然后是 AVR 库。RTS 将安装在 gcc 树中,AVR 库将安装在 PREFIX/avr/ada 中。确保您在这些位置具有写入权限。

configure
make build_rts
make install_rts
make build_libs
make install_libs

运行时库中只有少数文件存在。目前它仅包含编译时需要的文件。请参阅目录 rts/adainclude。

AVR-Ada 的未来版本应该扩展提供的 RTS 的可能性。这可能包括:

艾达例外。AVR-libc 中已经支持 setjmp/longjmp,但我不知道异常在嵌入式系统中有多大用处。简单的任务(如在 Ravenscar 配置文件中)。这可能应该建立在像 AvrX 这样的小型调度程序之上。

不要指望在不久的将来会出现任何东西!

好吧,我还没有时间来测试这一切。但很快我就完成了。也许需要付出一点努力才能启用任务。

于 2011-10-25T03:04:08.983 回答
3

在不了解 AVR 的情况下,您的 gnat.adc 文件中似乎有一个 no_tasking 限制,在第 124 行,看看这个,看看您是否可以安全地删除它。

注意:这可能是出于一个很好的理由,所以这样做需要您自担风险。

于 2011-10-24T08:33:08.740 回答
3

您必须为 AVR-Ada 的运行时系统实现任务。

我认为硬件不能很好地支持任务,所以这可能非常困难。

于 2011-10-24T06:25:57.887 回答