STM32F4XX

Все о микроконтроллерах: AVR, PIC, STM8, STM32, Arduino, Altera, Xilinx, все что угодно. Этот раздел для всего что клацает байтиками.
tetraa
Сообщения: 41
Откуда: киев

Сообщение tetraa » 09 июл 2012, 17:09

Здравствуйте, проблема вычисления корня квадратного на 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. подскажите кто что знает.

Аватара пользователя
BSVi
Адепт
Сообщения: 3576
Откуда: Киев

Сообщение BSVi » 09 июл 2012, 17:26

Используй sqrtf вместо sqrt.

tetraa
Сообщения: 41
Откуда: киев

Сообщение tetraa » 09 июл 2012, 17:29

rex = sqrtf(x); так?

Аватара пользователя
BSVi
Адепт
Сообщения: 3576
Откуда: Киев

Сообщение BSVi » 09 июл 2012, 17:38

А может быть как-то по-другому?

tetraa
Сообщения: 41
Откуда: киев

Сообщение tetraa » 09 июл 2012, 17:38

Всё я понял ! так мы говорим компилятору что хотим получить корень квадратный из флоата?

Аватара пользователя
BSVi
Адепт
Сообщения: 3576
Откуда: Киев

Сообщение BSVi » 09 июл 2012, 18:02

Да ничего мы не говорим, просто вызываем другую функцию. Простой sqrt работает с double. Можешь посмотреть math.h.

tetraa
Сообщения: 41
Откуда: киев

Сообщение tetraa » 09 июл 2012, 18:09

Всё понял. Спасибо BSVi, Я чёто не догадался, так и знал что оно в double переводит, когда на дезасемблер смотрел :) чутка тупит иар ИМХО. когда я вместо char пихал const char, то он ругался, а тут тихонько себе молчит.

Вернуться в «Микроконтроллеры и ПЛИС»



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 10 гостей