Перейти к содержанию
    

GCC ARM - не имплементируются функции SIN, COS

Здравствуйте.

 

Скачал и поставил, затем ребутнул (для переменных окружения) 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, как решить проблему?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Скачал и поставил, затем ребутнул (для переменных окружения) GCC-тулчейн: gcc-arm-none-eabi-6-2017-q2-update-win32.exe

...

Помогите плиз, нужен хардварный синус/косинус для ядра Cortex-A7, VFPv4 или NEON - для floating point, как решить проблему?

Во-первых, не то скачали. Там английским по белому написано "Arm Cortex-M and Cortex-R". То есть дальше его ковырять нет смысла. Ищите правильный gcc.

 

Попробуйте вот это.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробуйте вот это.

 

Там 4 тулчейна и все оканчиваются на eabi, тоесть привязано к операционной системе. Мне надо под железо писать, какой из этих тулчейнов сойдёт?

 

Разработка в Win32, целевая платформа Cortex-A7.

 

gcc-linaro-6.3.1-2017.05-i686-mingw32_arm-eabi.tar.xz 23-May-2017 08:39 388.7M open

gcc-linaro-6.3.1-2017.05-i686_arm-eabi.tar.xz 23-May-2017 08:39 263.8M open

gcc-linaro-6.3.1-2017.05-x86_64_arm-eabi.tar.xz 23-May-2017 08:39 248.1M open

sysroot-newlib-linaro-2017.05-arm-eabi.tar.xz 23-May-2017 08:39 44.2M open

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот здесь разъясняют. Видимо, вам надо arm-eabihf, но такого там нет. Пичалька :crying:

Вероятно, придётся собирать тулчейн самостоятельно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

тот тулчейн что я скачал в ридмишнике написано :

 

|----------|--------------------------------------------|----------|

|Cortex-A* | [-mthumb] -march=armv7-a | armv7-ar |

|(No FP) | | /thumb |

|----------|--------------------------------------------|----------|

|Cortex-A* | [-mthumb] -march=armv7-a -mfloat-abi=softfp| armv7-ar |

|(Soft FP) | -mfpu=vfpv3-d16 | /thumb |

| | | /softfp |

|----------|--------------------------------------------|----------|

|Cortex-A* | [-mthumb] -march=armv7-a -mfloat-abi=hard | armv7-ar |

|(Hard FP) | -mfpu=vfpv3-d16 | /thumb |

| | | /fpu |

--------------------------------------------------------------------

 

Я правильно думаю, что -march=armv7-a - это Cortex-A7 ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здесь написано.

 

Спасибо! :)

 

Глянул:

ARMv7-A => ARM Cortex-A5, ARM Cortex-A7, ARM Cortex-A8, ARM Cortex-A9, ARM Cortex-A12, ARM Cortex-A15, ARM Cortex-A17

 

Значит тот тулчейн который я скачал тоже подходит!

 

Вызвал раздельно компиляцию и линковку, появился sin, cos, но вызовы ОЧЕНЬ стрёмные, Hard FPU тут даже и не пахнет:

 

000081b4 <main>:
    81b4:    e92d4800     push    {fp, lr}
    81b8:    e28db004     add    fp, sp, #4
    81bc:    e30a3de4     movw    r3, #44516; 0xade4
    81c0:    e3403001     movt    r3, #1
    81c4:    ed937a00     vldr    s14, [r3]
    81c8:    e30a3de8     movw    r3, #44520; 0xade8
    81cc:    e3403001     movt    r3, #1
    81d0:    edd37a00     vldr    s15, [r3]
    81d4:    ee777a27     vadd.f32    s15, s14, s15
    81d8:    eeb00a67     vmov.f32    s0, s15
    81dc:    fa000005     blx    81f8 <sinf>
    81e0:    eef07a40     vmov.f32    s15, s0
    81e4:    e30b364c     movw    r3, #46668; 0xb64c
    81e8:    e3403001     movt    r3, #1
    81ec:    edc37a00     vstr    s15, [r3]
    81f0:    e320f000     nop    {0}
    81f4:    e8bd8800     pop    {fp, pc}

