Ykmys Soitum

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

19.06.2012, 14:02. Показов 7406. Ответов 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 ошибку выкидывает одинаковую.
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.06.2012, 14:02
Ответы с готовыми решениями:

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

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

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

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

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

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

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

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

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

------------------------------
Всем спасибо за оказанное внимание к вопросу. Это помогло найти ошибку в своих рассуждениях :).
0 / 0 / 0
Регистрация: 01.02.2011
Сообщений: 275
19.06.2012, 17:12
Igmys Caelum, какая версия winavr/gcc? Может выложишь проект? Интересно все же, где косяк. Я конечно допускаю что есть баг в avr-libc, но все же вероятнее всего проблема в вызове компилятора/компоновщика.
0
Ykmys Soitum
19.06.2012, 17:20
Цитата Сообщение от 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 / 0 / 0
Регистрация: 01.02.2011
Сообщений: 275
20.06.2012, 06:14
Проблема решается добавлением одной строки в мэйкфайл:
Code
1
2
3
4
5
6
7
8
9
10
11
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
Вызов компоновщика без этой строки
Code
1
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
И с этой строкой
Code
1
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
20.06.2012, 16:04
Цитата Сообщение от btymdmom
Проблема решается добавлением одной строки в мэйкфайл:Код:
+LIBS=-lm

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

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

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

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

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

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

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

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

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

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

Может кто знает более красивые варианты решения таких проблемм?
А вы попробуйте написать просто
Code
1
a = 0.3333 * b;
Разница появится?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.12.2012, 18:16
Помогаю со студенческими работами здесь

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

Ошибка при сборке проекта
Приветствую всех. 2-ой день пытаюсь сделать так, что бы при нажатии на кнопку открывалось что-то(окно имею ввиду). Всё время одна и та...

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

Ошибка при сборке проекта
Установил Qwt в папку C:\\ Далее сделал такие операции в командной строке cd C:\Qt\4.8.5\qmake qmake C:\Qwt\qwt.pro Но...

Ошибка, при сборке проекта
День добрый! Проблема в следующем: подключил библиотеки (using), добавил ссылки на *.dll в разделе References. При создании...


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

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

Новые блоги и статьи
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
PowerShell и онлайн сервисы. Валюта (floatrates.com руб.)
iNNOKENTIY21 11.11.2025
PowerShell функция floatrates-rub Примеры вызова: # Указанная валюта 'EUR' floatrates-rub -Code 'EUR' # Список имеющихся кодов валют floatrates-rub -Available function floatrates-rub {
PowerShell и онлайн сервисы. Погода (RP5.ru)
iNNOKENTIY21 11.11.2025
PowerShell функция Get-WeatherRP5rss для получения погоды с сервиса RP5 Примеры вызова Get-WeatherRP5rss с указанием id 5484 — Москва (восток, Измайлово) и переносом строки:. . .
PowerShell и онлайн сервисы. Погода (wttr)
iNNOKENTIY21 11.11.2025
PowerShell Функция для получения погоды с сервиса wttr Примеры вызова: Погода в городе Омск с прогнозом на день, можно изменить прогноз на более дней, для этого надо поменять запрос:. . .
PowerShell и онлайн сервисы. Валюта (ЦБР)
iNNOKENTIY21 11.11.2025
# Получение курса валют function cbr (] $Valutes = @('USD', 'EUR', 'CNY')) { $url = 'https:/ / www. cbr-xml-daily. ru/ daily_json. js' $data = Invoke-RestMethod -Uri $url $esc = 27 . . .
И решил я переделать этот ноут в машину для распределенных вычислений
Programma_Boinc 09.11.2025
И решил я переделать этот ноут в машину для распределенных вычислений Всем привет. А вот мой компьютер, переделанный из ноутбука. Был у меня ноут асус 2011 года. Со временем корпус превратился. . .
Мысли в слух
kumehtar 07.11.2025
Заметил среди людей, что по-настоящему верная дружба бывает между теми, с кем нечего делить.
Новая зверюга
volvo 07.11.2025
Подарок на Хеллоуин, и теперь у нас кроме Tuxedo Cat есть еще и щенок далматинца: Хочу еще Симбу взять, очень нравится. . .
Инференс ML моделей в Java: TensorFlow, DL4J и DJL
Javaican 05.11.2025
Python захватил мир машинного обучения - это факт. Но когда дело доходит до продакшена, ситуация не так однозначна. Помню проект в крупном банке три года назад: команда data science натренировала. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru