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

GCC и DSP команды Cortex-M4

Умеет ли GCC-ARM использовать DSP instruction set Cortex-m4 без использования сторонних библиотек ?

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


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

Умеет ли GCC-ARM использовать DSP instruction set Cortex-m4 без использования сторонних библиотек ?

 

А А разве в CMSIS нет готовых заголовочных файлов для DSP инструкций ?

Изменено пользователем SyncLair

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


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

Умеет ли GCC-ARM использовать DSP instruction set Cortex-m4 без использования сторонних библиотек ?

В Cortex-M4 есть только базовая арифметика с плавающей запятой, при компиляции gcc нужно добавить ключи -mfloat-abi=softfp -mfpu=fpv4-sp-d16

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


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

Ну в идеале - да. Но вот конкретно под stm32f4 на CodeSourcery gcc мне не удалось ничего с hard скопмилить - валится на линковке.

hard в отличии от softfp разрешает компилятору передавать в функции параметры в FP регистрах, а так - там и там сопроцессор используется одинаково.

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


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

Ну в идеале - да. Но вот конкретно под stm32f4 на CodeSourcery gcc мне не удалось ничего с hard скопмилить - валится на линковке.

Я что-то скомпилил с hard (при помощи kgp), и оно даже работало. Но всерьёз ещё не брался за плавучку, просто попробовал.

За softfp - спасибо, запомню.

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


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

Я что-то скомпилил с hard (при помощи kgp), и оно даже работало. Но всерьёз ещё не брался за плавучку, просто попробовал.

За softfp - спасибо, запомню.

С плавучкой более-менее ясно, но я изначально имел ввиду именно DSP-instructions - MAC например . Это компилятор может ис-

пользовать без CMSIS/DSP lib ?

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


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

А MAC - не плавучка? Не понимаю, по какому принципу вы их разделяете?

Вот список инструкций доступный в M4 (DSP instruction set внизу), это то что вам нужно или мы о разных вещах говорим?

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


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

С плавучкой более-менее ясно, но я изначально имел ввиду именно DSP-instructions - MAC например . Это компилятор может ис-

пользовать без CMSIS/DSP lib ?

Сильно сомневаюсь. Просто так, в обычных Си-шных конструкциях их использовать вроде незачем, а библиотеки специально под M4 вряд ли затачивали.

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


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

Ну и менно 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 с компанией их вроде много, и типы есть «векторные» сразу.

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


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

Для 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 имеется...

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


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

все попорядку не мешая в кашу

 

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, а какая там версия нынче?

 

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


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

а какая там версия нынче?

Нынче - хз, у меня старенькая 4.5.2, да и CodeSourcery больше нет, их же Mentor купил. А с тех пор как купил - что-то там перекорячили на радостях, да так что старые проекты не компиляются. То ли ключи какие-то поменяли, то ли еще что, у меня так руки и не дошли разобраться с ним.

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


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

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

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

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

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

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

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

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

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

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