STM32F4XX
Добавлено: 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. подскажите кто что знает.
Раньше была проблема что любая инструкция 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. подскажите кто что знает.