Здравствуйте, проблема вычисления корня квадратного на STM32F407, не хочет использовать инструкцию FPU - VSQRT.
Раньше была проблема что любая инструкция FPU не использовалась.
пример IAR 6.3
volatile float x;
volatile float rez;
rez = 0.1666666666666666666666666666666666666666666 * x;
результат компиляции
перевод x в тип double, умножение double x на double константу (естественно через програмные библеотеки IARа),
приведение результата в float.
в результате +100500 инструкций и командных тактов.
Решение довольно простое , объявить константу флоатом (написать в конце f)
rez = 0.1666666666666666666666666666666666666666666f * x;
результат компиляции 2 команды
VMOV r0 *** // загрузка float константы в регистр
VMUL r2, r1, r0 // умножение константы в r0 на x в r1.
но в случае с корнем квадратным всё вроде правильно
volatile float x;
volatile float rez;
rex = sqrt(x);
типы данных float но комплятор не использует VSQRT, он делает какоето преобразование (наверное в double ) и вызывает стандартую функцию sqrt. тоже +100500 тактов. Кто знает почему так происходит и как вызвать корень через FPU? В нете ничего не нашёл. ассемблерные вставки тоже не дали результата (не могу передать параметры в регистры)
Несколько недель пытаюсь разобраться, результата 0. подскажите кто что знает.
STM32F4XX
Всё я понял ! так мы говорим компилятору что хотим получить корень квадратный из флоата?
Да ничего мы не говорим, просто вызываем другую функцию. Простой sqrt работает с double. Можешь посмотреть math.h.
Всё понял. Спасибо BSVi, Я чёто не догадался, так и знал что оно в double переводит, когда на дезасемблер смотрел чутка тупит иар ИМХО. когда я вместо char пихал const char, то он ругался, а тут тихонько себе молчит.
Вернуться в «Микроконтроллеры и ПЛИС»
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 9 гостей