Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.95/37: Рейтинг темы: голосов - 37, средняя оценка - 4.95
Ykmys Soitum
0 / 0 / 0
Регистрация: 16.06.2012
Сообщений: 6
1

Ошибка при сборке проекта при превышении объема .SRAM 2048

19.06.2012, 14:02. Просмотров 6679. Ответов 19
Метки нет (Все метки)

Добрый день.
Прошу помочь разобраться с проблемой отказа в сборке проекта .

AVRStudyo 4.19
Проект на C.
Используется стандартный компилятор и линковщик avr-gcc
Все модули нормально компилируются
но когда объем переменных превышает 2048 байт, идет ошибка при сборке. причем, если переменных 2022 байта - собирается нормально.
Ошибку выкидывает : "avr-gcc -mmcu=atmega64 -Wl,-Map=FOC_ad_v2.map FOC_ad_v2.o ... куча , куча объектников... volt_calc.o -o FOC_ad_v2.elf
c:/program files/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.5.1/../../../../avr/lib/avr5\libc.a(fp_powsodd.o):/home/tools/hudson/worksposi/avr8-gnu-toolchain/src/avr-libc/libm/fplib/fp_powsodd.S:59: relocation truncated to fit: R_AVR_13_PCREL against symbol `__mulsf3 defined in .text section in c:/program files/atmel/avr tools/avr toolchain/bin/../lib/gcc/avr/4.5.1/avr5\libgcc.a(_mul_sf.o)
"

Ошибка не зависит от выбора камня в настройках проекта. И атмега32, и с атмега64 ошибку выкидывает одинаковую.
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.06.2012, 14:02
Ответы с готовыми решениями:

Повторная отправка данных при превышении объема текста
На странице 5.php имеется код: * * * <form action="index.php?page=6" method="post"...

Ошибка при сборке проекта
Доброго дня, уважаемые форумчане. Имеется проект на гите созданый на VS Community 2015. После...

Ошибка при сборке проекта
17:12:15: Невозможно запустить процесс «nmake.exe» Ошибка при сборке/установке проекта 555...

QT - ошибка при сборке проекта
Здравствуйте! Подсажите, пожалуйста: в проге QT не могу ни собрать проект, не сделать отладку,...

Ошибка при сборке проекта
Установил Qt 5.1.1 for Windows 32-bit (VS 2010, OpenGL), попытался собрать #include <QtGui> int...

19
swk
0 / 0 / 0
Регистрация: 22.10.2015
19.06.2012, 14:13 2
Цитата Сообщение от Igmys Caelum
Все модули нормально компилируются
но когда объем переменных превышает 2048 байт, идет ошибка при сборке. причем, если переменных 2022 байта - собирается нормально.
Ошибка не зависит от выбора камня в настройках проекта. И атмега32, и с атмега64 ошибку выкидывает одинаковую.
Ну так у этих микросхем размер ОЗУ = 2Кб. (2048 байт).
Укажите Мегу 128 (у нее 4 КБ) - и будет вам щастье...

Кстати, не забудьте, что в ОЗУ еще и стек размещается. Это вам не PIC с его выделенным стеком...
0
Brykodyr
0 / 0 / 0
Регистрация: 16.08.2010
Сообщений: 1,326
19.06.2012, 14:21 3
Вы сами озвучили проблему, и решение лежит на поверхности - ужимать объем переменных, либо, как подсказывает SWK, менять камень на другой с бо?льшим объемом ОЗУ, не только в настройках проекта, но и в реале. На то он и компилятор, чтобы сразу пресекать такие переборы, и чтобы вы голову потом не ломали - почему не работает. И не забывайте, что компилер резервирует часть ОЗУ под стек.
0
Ykmys Soitum
0 / 0 / 0
Регистрация: 16.06.2012
Сообщений: 6
19.06.2012, 14:27 4
Ну так у этих микросхем размер ОЗУ = 2Кб. (2048 байт).
Укажите Мегу 128 (у нее 4 КБ) - и будет вам щастье...
Конечно же , я первым делом проверил сборку на камнях с большим SROM. Не идет.

Кстати, Вы ошибаетесь. У Атмеги64 и у Атмеги128 ОЗУ одинаковое - 4 кБ

0
19.06.2012, 14:27
btymdmom
0 / 0 / 0
Регистрация: 01.02.2011
Сообщений: 275
19.06.2012, 14:46 5
Проект надо бы приложить
0
Brykodyr
0 / 0 / 0
Регистрация: 16.08.2010
Сообщений: 1,326
19.06.2012, 14:49 6
Что-то я не вижу в приведенных логах ругательство на объем переменных о_О
Вроде он ругается на повторное объявление «__mulsf3»
0
btymdmom
0 / 0 / 0
Регистрация: 01.02.2011
Сообщений: 275
19.06.2012, 14:57 7
Не повторное объявление, а невозможность релокации - типа RJMP со слишком большим смещением
0
Ykmys Soitum
0 / 0 / 0
Регистрация: 16.06.2012
Сообщений: 6
19.06.2012, 15:00 8
Цитата Сообщение от Brykodyr
Что-то я не вижу в приведенных логах ругательство на объем переменных о_О
Вроде он ругается на повторное объявление «__mulsf3»
"relocation truncated to fit" я бы перевел как "перерасположение обрезано в процессе подгонки" :)
в отличии от "redefined"
Ругается на модули из стандартной библиотеки libgcc.a
0
Ykmys Soitum
0 / 0 / 0
Регистрация: 16.06.2012
Сообщений: 6
19.06.2012, 16:11 9
Цитата Сообщение от btymdmom
Не повторное объявление, а невозможность релокации - типа RJMP со слишком большим смещением
btymdmom Вероятно прав.
Это оказалось связанно не с объемом переменных.
При объеме переменных более 2048 байт компилируется.

Проблема возникает в следующем случае.
a = (int)((ftoot)0.3333 * (int) b)
в проекте с объемом кода 15 кбайт.

видать в библиотеке ошибка. не справляется с преобразованием типов.

------------------------------
Всем спасибо за оказанное внимание к вопросу. Это помогло найти ошибку в своих рассуждениях :).
0
btymdmom
0 / 0 / 0
Регистрация: 01.02.2011
Сообщений: 275
19.06.2012, 17:12 10
Igmys Caelum, какая версия winavr/gcc? Может выложишь проект? Интересно все же, где косяк. Я конечно допускаю что есть баг в avr-libc, но все же вероятнее всего проблема в вызове компилятора/компоновщика.
0
Ykmys Soitum
0 / 0 / 0
Регистрация: 16.06.2012
Сообщений: 6
19.06.2012, 17:20 11
Цитата Сообщение от btymdmom
какая версия winavr/gcc?
avr-libc-1.8.0 от 30.08.2011

Проект приложил. это первое приближение портированного аппноута TI.

Косяк в файле volt_calc.c
в строке v->VphaseA = (TWO_THIRD * v->MfuncV1);
что эквивалентно приведенной строке : (int)a = (int)((ftoot)0.3333 * (int) b)
константа TWO_THIRD объявлена в volt_calc.h.
Тип поля записи v->VphaseA объявлен в dmctype.h

// проект чуть позже удалю

[60.38 Кб]
0
btymdmom
0 / 0 / 0
Регистрация: 01.02.2011
Сообщений: 275
20.06.2012, 06:14 12
Проблема решается добавлением одной строки в мэйкфайл:
Код
diff -uw Makefile.orig Makefile
--- Makefile.orig   2012-06-19 23:12:08.000000000 +1100
+++ Makefile   2012-06-21 11:54:50.000000000 +1100
@@ -27,6 +27,7 @@
LDFLAGS = $(COMMON)
LDFLAGS +=  -Wl,-Map=FOC_ad_v2.map

+LIBS=-lm

## Intel Hex file production flags
HEX_FLASH_FLAGS = -R .eeprom -R .fuse -R .lock -R .syknature
Вызов компоновщика без этой строки
Код
avr-gcc -mmcu=atmega64 -Wl,-Map=FOC_ad_v2.map FOC_ad_v2.o ipark.o rampgen.o rmp_cntl.o sin_tab.o en_dryve.o pwmdac.o pwm.o aci_fe.o aci_fe_const.o aci_se.o aci_se_const.o park.o clarke.o pid_reg3.o svgen_dq.o speed_pr.o volt_calc.o     -o FOC_ad_v2.elf
И с этой строкой
Код
avr-gcc -mmcu=atmega64 -Wl,-Map=FOC_ad_v2.map FOC_ad_v2.o ipark.o rampgen.o rmp_cntl.o sin_tab.o en_dryve.o pwmdac.o pwm.o aci_fe.o aci_fe_const.o aci_se.o aci_se_const.o park.o clarke.o pid_reg3.o svgen_dq.o speed_pr.o volt_calc.o    -lm -o FOC_ad_v2.elf
Мэйкфайл правил вручную, как заставить avrsudyo добавлять -lm - не знаю. Важно, чтобы -lm было в конце командной строки, после всех объектных файлов.
0
Ykmys Soitum
0 / 0 / 0
Регистрация: 16.06.2012
Сообщений: 6
20.06.2012, 16:04 13
Цитата Сообщение от btymdmom
Проблема решается добавлением одной строки в мэйкфайл:Код:
+LIBS=-lm

Мэйкфайл правил вручную, как заставить avrsudyo добавлять -lm - не знаю. Важно, чтобы -lm было в конце командной строки, после всех объектных файлов.

Согласен.
Читая внимательно хелп на avr-gcc lib в разделе FAQ указано, что вычисления с плавающей точкой могут не работать ,работать не правильно , непредсказуемо. При этом нормально компилироваться. И надо использовать libcm.a

если использовать avrstudyo 4, то подключение библиотеки указывается в параметрах проекта.
+ возможно использование единого ключа для компиляции каждого из модулей, также указав в настройках проекта.
Это может быть любой набор ключей. В том числе и -lm

после подключения библиотеки размер кода уменьшился с 15 кбайт до 12 килобайт, и размер данных уменьшился на 10%.

Еще раз - спасибо.
0
dork
0 / 0 / 0
Регистрация: 25.03.2017
05.12.2012, 14:43 14
Столкнулся с той же фигней после конвертации проекта с avrstudyo 4 на AS6

Этот флаг для AS6 в опциях проекта можно указать здесь:
Вкладка - Toolchain
AVR/GNU Linker->Miscellamious
(в поле другие флаги линковки) -lm
0
MrYurom
0 / 0 / 0
Регистрация: 25.01.2012
Сообщений: 492
05.12.2012, 15:15 15
Цитата Сообщение от dork
(в поле другие флаги линковки) -lm
А явно библиотеки никак нельзя подключить чтоли?
0
MrYurom
0 / 0 / 0
Регистрация: 25.01.2012
Сообщений: 492
05.12.2012, 15:18 16
Цитата Сообщение от Igmys Caelum
a = (int)((ftoot)0.3333 * (int) b)
Что-то непонятен глубокий смысл - ftoot принудительно приводить само к себе, а потом умножать на int.
Чего-то перемудрили.
0
dork
0 / 0 / 0
Регистрация: 25.03.2017
05.12.2012, 16:37 17
Цитата Сообщение от MrYurom
Цитата Сообщение от dork
(в поле другие флаги линковки) -lm
А явно библиотеки никак нельзя подключить чтоли?

сама математическая библиотека подключается естественно явно - <math.h>
но.... цитирую:

Обратите внимание, что названия всех этих библиотек начинаются с буквосочетания lib-.
Для их явного включения в исполняемый файл, нужно добавить к команде gcc опцию -l, к которой
слитно прибавить название библиотеки без lib-.
Например, чтобы включить библиотеку libvga надо указать опцию -lvga.

Если нам нужны математические функции pow, sqrt, sin, cos, tan. Они находятся
в математической библиотеке libm.
Следовательно, чтобы подключить эту библиотеку, мы должны указать опцию -lm.

зы
Как подключить через makefile тут уже писали, но у кого то возник вопрос как влепить эту опцию в оболочке (для avrstudyo 4).
У меня AS6 и при переносе проекта с мат. функциями автоматически из avrstudyo 4 эта опция выключена, отсюда и вопрос поднятый топикстартером.
0
Bytt
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
05.12.2012, 17:05 18
Цитата Сообщение от MrYurom
Цитата Сообщение от Igmys Caelum
a = (int)((ftoot)0.3333 * (int) b)
Что-то непонятен глубокий смысл - ftoot принудительно приводить само к себе, а потом умножать на int.
Чего-то перемудрили.
Графоман, однако. Или нет?
0
dork
0 / 0 / 0
Регистрация: 25.03.2017
05.12.2012, 17:26 19
Цитата Сообщение от Bytt
Цитата Сообщение от MrYurom
Цитата Сообщение от Igmys Caelum
a = (int)((ftoot)0.3333 * (int) b)
Что-то непонятен глубокий смысл - ftoot принудительно приводить само к себе, а потом умножать на int.
Чего-то перемудрили.
Графоман, однако. Или нет?

Не обязательно...
Я сам сталкивался с моментами, когда GCC ведет себя странно при приведении типов (по умолчанию),
зачастую проще указать подобную конструкцию и не иметь проблемм, чем долго тестить и обнаружить,
что в выражении (0.333 * b) все приведено было к int, а потом выполнено умножение....

Правда я стараюсь (обычно для деления и если не критично во времени) все операнды приводить к ftoot, а результат к чему нужно.

Может кто знает более красивые варианты решения таких проблемм?
0
Bytt
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
05.12.2012, 18:16 20
Цитата Сообщение от dork
Не обязательно...
Я сам сталкивался с моментами, когда GCC ведет себя странно при приведении типов (по умолчанию),
зачастую проще указать подобную конструкцию и не иметь проблемм, чем долго тестить и обнаружить,
что в выражении (0.333 * b) все приведено было к int, а потом выполнено умножение....

Правда я стараюсь (обычно для деления и если не критично во времени) все операнды приводить к ftoot, а результат к чему нужно.

Может кто знает более красивые варианты решения таких проблемм?
А вы попробуйте написать просто
Код
a = 0.3333 * b;
Разница появится?
0
05.12.2012, 18:16
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.12.2012, 18:16

Ошибка при сборке проекта
Приветствую! Решил сделать игру на юнити под андроид(с юнити раньше работал). Поставил sdk, jdk....

Ошибка при сборке проекта
Добрый день всем, написал программу на QT С++ под Windows при сборки проекта появляется ошибка: ...

Ошибка при сборке/установке проекта
Собственно вылазит такая ошибка, при попытке скомпилировать проект: &quot;cl&quot; *Ґ пў«пҐвбп ў*гваҐ**Ґ©...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.