Баг компилятора
- Войдите на сайт для отправки комментариев
Сб, 04/03/2017 - 15:30
Добрый день!
Внезапно появилась ошибка при компиляции:
unable to find a register to spill in class 'POINTER_REGS'
До этого тот же самый код компилировался нормально. Пробовал на 1.6.13 и 1.8.1. Как это исправить?
Код функции, на которую ругается (подсвечивает красным последнюю строку, в которой скобка закрывающая "}"):
void calculateLegIK() { unsigned int tmp = 30; for (uint8_t i = 0; i < 6; i++) { transformX[i] = newPosX[i] * cos(tmp * MATH_PI / 180) - newPosY[i] * sin(tmp * MATH_PI / 180); transformY[i] = newPosX[i] * sin(tmp * MATH_PI / 180) + newPosY[i] * cos(tmp * MATH_PI / 180); transformZ[i] = newPosZ[i]; tmp += 60; coxaFeetDist[i] = sqrt(transformX[i] * transformX[i] + transformY[i] * transformY[i]); IKSW[i] = sqrt((coxaFeetDist[i] - COXA_LENGTH) * (coxaFeetDist[i] - COXA_LENGTH) + (transformZ[i] * transformZ[i])); IKA1[i] = atan((coxaFeetDist[i] - COXA_LENGTH) / transformZ[i]); IKA2[i] = acos((TIBIA_LENGTH * TIBIA_LENGTH - FEMUR_LENGTH * FEMUR_LENGTH - IKSW[i] * IKSW[i]) / (-2 * IKSW[i] * FEMUR_LENGTH)); tAngle[i] = acos((IKSW[i] * IKSW[i] - TIBIA_LENGTH * TIBIA_LENGTH - FEMUR_LENGTH * FEMUR_LENGTH) / (-2 * FEMUR_LENGTH * TIBIA_LENGTH)); tibiaAngle[i] = round(90 - (tAngle[i] * 180 / MATH_PI)); femurAngle[i] = round(((IKA1[i] + IKA2[i]) * 180 / MATH_PI) - 90); coxaAngle[i] = round(90 - (atan2(transformY[i], transformX[i]) * 180 / MATH_PI)); } }
полный лог давай
collect2.exe: error: ld returned 1 exit status
версия виндовс какая?
Windows 7 Начальная 32-разрядная
Windows 7 Начальная 32-разрядная
у народа на XP обычно collect2.exe ошибки выдавал.
у меня на семёрке пару раз выскакивало, но после перезагрузки ИДЕ пропадало.
подожди, может кто что посоветует.
Если бы Вы дали полный код, чтобы я мог его покомпилировать у себя, я бы попытался Вам помочь. Если будете давать, заодно давайте ссылки на используемые бибилиотеки.
Библиотеки: Speedtrig - https://github.com/Anon-Penguin/SpeedTrig; TimerOner11 - https://code.google.com/archive/p/arduino-timerone/downloads; PS2X_lib - https://github.com/madsci1016/Arduino-PS2X;
Полный код:
В общем, это действительно недоработка оптимизатора. У Вас в строка 422-423 происходит много сложных вещей
1) дважды вычисляются одинаковые sin и cos
2) четырежды вычисляется один и тот же аргумент для этих sin и cos
3) всё это на фоне неявного преобразования типов с потерей точности (т.к. sin и cos вообще-то double, а Вы присваиваете float)
Всё это смешалось в большую кучу и оптимизатор немного слетает с катушек.
Решений несколько. Можно, например, выключить оптимизацию, но это очень плохая идея, хочется сохранить её . Самое простое - немного помочь оптимизатору (упростить ему задачу), например, вручную вынести одинаковые вычисления. И тогда он перестанет дурить.
Просто вместо строк 422-423 поставьте вот такие
и проблема уйдёт. Я проверил в 1.8.1. В 1.6.13 не проверял, у меня её нет.
ЕвгенийП, спасибо Вам большое! Код компилируется! Подскажите пожалуйста, как правильно оформить такие вычисления? У меня получается каждый раз 18 значений хранятся в 3-х разных массивах, и и все это глобальные переменные. Может тут будет правильнее создать класс и в нем описать все эти функции с формулами?
Не могу ответить на этот вопрос. Структура данных настолько неразрывно связана с алгоритмом обработки - это надо с головой в Вашу задачу погружаться.