|
|
  |
GCC ARM - не имплементируются функции SIN, COS, arm-none-eabi |
|
|
|
Oct 1 2017, 07:34
|

Местный
  
Группа: Участник
Сообщений: 257
Регистрация: 5-09-17
Пользователь №: 99 126

|
Здравствуйте. Скачал и поставил, затем ребутнул (для переменных окружения) 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, как решить проблему?
|
|
|
|
|
Oct 1 2017, 08:00
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(__inline__ @ Oct 1 2017, 10:34)  Скачал и поставил, затем ребутнул (для переменных окружения) GCC-тулчейн: gcc-arm-none-eabi-6-2017-q2-update-win32.exe ... Помогите плиз, нужен хардварный синус/косинус для ядра Cortex-A7, VFPv4 или NEON - для floating point, как решить проблему? Во-первых, не то скачали. Там английским по белому написано "Arm Cortex-M and Cortex-R". То есть дальше его ковырять нет смысла. Ищите правильный gcc. Попробуйте вот это.
|
|
|
|
|
Oct 1 2017, 08:40
|

Местный
  
Группа: Участник
Сообщений: 257
Регистрация: 5-09-17
Пользователь №: 99 126

|
Цитата(scifi @ Oct 1 2017, 08:00)  Там 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
|
|
|
|
|
Oct 1 2017, 08:47
|

Местный
  
Группа: Участник
Сообщений: 257
Регистрация: 5-09-17
Пользователь №: 99 126

|
тот тулчейн что я скачал в ридмишнике написано : Цитата |----------|--------------------------------------------|----------| |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 ?
|
|
|
|
|
Oct 1 2017, 08:57
|

Местный
  
Группа: Участник
Сообщений: 257
Регистрация: 5-09-17
Пользователь №: 99 126

|
Цитата(scifi @ Oct 1 2017, 08:49)  Спасибо!  Глянул: Цитата 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 Куда дальше рыть?
|
|
|
|
|
Oct 1 2017, 08:59
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(__inline__ @ Oct 1 2017, 11:57)  Куда дальше рыть? Цитата(scifi @ Oct 1 2017, 11:45)  Вероятно, придётся собирать тулчейн самостоятельно. Тот же линаро вроде бы публикует скрипты для сборки. Ещё рассказывают про buildroot и всё такое. Есть ещё Sysprogs, но я не знаю, есть ли там hardfloat.
|
|
|
|
|
Oct 1 2017, 09:11
|

Местный
  
Группа: Участник
Сообщений: 257
Регистрация: 5-09-17
Пользователь №: 99 126

|
Тут пишут https://habrahabr.ru/post/319736/ , что: Цитата *eabihf — это почти то же самое, что и eabi, с разницей в реализации ABI вызова функций с плавающей точкой. hf — расшифровывается как hard float Так может разница лишь в реализации вызова функций с FP? Есть ли ещё какие-нибудь компиляторы для Cortex-A7, кроме вышеупомянутых? И вообще GNU - дрянь ещё та... Писал во многих средах: Keil ARM MDK, IAR, Visual DSP, Visual C,.... - нигде такого гемора как с GNU нет
|
|
|
|
|
Oct 1 2017, 09:14
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(__inline__ @ Oct 1 2017, 10:34)  Помогите плиз, нужен хардварный синус/косинус для ядра Cortex-A7, VFPv4 или NEON - для floating point, как решить проблему? Что такое "хардварный синус/косинус"? Вычисление одной инструкцией? Такое вообще существует в природе? Цитата(__inline__ @ Oct 1 2017, 12:11)  И вообще GNU - дрянь ещё та... Писал во многих средах: Keil ARM MDK, IAR, Visual DSP, Visual C,.... - нигде такого гемора как с GNU нет Мыши плакали, кололись, но продолжали жрать кактус. Ну и используйте всё вышеупомянутое, кто же мешает?
|
|
|
|
|
Oct 1 2017, 09:18
|

Местный
  
Группа: Участник
Сообщений: 257
Регистрация: 5-09-17
Пользователь №: 99 126

|
Цитата(aaarrr @ Oct 1 2017, 09:06)  Шок-абзац, ага. А команды вида vXXX.f32 - это что, как думаете? Это то что мне надо, и я это видел. Вопрос ни к ним, а к реализации синуса/косинуса. Почему так фигово реализовано? Я подозреваю, что из-за неправильных ключей компилятора/линковщика и отсутствия явно заданных путей. Одних только libm.a - куча и какая из них используется??? И с адреса 0x8000 программа пошла, хотя для линковщика ниче не указано, и _exit() понадобился... Одно г_вно честное слово... Цитата(scifi @ Oct 1 2017, 09:14)  Что такое "хардварный синус/косинус"? Вычисление одной инструкцией? Такое вообще существует в природе? Существует: начиная ещё с древних со-процессоров x87 intel: fsin,fcos. Цитата(scifi @ Oct 1 2017, 09:14)  Мыши плакали, кололись, но продолжали жрать кактус. Ну и используйте всё вышеупомянутое, кто же мешает? Мешает отсутствие альтернативы. С удовольствием писал бы в Keil ARM MDK, но там нет Coretex-A7 без привязки к контроллеру.
|
|
|
|
|
Oct 1 2017, 09:34
|

Местный
  
Группа: Участник
Сообщений: 257
Регистрация: 5-09-17
Пользователь №: 99 126

|
Цитата(scifi @ Oct 1 2017, 09:20)  Хорошо, уточняю: у 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? (см. первый пост))
|
|
|
|
|
Oct 1 2017, 09:49
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(__inline__ @ Oct 1 2017, 12:34)  Подозреваю, что нет. Но я не дурак и вижу, что sin() и cos() по своему объёму не внушают быстродействия. А значит, не все ключи оптимизации задействованы или нужно другую либу math подключить. Вот я и хочу выяснить, есть ли более лучший вариант реализации или мне пасти нечего? Кому-то нужно быстродействие в ущерб точности, кому-то - точность в ущерб быстродействию. Не исключено, что та же glibc всё делает быстро, но это уже линух. А вот newlib, скорее, будет напирать на точность. Короче, сделайте свой синус, кто же мешает? Подсунуть свою функцию вместо библиотечной - дело нехитрое, ЕМНИП.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|