Sl (23.08.2017 18:10, просмотров: 4545)
IAR ANSI C/C++ Compiler V8.11. Работа с float разрешена - --cpu=Cortex-M7 -e --fpu=VFPv5_sp. stm32f745. Проблема. Транслятор не хочет при извлечении квадратного корня из переменной типа float_t использовать команду vsqrt.f32. А считает нужным использовать библиотечные подпрограммы. :(
float_t FUinFC10_tmp;
float_t FUinADC_tmp;
373 FUinFC10_tmp = sqrt(FUinADC_tmp);
\ 000000D8 0xEE18 0x0A10 VMOV R0,S16
\ 000000DC 0x.... 0x.... BL __aeabi_f2d
\ 000000E0 0xEC41 0x0B10 VMOV D0,R0,R1
\ 000000E4 0x.... 0x.... BL sqrt
\ 000000E8 0xEC51 0x0B10 VMOV R0,R1,D0
\ 000000EC 0x.... 0x.... BL __aeabi_d2f
\ 000000F0 0xEE08 0x0A90 VMOV S17,R0
Хотя деление float/float выполняет без проблем.
369 FUinFC10_tmp = FUinADC_tmp/CFUin_0_1V;
\ 000000EA 0xED9F 0x.... VLDR.W S0,??DataTable132_1 ;; 0x3f7a2ad0 // Load.
\ 000000EE 0xEE88 0x8A80 VDIV.F32 S16,S17,S0
И против прямого вызова ассемблерной команды ничего не имеет против.
__asm volatile ("VSQRT.F32 S16,S17");
Как уговорить транслятор использовать VSQRT.F32 ?
Можно написать подпрограмму на ассемблере и ее вызывать. Но это не лучший вариант :(
Спасибо!