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について知らなくても、gnat.adcファイルの124行目にno_tasking制限があるようです。これを見て、安全に削除できるかどうかを確認してください。

注:これはおそらく正当な理由で行われたため、自己責任で行ってください。

于 2011-10-24T08:33:08.740 に答える
3

あなたはAVR-Adaのランタイムシステムのためにタスクを実装しなければならないでしょう。

ハードウェアがタスクをうまくサポートしていないと思うので、これはかなり難しいかもしれません。

于 2011-10-24T06:25:57.887 に答える
3

私はこれの手がかりになるかもしれないものを見つけました。私はAVR-Adaのドキュメントをより詳細に読んでいましたが、これはAVR-AdaSourceforgeのドキュメントのステータス領域にあります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で見つけました:

InstallRunTimeSystem

AdaランタイムシステムとAVRサポートライブラリをインストールします

Adaクロスコンパイラをビルドしてインストールした後、基本的なランタイムシステム(RTS)が必要です。

AVR-Adaソースディストリビューションを解凍した後、最上位ディレクトリでconfigureとmakeを実行します。Configureは、インストールされた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 に答える