repstosw 18 1 октября, 2017 Опубликовано 1 октября, 2017 · Жалоба Здравствуйте. Скачал и поставил, затем ребутнул (для переменных окружения) 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, как решить проблему? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 1 октября, 2017 Опубликовано 1 октября, 2017 · Жалоба Скачал и поставил, затем ребутнул (для переменных окружения) GCC-тулчейн: gcc-arm-none-eabi-6-2017-q2-update-win32.exe ... Помогите плиз, нужен хардварный синус/косинус для ядра Cortex-A7, VFPv4 или NEON - для floating point, как решить проблему? Во-первых, не то скачали. Там английским по белому написано "Arm Cortex-M and Cortex-R". То есть дальше его ковырять нет смысла. Ищите правильный gcc. Попробуйте вот это. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 1 октября, 2017 Опубликовано 1 октября, 2017 · Жалоба Попробуйте вот это. Там 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 1 октября, 2017 Опубликовано 1 октября, 2017 · Жалоба Вот здесь разъясняют. Видимо, вам надо arm-eabihf, но такого там нет. Пичалька :crying: Вероятно, придётся собирать тулчейн самостоятельно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 1 октября, 2017 Опубликовано 1 октября, 2017 · Жалоба тот тулчейн что я скачал в ридмишнике написано : |----------|--------------------------------------------|----------| |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 ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 1 октября, 2017 Опубликовано 1 октября, 2017 · Жалоба Я правильно думаю, что -march=armv7-a - это Cortex-A7 ? Здесь написано. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 1 октября, 2017 Опубликовано 1 октября, 2017 · Жалоба Здесь написано. Спасибо! :) Глянул: 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 Куда дальше рыть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 1 октября, 2017 Опубликовано 1 октября, 2017 · Жалоба Куда дальше рыть? Вероятно, придётся собирать тулчейн самостоятельно. Тот же линаро вроде бы публикует скрипты для сборки. Ещё рассказывают про buildroot и всё такое. Есть ещё Sysprogs, но я не знаю, есть ли там hardfloat. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 1 октября, 2017 Опубликовано 1 октября, 2017 · Жалоба Hard FPU тут даже и не пахнет: Шок-абзац, ага. А команды вида vXXX.f32 - это что, как думаете? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 1 октября, 2017 Опубликовано 1 октября, 2017 · Жалоба Тут пишут https://habrahabr.ru/post/319736/ , что: *eabihf — это почти то же самое, что и eabi, с разницей в реализации ABI вызова функций с плавающей точкой. hf — расшифровывается как hard float Так может разница лишь в реализации вызова функций с FP? Есть ли ещё какие-нибудь компиляторы для Cortex-A7, кроме вышеупомянутых? И вообще GNU - дрянь ещё та... Писал во многих средах: Keil ARM MDK, IAR, Visual DSP, Visual C,.... - нигде такого гемора как с GNU нет Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 1 октября, 2017 Опубликовано 1 октября, 2017 · Жалоба Помогите плиз, нужен хардварный синус/косинус для ядра Cortex-A7, VFPv4 или NEON - для floating point, как решить проблему? Что такое "хардварный синус/косинус"? Вычисление одной инструкцией? Такое вообще существует в природе? И вообще GNU - дрянь ещё та... Писал во многих средах: Keil ARM MDK, IAR, Visual DSP, Visual C,.... - нигде такого гемора как с GNU нет Мыши плакали, кололись, но продолжали жрать кактус. Ну и используйте всё вышеупомянутое, кто же мешает? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 1 октября, 2017 Опубликовано 1 октября, 2017 · Жалоба Шок-абзац, ага. А команды вида vXXX.f32 - это что, как думаете? Это то что мне надо, и я это видел. Вопрос ни к ним, а к реализации синуса/косинуса. Почему так фигово реализовано? Я подозреваю, что из-за неправильных ключей компилятора/линковщика и отсутствия явно заданных путей. Одних только libm.a - куча и какая из них используется??? И с адреса 0x8000 программа пошла, хотя для линковщика ниче не указано, и _exit() понадобился... Одно г_вно честное слово... Что такое "хардварный синус/косинус"? Вычисление одной инструкцией? Такое вообще существует в природе? Существует: начиная ещё с древних со-процессоров x87 intel: fsin,fcos. Мыши плакали, кололись, но продолжали жрать кактус. Ну и используйте всё вышеупомянутое, кто же мешает? Мешает отсутствие альтернативы. С удовольствием писал бы в Keil ARM MDK, но там нет Coretex-A7 без привязки к контроллеру. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 1 октября, 2017 Опубликовано 1 октября, 2017 · Жалоба Существует: начиная ещё с древних со-процессоров x87 intel: fsin,fcos. Хорошо, уточняю: у Cortex-A7 есть такие инструкции? Update: Похоже, аффтар слился. Обкакал GNU, а оказалось, что это его собственное недомыслие. Бывает, чо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 1 октября, 2017 Опубликовано 1 октября, 2017 · Жалоба Хорошо, уточняю: у 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? (см. первый пост)) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 1 октября, 2017 Опубликовано 1 октября, 2017 · Жалоба Подозреваю, что нет. Но я не дурак и вижу, что sin() и cos() по своему объёму не внушают быстродействия. А значит, не все ключи оптимизации задействованы или нужно другую либу math подключить. Вот я и хочу выяснить, есть ли более лучший вариант реализации или мне пасти нечего? Кому-то нужно быстродействие в ущерб точности, кому-то - точность в ущерб быстродействию. Не исключено, что та же glibc всё делает быстро, но это уже линух. А вот newlib, скорее, будет напирать на точность. Короче, сделайте свой синус, кто же мешает? Подсунуть свою функцию вместо библиотечной - дело нехитрое, ЕМНИП. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться