Здравствуйте.
Скачал и поставил, затем ребутнул (для переменных окружения) GCC-тулчейн: gcc-arm-none-eabi-6-2017-q2-update-win32.exe
Затем написал программу тект ниже:
Код
#include <math.h>
float a=1.2F;
float b=3.21F;
float c=0.0F;
void main(void)
{
c=sin(a+b);
b=cos(a+c);
}
Построил бинарник и все необходимые файлы командами:
Код
arm-none-eabi-gcc -std=c99 -march=armv7-a -mfloat-abi=hard -mfpu=vfpv4 -c fpu.c -o fpu.elf -lm
arm-none-eabi-objdump -D fpu.elf > fpu.asm
arm-none-eabi-objcopy -O binary fpu.elf fpu.bin
При просмотре листинга видно, что функции sin( ) и cos( ) НЕ ИМПЛЕМЕНТИРОВАЛИСЬ, вместо них стоит переход:
Код
18: e3403000 movt r3, #0
1c: edd37a00 vldr s15, [r3]
20: ee777a27 vadd.f32 s15, s14, s15
24: eef70ae7 vcvt.f64.f32 d16, s15
28: eeb00b60 vmov.f64 d0, d16
2c: ebfffffe bl 0 <sin> ----------------------------- !!! нет вызова
30: eef00b40 vmov.f64 d16, d0
34: eef77be0 vcvt.f32.f64 s15, d16
38: e3003000 movw r3, #0
3c: e3403000 movt r3, #0
40: edc37a00 vstr s15, [r3]
44: e3003000 movw r3, #0
48: e3403000 movt r3, #0
4c: ed937a00 vldr s14, [r3]
50: e3003000 movw r3, #0
54: e3403000 movt r3, #0
58: edd37a00 vldr s15, [r3]
5c: ee777a27 vadd.f32 s15, s14, s15
60: eef70ae7 vcvt.f64.f32 d16, s15
64: eeb00b60 vmov.f64 d0, d16
68: ebfffffe bl 0 <cos> ----------------------------- !!! нет вызова
Других тулчейнов нет, пробовал soft-fpu, ничего не меняется, функции из math.h не имплементируются вообще!
Залез в папки тулчейна, так там libm.a несколько штук:
...\GCCARM\arm-none-eabi\lib\libm.a
...\GCCARM\arm-none-eabi\lib\thumb\libm.a
...\GCCARM\arm-none-eabi\lib\thumb\v7-ar\libm.a
...\GCCARM\arm-none-eabi\lib\thumb\v7-ar\fpv3\hard\libm.a
...\GCCARM\arm-none-eabi\lib\hard\libm.a
У меня нет слов, одни эмоции (касаемо GCC тулчейна)!
Помогите плиз, нужен хардварный синус/косинус для ядра Cortex-A7, VFPv4 или NEON - для floating point, как решить проблему?