Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: GCC и DSP команды Cortex-M4
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
sherr
Умеет ли GCC-ARM использовать DSP instruction set Cortex-m4 без использования сторонних библиотек ?
SyncLair
Цитата(sherr @ Oct 5 2012, 21:15) *
Умеет ли GCC-ARM использовать DSP instruction set Cortex-m4 без использования сторонних библиотек ?


А А разве в CMSIS нет готовых заголовочных файлов для DSP инструкций ?
Flexz
Цитата(sherr @ Oct 5 2012, 21:15) *
Умеет ли GCC-ARM использовать DSP instruction set Cortex-m4 без использования сторонних библиотек ?

В Cortex-M4 есть только базовая арифметика с плавающей запятой, при компиляции gcc нужно добавить ключи -mfloat-abi=softfp -mfpu=fpv4-sp-d16
AHTOXA
Цитата(Flexz @ Oct 6 2012, 16:35) *
-mfloat-abi=softfp

Разве не -mfloat-abi=hard ?
Flexz
Ну в идеале - да. Но вот конкретно под stm32f4 на CodeSourcery gcc мне не удалось ничего с hard скопмилить - валится на линковке.
hard в отличии от softfp разрешает компилятору передавать в функции параметры в FP регистрах, а так - там и там сопроцессор используется одинаково.
AHTOXA
Цитата(Flexz @ Oct 6 2012, 19:58) *
Ну в идеале - да. Но вот конкретно под stm32f4 на CodeSourcery gcc мне не удалось ничего с hard скопмилить - валится на линковке.

Я что-то скомпилил с hard (при помощи kgp), и оно даже работало. Но всерьёз ещё не брался за плавучку, просто попробовал.
За softfp - спасибо, запомню.
sherr
Цитата(AHTOXA @ Oct 6 2012, 19:24) *
Я что-то скомпилил с hard (при помощи kgp), и оно даже работало. Но всерьёз ещё не брался за плавучку, просто попробовал.
За softfp - спасибо, запомню.

С плавучкой более-менее ясно, но я изначально имел ввиду именно DSP-instructions - MAC например . Это компилятор может ис-
пользовать без CMSIS/DSP lib ?
Flexz
А MAC - не плавучка? Не понимаю, по какому принципу вы их разделяете?
Вот список инструкций доступный в M4 (DSP instruction set внизу), это то что вам нужно или мы о разных вещах говорим?
AHTOXA
Цитата(sherr @ Oct 9 2012, 00:47) *
С плавучкой более-менее ясно, но я изначально имел ввиду именно DSP-instructions - MAC например . Это компилятор может ис-
пользовать без CMSIS/DSP lib ?

Сильно сомневаюсь. Просто так, в обычных Си-шных конструкциях их использовать вроде незачем, а библиотеки специально под M4 вряд ли затачивали.
ReAl
Ну и менно 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
Цитата(ReAl @ Oct 9 2012, 12:16) *
Для 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. иструкции 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)

надеюсь ответил так же содержательно как и кратко.




Цитата(Flexz @ Oct 6 2012, 17:58) *
на CodeSourcery gcc мне не удалось ничего с hard скопмилить - валится на линковке.

сочувствую.... и Вам и CodeSourcery, а какая там версия нынче?
Flexz
Цитата(klen @ Oct 9 2012, 15:01) *
а какая там версия нынче?

Нынче - хз, у меня старенькая 4.5.2, да и CodeSourcery больше нет, их же Mentor купил. А с тех пор как купил - что-то там перекорячили на радостях, да так что старые проекты не компиляются. То ли ключи какие-то поменяли, то ли еще что, у меня так руки и не дошли разобраться с ним.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.