我正在尝试使用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;
答案 0 :(得分:3)
您必须为AVR-Ada的运行系统实施任务。
我认为硬件不支持任务,所以这可能非常困难。
答案 1 :(得分:3)
在不了解AVR的情况下,您的gnat.adc文件中存在no_tasking限制,在第124行,看看这个,看看您是否可以安全地删除它。
注意:这可能是出于好的原因,所以这样做需要您自担风险。
答案 2 :(得分:3)
我发现了什么可能是一个线索。我正在更详细地阅读AVR-Ada文档,我在AVR-Ada Sourceforge文档http://sourceforge.net/apps/mediawiki/avr-ada/index.php?title=Status的 Status 区域中找到了这个:
根据gcc-4.3.3,AVR-Ada的电流为V1.1。
提供的Ada运行时系统(RTS)在很大程度上甚至不是运行时系统。它更像是一个编译时系统:-)。 RTS中的大多数文件仅在编译时需要。因此,我们还不支持例外或任务(多线程)。
有一些AVR特定的支持。类型和接口定义,时序例程,eeprom访问,UART,以及最重要的大多数AVR部件的必要端口和中断定义。
因此,首先没有启用/可用任务功能。深入了解文档,我在http://sourceforge.net/apps/mediawiki/avr-ada/index.php?title=InstallRunTimeSystem中找到了这个:
<强> InstallRunTimeSystem 强>
安装Ada运行时系统和AVR支持库
在构建和安装Ada交叉编译器之后,您需要一个基本的运行时系统(RTS)。
解压缩AVR-Ada源代码分发后,在顶级目录中运行configure和make。 Configure确定已安装的gcc的安装路径(PREFIX)。请参阅Makefile中有关不同make目标的注释。您应该首先构建并安装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的可能性。这可能包括:
Ada例外。 AVR-libc中已经支持setjmp / longjmp,但我不知道嵌入式系统中的异常有多大用处。 简单的任务(如在Ravenscar简介中)。这可能应该建立在像AvrX这样的小型调度程序之上。
不要指望在不久的将来出现的任何事情!
好吧,我还没来得及测试这一切。但很快我就会做到。并且可能需要一点努力才能启用任务。