000081f8 <sinf>:
    81f8:    ee10 3a10     vmov    r3, s0
    81fc:    f640 72d8     movw    r2, #4056; 0xfd8
    8200:    f6c3 7249     movt    r2, #16201; 0x3f49
    8204:    b500          push    {lr}
    8206:    b083          sub    sp, #12
    8208:    f023 4300     bic.w    r3, r3, #2147483648; 0x80000000
    820c:    4293          cmp    r3, r2
    820e:    dd1a          ble.n    8246 <sinf+0x4e>
    8210:    f1b3 4fff     cmp.w    r3, #2139095040; 0x7f800000
    8214:    db04          blt.n    8220 <sinf+0x28>
    8216:    ee30 0a40     vsub.f32    s0, s0, s0
    821a:    b003          add    sp, #12
    821c:    f85d fb04     ldr.w    pc, [sp], #4
    8220:    4668          mov    r0, sp
    8222:    f000 f833     bl    828c <__ieee754_rem_pio2f>
    8226:    f000 0003     and.w    r0, r0, #3
    822a:    2801          cmp    r0, #1
    822c:    d01d          beq.n    826a <sinf+0x72>
    822e:    2802          cmp    r0, #2
    8230:    d011          beq.n    8256 <sinf+0x5e>
    8232:    b308          cbz    r0, 8278 <sinf+0x80>
    8234:    eddd 0a01     vldr    s1, [sp, #4]
    8238:    ed9d 0a00     vldr    s0, [sp]
    823c:    f000 f960     bl    8500 <__kernel_cosf>
    8240:    eeb1 0a40     vneg.f32    s0, s0
    8244:    e7e9          b.n    821a <sinf+0x22>
    8246:    2000          movs    r0, #0
    8248:    eddf 0a0f     vldr    s1, [pc, #60]; 8288 <sinf+0x90>
    824c:    f000 fd08     bl    8c60 <__kernel_sinf>
    8250:    b003          add    sp, #12
    8252:    f85d fb04     ldr.w    pc, [sp], #4
    8256:    2001          movs    r0, #1
    8258:    eddd 0a01     vldr    s1, [sp, #4]
    825c:    ed9d 0a00     vldr    s0, [sp]
    8260:    f000 fcfe     bl    8c60 <__kernel_sinf>
    8264:    eeb1 0a40     vneg.f32    s0, s0
    8268:    e7d7          b.n    821a <sinf+0x22>
    826a:    eddd 0a01     vldr    s1, [sp, #4]
    826e:    ed9d 0a00     vldr    s0, [sp]
    8272:    f000 f945     bl    8500 <__kernel_cosf>
    8276:    e7d0          b.n    821a <sinf+0x22>
    8278:    2001          movs    r0, #1
    827a:    eddd 0a01     vldr    s1, [sp, #4]
    827e:    ed9d 0a00     vldr    s0, [sp]
    8282:    f000 fced     bl    8c60 <__kernel_sinf>
    8286:    e7c8          b.n    821a <sinf+0x22>
    8288:    00000000     andeq    r0, r0, r0

00008500 <__kernel_cosf>:
    8500:    ee10 3a10     vmov    r3, s0
    8504:    f023 4300     bic.w    r3, r3, #2147483648; 0x80000000
    8508:    f1b3 5f48     cmp.w    r3, #838860800; 0x32000000
    850c:    da2c          bge.n    8568 <__kernel_cosf+0x68>
    850e:    eefd 7ac0     vcvt.s32.f32    s15, s0
    8512:    ee17 3a90     vmov    r3, s15
    8516:    2b00          cmp    r3, #0
    8518:    d067          beq.n    85ea <__kernel_cosf+0xea>
    851a:    ee20 7a00     vmul.f32    s14, s0, s0
    851e:    eddf 7a34     vldr    s15, [pc, #208]; 85f0 <__kernel_cosf+0xf0>
    8522:    ed9f 5a34     vldr    s10, [pc, #208]; 85f4 <__kernel_cosf+0xf4>
    8526:    eddf 5a34     vldr    s11, [pc, #208]; 85f8 <__kernel_cosf+0xf8>
    852a:    ed9f 6a34     vldr    s12, [pc, #208]; 85fc <__kernel_cosf+0xfc>
    852e:    ee07 5a27     vmla.f32    s10, s14, s15
    8532:    eddf 7a33     vldr    s15, [pc, #204]; 8600 <__kernel_cosf+0x100>
    8536:    eddf 6a33     vldr    s13, [pc, #204]; 8604 <__kernel_cosf+0x104>
    853a:    ee55 5a07     vnmls.f32    s11, s10, s14
    853e:    ee05 6a87     vmla.f32    s12, s11, s14
    8542:    ee56 7a07     vnmls.f32    s15, s12, s14
    8546:    ee47 6a87     vmla.f32    s13, s15, s14
    854a:    ee66 6a87     vmul.f32    s13, s13, s14
    854e:    ee20 0a20     vmul.f32    s0, s0, s1
    8552:    ee17 0a26     vnmls.f32    s0, s14, s13
    8556:    eef6 7a00     vmov.f32    s15, #96; 0x3f000000  0.5
    855a:    ee17 0a27     vnmls.f32    s0, s14, s15
    855e:    eef7 7a00     vmov.f32    s15, #112; 0x3f800000  1.0
    8562:    ee37 0ac0     vsub.f32    s0, s15, s0
    8566:    4770          bx    lr
    8568:    ee20 7a00     vmul.f32    s14, s0, s0
    856c:    f649 1299     movw    r2, #39321; 0x9999
    8570:    eddf 7a1f     vldr    s15, [pc, #124]; 85f0 <__kernel_cosf+0xf0>
    8574:    f6c3 6299     movt    r2, #16025; 0x3e99
    8578:    4293          cmp    r3, r2
    857a:    ed9f 5a1e     vldr    s10, [pc, #120]; 85f4 <__kernel_cosf+0xf4>
    857e:    eddf 5a1e     vldr    s11, [pc, #120]; 85f8 <__kernel_cosf+0xf8>
    8582:    ed9f 6a1e     vldr    s12, [pc, #120]; 85fc <__kernel_cosf+0xfc>
    8586:    ee07 5a27     vmla.f32    s10, s14, s15
    858a:    eddf 7a1d     vldr    s15, [pc, #116]; 8600 <__kernel_cosf+0x100>
    858e:    eddf 6a1d     vldr    s13, [pc, #116]; 8604 <__kernel_cosf+0x104>
    8592:    ee55 5a07     vnmls.f32    s11, s10, s14
    8596:    ee05 6a87     vmla.f32    s12, s11, s14
    859a:    ee56 7a07     vnmls.f32    s15, s12, s14
    859e:    ee47 6a87     vmla.f32    s13, s15, s14
    85a2:    ee66 6a87     vmul.f32    s13, s13, s14
    85a6:    ddd2          ble.n    854e <__kernel_cosf+0x4e>
    85a8:    2200          movs    r2, #0
    85aa:    f6c3 7248     movt    r2, #16200; 0x3f48
    85ae:    4293          cmp    r3, r2
    85b0:    bfdc          itt    le
    85b2:    f103 437f     addle.w    r3, r3, #4278190080; 0xff000000
    85b6:    ee07 3a90     vmovle    s15, r3
    85ba:    ee20 0a20     vmul.f32    s0, s0, s1
    85be:    bfd4          ite    le
    85c0:    eeb7 6a00     vmovle.f32    s12, #112; 0x3f800000  1.0
    85c4:    eef5 7a02     vmovgt.f32    s15, #82; 0x3e900000  0.2812500
    85c8:    eef6 5a00     vmov.f32    s11, #96; 0x3f000000  0.5
    85cc:    bfd8          it    le
    85ce:    ee36 6a67     vsuble.f32    s12, s12, s15
    85d2:    ee17 0a26     vnmls.f32    s0, s14, s13
    85d6:    ee57 7a25     vnmls.f32    s15, s14, s11
    85da:    bfc8          it    gt
    85dc:    eeb6 6a07     vmovgt.f32    s12, #103; 0x3f380000  0.7187500
    85e0:    ee37 0ac0     vsub.f32    s0, s15, s0
    85e4:    ee36 0a40     vsub.f32    s0, s12, s0
    85e8:    4770          bx    lr
    85ea:    eeb7 0a00     vmov.f32    s0, #112; 0x3f800000  1.0
    85ee:    4770          bx    lr
    85f0:    ad47d74e     stclge    7, cr13, [r7, #-312]; 0xfffffec8
    85f4:    310f74f6     strdcc    r7, [pc, -r6]
    85f8:    3493f27c     ldrcc    pc, [r3], #636; 0x27c
    85fc:    37d00d01     ldrbcc    r0, [r0, r1, lsl #26]
    8600:    3ab60b61     bcc    fed8b38c <_stack+0xfed0b38c>
    8604:    3d2aaaab     vstmdbcc    sl!, {s20-s190}

 

Это просто абзац!

 

Билдил этими командами:

 

arm-none-eabi-gcc -std=c99 -march=armv7-a -mfloat-abi=hard -mfpu=vfpv4 -c fpu.c 

arm-none-eabi-gcc --specs=rdimon.specs -march=armv7-a -mfloat-abi=hard -mfpu=vfpv4 -o fpu.elf fpu.o -lm

arm-none-eabi-objdump -D fpu.elf > fpu.asm

arm-none-eabi-objcopy -O binary fpu.elf fpu.bin

 

Куда дальше рыть?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Куда дальше рыть?

Вероятно, придётся собирать тулчейн самостоятельно.

Тот же линаро вроде бы публикует скрипты для сборки. Ещё рассказывают про buildroot и всё такое.

 

Есть ещё Sysprogs, но я не знаю, есть ли там hardfloat.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Hard FPU тут даже и не пахнет:

Шок-абзац, ага. А команды вида vXXX.f32 - это что, как думаете?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тут пишут https://habrahabr.ru/post/319736/ , что:

*eabihf — это почти то же самое, что и eabi, с разницей в реализации ABI вызова функций с плавающей точкой. hf — расшифровывается как hard float

Так может разница лишь в реализации вызова функций с FP?

 

Есть ли ещё какие-нибудь компиляторы для Cortex-A7, кроме вышеупомянутых?

 

И вообще GNU - дрянь ещё та... Писал во многих средах: Keil ARM MDK, IAR, Visual DSP, Visual C,.... - нигде такого гемора как с GNU нет

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Помогите плиз, нужен хардварный синус/косинус для ядра Cortex-A7, VFPv4 или NEON - для floating point, как решить проблему?

Что такое "хардварный синус/косинус"? Вычисление одной инструкцией? Такое вообще существует в природе?

 

И вообще GNU - дрянь ещё та... Писал во многих средах: Keil ARM MDK, IAR, Visual DSP, Visual C,.... - нигде такого гемора как с GNU нет

Мыши плакали, кололись, но продолжали жрать кактус. Ну и используйте всё вышеупомянутое, кто же мешает?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Шок-абзац, ага. А команды вида vXXX.f32 - это что, как думаете?

Это то что мне надо, и я это видел. Вопрос ни к ним, а к реализации синуса/косинуса. Почему так фигово реализовано? Я подозреваю, что из-за неправильных ключей компилятора/линковщика и отсутствия явно заданных путей. Одних только libm.a - куча и какая из них используется???

 

И с адреса 0x8000 программа пошла, хотя для линковщика ниче не указано, и _exit() понадобился... Одно г_вно честное слово...

 

Что такое "хардварный синус/косинус"? Вычисление одной инструкцией? Такое вообще существует в природе?

 

Существует: начиная ещё с древних со-процессоров x87 intel: fsin,fcos.

 

Мыши плакали, кололись, но продолжали жрать кактус. Ну и используйте всё вышеупомянутое, кто же мешает?

 

Мешает отсутствие альтернативы. С удовольствием писал бы в Keil ARM MDK, но там нет Coretex-A7 без привязки к контроллеру.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Существует: начиная ещё с древних со-процессоров x87 intel: fsin,fcos.

Хорошо, уточняю: у Cortex-A7 есть такие инструкции?

 

Update:

 

Похоже, аффтар слился. Обкакал GNU, а оказалось, что это его собственное недомыслие. Бывает, чо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хорошо, уточняю: у Cortex-A7 есть такие инструкции?

Подозреваю, что нет. Но я не дурак и вижу, что sin() и cos() по своему объёму не внушают быстродействия. А значит, не все ключи оптимизации задействованы или нужно другую либу math подключить. Вот я и хочу выяснить, есть ли более лучший вариант реализации или мне пасти нечего?

 

В ряд Тейлора и то быстрее было бы.

 

Ещё раз прогнал код, на этот раз проверил ещё умножение и корень - эти работают как надо:

 

#include <fastmath.h>

float a=1.2F;
float b=3.21F;
float c=0.0F;

void main(void)
{
c=a+b;
a=b*c;
b=sinf(a);
c=sqrtf(b);
}

void _exit(int i)
{
while(1);
}


00008030 <main>:
    8030:    b538          push    {r3, r4, r5, lr}
    8032:    f249 642c     movw    r4, #38444; 0x962c
    8036:    f2c0 0401     movt    r4, #1
    803a:    f649 2588     movw    r5, #39560; 0x9a88
    803e:    f2c0 0501     movt    r5, #1
    8042:    ed2d 8b02     vpush    {d8}
    8046:    edd4 7a00     vldr    s15, [r4]
    804a:    ed94 7a01     vldr    s14, [r4, #4]
    804e:    ee37 7a87     vadd.f32    s14, s15, s14         ------------OK
    8052:    ee67 7a87     vmul.f32    s15, s15, s14        ------------OK
    8056:    ed85 7a00     vstr    s14, [r5]
    805a:    eeb0 0a67     vmov.f32    s0, s15
    805e:    edc4 7a01     vstr    s15, [r4, #4] 
    8062:    f000 f89d     bl    81a0 <sinf>         ---------- VERY BAD !!!
    8066:    eeb5 0a40     vcmp.f32    s0, #0.0
    806a:    ed84 0a00     vstr    s0, [r4]
    806e:    eeb1 8ac0     vsqrt.f32    s16, s0     ------------OK

 

Напрягает наличие процедуры _exit() и программа слинковалась для адреса 0x8000.

Можно ли как-то избавиться от _exit() и слинковать для адреса 0, не прибегая к линкерным скриптам? (я это могу сделать, только не даёт покоя вопрос, почему в первом случае слинковалось без мусора с с 0? (см. первый пост))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подозреваю, что нет. Но я не дурак и вижу, что sin() и cos() по своему объёму не внушают быстродействия. А значит, не все ключи оптимизации задействованы или нужно другую либу math подключить. Вот я и хочу выяснить, есть ли более лучший вариант реализации или мне пасти нечего?

Кому-то нужно быстродействие в ущерб точности, кому-то - точность в ущерб быстродействию. Не исключено, что та же glibc всё делает быстро, но это уже линух. А вот newlib, скорее, будет напирать на точность.

Короче, сделайте свой синус, кто же мешает? Подсунуть свою функцию вместо библиотечной - дело нехитрое, ЕМНИП.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...