sherr 0 5 октября, 2012 Опубликовано 5 октября, 2012 · Жалоба Умеет ли GCC-ARM использовать DSP instruction set Cortex-m4 без использования сторонних библиотек ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SyncLair 0 5 октября, 2012 Опубликовано 5 октября, 2012 (изменено) · Жалоба Умеет ли GCC-ARM использовать DSP instruction set Cortex-m4 без использования сторонних библиотек ? А А разве в CMSIS нет готовых заголовочных файлов для DSP инструкций ? Изменено 5 октября, 2012 пользователем SyncLair Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flexz 0 6 октября, 2012 Опубликовано 6 октября, 2012 · Жалоба Умеет ли GCC-ARM использовать DSP instruction set Cortex-m4 без использования сторонних библиотек ? В Cortex-M4 есть только базовая арифметика с плавающей запятой, при компиляции gcc нужно добавить ключи -mfloat-abi=softfp -mfpu=fpv4-sp-d16 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 15 6 октября, 2012 Опубликовано 6 октября, 2012 · Жалоба -mfloat-abi=softfp Разве не -mfloat-abi=hard ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flexz 0 6 октября, 2012 Опубликовано 6 октября, 2012 · Жалоба Ну в идеале - да. Но вот конкретно под stm32f4 на CodeSourcery gcc мне не удалось ничего с hard скопмилить - валится на линковке. hard в отличии от softfp разрешает компилятору передавать в функции параметры в FP регистрах, а так - там и там сопроцессор используется одинаково. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 15 6 октября, 2012 Опубликовано 6 октября, 2012 · Жалоба Ну в идеале - да. Но вот конкретно под stm32f4 на CodeSourcery gcc мне не удалось ничего с hard скопмилить - валится на линковке. Я что-то скомпилил с hard (при помощи kgp), и оно даже работало. Но всерьёз ещё не брался за плавучку, просто попробовал. За softfp - спасибо, запомню. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sherr 0 8 октября, 2012 Опубликовано 8 октября, 2012 · Жалоба Я что-то скомпилил с hard (при помощи kgp), и оно даже работало. Но всерьёз ещё не брался за плавучку, просто попробовал. За softfp - спасибо, запомню. С плавучкой более-менее ясно, но я изначально имел ввиду именно DSP-instructions - MAC например . Это компилятор может ис- пользовать без CMSIS/DSP lib ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flexz 0 8 октября, 2012 Опубликовано 8 октября, 2012 · Жалоба А MAC - не плавучка? Не понимаю, по какому принципу вы их разделяете? Вот список инструкций доступный в M4 (DSP instruction set внизу), это то что вам нужно или мы о разных вещах говорим? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 15 9 октября, 2012 Опубликовано 9 октября, 2012 · Жалоба С плавучкой более-менее ясно, но я изначально имел ввиду именно DSP-instructions - MAC например . Это компилятор может ис- пользовать без CMSIS/DSP lib ? Сильно сомневаюсь. Просто так, в обычных Си-шных конструкциях их использовать вроде незачем, а библиотеки специально под M4 вряд ли затачивали. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ReAl 0 9 октября, 2012 Опубликовано 9 октября, 2012 · Жалоба Ну и менно MAC (только не в 64 бита, а в 32) использует int a; void foo(int b, int c) { a += b*c; } int64_t aa; void moo(int b, int c) { aa += b*(int64_t)c; } arm-none-eabi-gcc -O2 -S -mcpu=cortex-m3 -mthumb mla.c foo: movw r3, #:lower16:a movt r3, #:upper16:a ldr r2, [r3, #0] mla r2, r1, r0, r2 str r2, [r3, #0] bx lr moo: push {r4} movw r4, #:lower16:aa movt r4, #:upper16:aa ldrd r2, [r4] smlal r2, r3, r1, r0 strd r2, [r4] pop {r4} bx lr А вот с остальными упаковками/распаковками/насыщениями/параллельно операции с 16 бит -- врядли так просто. Мож там builtins какие появились на эту тему? Для x86 для MMX с компанией их вроде много, и типы есть «векторные» сразу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 9 октября, 2012 Опубликовано 9 октября, 2012 · Жалоба Для x86 для MMX с компанией их вроде много, и типы есть «векторные» сразу. typedef int v4si __attribute__ ((vector_size (16))); v4si res, a = {1,2,3,4}; int x; res = 2 + a; /* means {2,2,2,2} + a */ res = a - x; /* means a - {x,x,x,x} */ Эта фишка, судя по ману, даже в avr-gcc 4.7.2 имеется... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 9 октября, 2012 Опубликовано 9 октября, 2012 · Жалоба все попорядку не мешая в кашу 1. иструкции FPU VABS VADD VCMP VCMPE VCVT VCVT VCVTR VCVTB VCVTT VDIV VFMA VFNMA VFMS VFNMS VLDM VLDR VLMA VLMS VMOV VMRS VMSR VMUL VNEG VNMLA VNMLS VNMUL VPOP VPUSH VSQRT VSTR VSUB c ними нет никаких танцев с бубеном вокруг костра (в первом приближении). чтобы все работало нужно воткнуть компиллеру -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mthumb далее пишем код с операндами типа float - и забываем - компиллер как та женщина которая отдала все что у нее было.... выдаст все что сможет. ЗАМЕЧАНИЕ. тонкий момент возникает только с инструкцией VSQRT и VABS так как им соответствуют не операции над оперндами а функции libc. из этого положения выкручиваемя следующим финтом: inline float vsqrt (float value) { float result ; asm volatile ( "vsqrt.f32 %0, %1 \r\n" : "=w" (result) : "w" (value) ); return (result) ; } inline float vabs (float value) { float result ; asm volatile ( "vabs.f32 %0, %1 \r\n" : "=w" (result) : "w" (value) ); return (result) ; } c FPU фисе.... тут как раз проще чем с DSP 2. инструкции DSP SADD8 QADD8/ SHADD8 UADD8 UQADD8 UHADD8 SSUB8 QSUB8 SHSUB8 USUB8 UQSUB8 UHSUB8 SADD16 QADD16 SHADD16 UADD16 UQADD16 UHADD16 SSUB16 QSUB16 SHSUB16 USUB16 UQSUB16 UHSUB16 SASX QASX SHASX UASX UQASX UHASX SSAX QSAX SHSAX USAX UQSAX UHSAX USAD8 USADA8 SSAT16 USAT16 UXTB16 SXTB16 UXTAB16 SXTAB16 SMUAD SMUADX SMLAD SMLADX _SMLALD SMLALDX SMUSD SMUSDX SMLSD SMLSDX SMLSLD SMLSLDX SEL QADD QSUB PKHBT PKHTB важно понимать - автоматом компиллер может вставлять интрукции из тех которые он знает только (в первом приближении) оперциях над известными ему типами оперндов. если компиллер их незнает(этих типов) но есть инструкции по их обработке то используются библиотечные вызовы (это уровень выше компиллера) таким образом DSP инструкции моглибы быть автоматом генерится но типов ( uint4x8_t или uint2x16_t и тд ) то нет! все DSP инструкции работаютс со стандарнтыми типами uint32_t а вот что подразумевается - два 2*16 или 4*8 это уже становится понятно только когда вы этот операнд оправляете на обработку той или иной инструкции. вопрос - что делать? ответ - все просто - как упомянуто коллегами выше в фале core_cm4_simd.h обявлены inline функции SIMD, Вы должны только приготовит данные и вызвать нужную функцию, компиилер в коде тупо метнет по регистрам данные и вставит инструкцию. это что и требовалось. 3, опять про SIMD .... если до сих пор чето непонятно как это использовать то рекомендую повтыкать в файлы из DSP_Lib которые тамже в дистре для CM4 идут - там есть такие важные и полезные вещи как фильты матрицы и вяка разно, причем как правило есть варианты на плавучке , так и на целых - тоесть как раз SIMD (используются вызовы функций из core_cm4_simd.h) надеюсь ответил так же содержательно как и кратко. на CodeSourcery gcc мне не удалось ничего с hard скопмилить - валится на линковке. сочувствую.... и Вам и CodeSourcery, а какая там версия нынче? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flexz 0 9 октября, 2012 Опубликовано 9 октября, 2012 · Жалоба а какая там версия нынче? Нынче - хз, у меня старенькая 4.5.2, да и CodeSourcery больше нет, их же Mentor купил. А с тех пор как купил - что-то там перекорячили на радостях, да так что старые проекты не компиляются. То ли ключи какие-то поменяли, то ли еще что, у меня так руки и не дошли разобраться с ним. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться