【问题标题】:Tasking with AVR-Ada使用 AVR-Ada 处理任务
【发布时间】:2011-10-24 02:40:55
【问题描述】:

我正在尝试使用 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;

【问题讨论】:

    标签: ada avr avr-gcc winavr


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        我已经找到了可能的线索。我正在更详细地阅读 AVR-Ada 文档,我在 AVR-Ada Sourceforge 文档http://sourceforge.net/apps/mediawiki/avr-ada/index.php?title=StatusStatus 区域找到了这个:

        目前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 中找到了这个:

        InstallRunTimeSystem

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

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

        解压 AVR-Ada 源代码分发包后,在顶级目录中运行 configure 和 make。配置从已安装的 gcc 确定安装路径(PREFIX)。请参阅 Makefile 中的 cmets 以了解不同的 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 这样的小型调度程序之上。

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-04-10
          • 2017-04-16
          • 1970-01-01
          • 1970-01-01
          • 2015-07-18
          相关资源
          最近更新 更多