#ada #avr #avr-gcc #winavr
#ada #avr #avr-gcc #winavr
Вопрос:
Я пытаюсь реализовать функции постановки задач с помощью 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-adalibgnatgnat.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_testled_on.adb
c:avr_testled_on.adb:3:06: warning: unit "task_bla" is not referenced
c:avr_testtask_bla.ads:3:04: construct not allowed in configurable run-time mode
c:avr_testtask_bla.ads:3:04: violation of restriction "no_tasking" at C:avr-adalib gnatgnat.adc:124
avr-gnatmake: "c:avr_testled_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;
Ответ №1:
Вам пришлось бы реализовать постановку задач для системы выполнения AVR-Ada.
Я не думаю, что аппаратное обеспечение хорошо поддерживает постановку задач, так что это может быть довольно сложно.
Ответ №2:
Не зная об AVR, похоже, что в вашем файле gnat.adc в строке 124 есть ограничение no_tasking, взгляните на это и посмотрите, можно ли его безопасно удалить.
ПРИМЕЧАНИЕ: Вероятно, это было сделано по уважительной причине, поэтому делайте это на свой страх и риск.
Ответ №3:
Я нашел то, что, возможно, может быть ключом к этому. Я читал документацию AVR-Ada более подробно, и я нашел это в области состояния документации AVR-Ada Sourceforge http://sourceforge.net/apps/mediawiki/avr-ada/index.php?title=Status:
Текущая версия AVR-Ada — версия V1.1, основанная на gcc-4.3.3.
Предоставляемая 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. Смотрите Комментарии в файле 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.
Не рассчитывайте на то, что что-то появится в ближайшем будущем!
Ну, у меня еще не было времени протестировать все это. Но скоро я это сделаю. И, возможно, потребуется немного усилий, чтобы включить постановку задач.