CMSIS-DSP fonksiyonları Cortex-M0 üzerinde çalışyor mu?

Başlatan ex_machina, 26 Mayıs 2022, 22:29:50

ex_machina

Cortex-M0 tabanlı mikrodenetleyicilerde hem DSP hem de FPU bulunmuyor. Bu durumda emülatörsüz float kullanamıyoruz burası tamam.
Peki q-data format tabanlı fonksiyonları kullanmak için DSP şart mıdır?

Mesela CMSIS-DSP kütüphanesindeki
q15_t arm_sin_q15( q15_t x )
sinüs fonsiyonunu STM32F0xx serisi MCU'larda kullanabiliyor muyuz?

Tagli

Evet, kullanılabilir. Hatta bildiğim kadarıyla CMSIS-DSP'nin tamamı (ya da büyük bir bölümü) M0'da da kullanılabilir. Ancak tabi özellikle float içeren fonksiyonların performansı olumsuz etkilenecektir.
Gökçe Tağlıoğlu

ex_machina

Alıntı yapılan: Tagli - 27 Mayıs 2022, 00:39:19Evet, kullanılabilir. Hatta bildiğim kadarıyla CMSIS-DSP'nin tamamı (ya da büyük bir bölümü) M0'da da kullanılabilir.
Aradığım cevap buydu. Teşekkürler.

Dokümanını tekrar inceledim, evet cortex-m0'da da çalışıyor. Gözden kaçırmışım.
M0 ile M4 arasında çok fiyat farkı var. O yüzden floattan vazgeçtim. Öyle aman aman hassas işler yapmadığım için fix-point ile sin, cos vb. trigonometrik fonksiyonları çözmeye çalışacam artık.

Cemre.


magnetron

merhaba,

CubeIDE de kod yazarken sqrt() veya sin() fonksiyonlarını çağırınca FPU olmasa da zaten yazılımsal float işlemler yapmıyor mu

ayrıca DSP kütüphanesini kullanmak veya belirtmek neden gerekli - bilmediğimden soruyorum

Tagli

Uygulamaya göre float da kullanılabilir. Tamamen işlem yoğunluğuna bağlı. Zamanında dandik bir dsPIC30f2010 (16 bit, float desteği yok) üzerinde float kullanarak PID kontrolör çalıştırmıştım. İç içe konum ve hız kontrolörü vardı. 5 ms zaman, çevrim için rahat rahat yetiyordu.
Gökçe Tağlıoğlu

ex_machina

STM32F030C8 ile basit bir deneme yaptım(clock 48Mhz).

Float ile fix-point arasında yaklaşık 9 kat hız farkı var.
Signed Q0.31 data format kullanılsa bile bir sinüs hesaplama çevrimi yaklaşık 4us sürüyor.
@cemre'nin dediği look-up table yöntemi çok daha hızlı.
Çözünürlük ve tablo boyutu kurtarırsa ordan yürürüm artık.

while(1)
{
  GPIOB->BSRR = 1U;
  output_angle_float = arm_sin_f32(input_angle_float);
  GPIOB->BRR = 1U;

  GPIOB->BSRR = 2U;
  output_angle_fix = arm_sin_q31(input_angle_fix);
  GPIOB->BRR = 2U;
}



ex_machina

Alıntı yapılan: magnetron - 27 Mayıs 2022, 13:13:37merhaba,

CubeIDE de kod yazarken sqrt() veya sin() fonksiyonlarını çağırınca FPU olmasa da zaten yazılımsal float işlemler yapmıyor mu

ayrıca DSP kütüphanesini kullanmak veya belirtmek neden gerekli - bilmediğimden soruyorum

Yazılımsal FPU çok fazla kaynak ve zaman harcıyor. Float veri tipinde hata miktarı değişken olduğu ve özel donanım gerektirdiği için bazı durumlarda - mesela hız, düşük maliyet veya sabit hata istenenen durumlarda Fixed-point(bildiğimiz integer) veri tipleri kullanılıyor.

Ancak işin içine, seri gerektiren karmaşık matematik işlemleri girdiğinde bu da tam çare olmuyor. İşte böyle durumlarda integer tabanlı sayılar ve düşük maliyetli donanım ile hızlı işlem yapmak için kendine özgü komut seti olan DSP modülü devreye giriyor.

foseydon

Alıntı yapılan: Tagli - 27 Mayıs 2022, 14:02:04Uygulamaya göre float da kullanılabilir. Tamamen işlem yoğunluğuna bağlı. Zamanında dandik bir dsPIC30f2010 (16 bit, float desteği yok) üzerinde float kullanarak PID kontrolör çalıştırmıştım. İç içe konum ve hız kontrolörü vardı. 5 ms zaman, çevrim için rahat rahat yetiyordu.

hocam dspic'lerde icerde float islerini hizlandiran kutuphaneler var. psuedo float diyebiliriz. ayrica yine dspic'in asm ile yazilmis pid kutuphaneleri var. bunlari da kullandiysan baya zaman farkeder. isin ozu islemciden islemciye fark eder. donanimsal ve yazilimsal destege gore yapilacak islem sureleri farklilik gosterecektir. deneyip bakmaniz lazim.

Tagli

@foseydon , ben dümdüz float yazıp geçmiştim, herhangi bir kütüphane çağırmadım. Kendisi arka planda ne yaptı bilmiyorum.

Bu arada, CMSIS-DSP sinus hesabı gibi trigonometrik işlemleri arka planda tablo kullanarak yapıyor zaten. Fonksiyon dokümanında belirtmişler. Map dosyasında da tablonun eklendiğini görmek mümkün.
Gökçe Tağlıoğlu

ex_machina

Alıntı yapılan: Tagli - 27 Mayıs 2022, 20:21:59@foseydon , ben dümdüz float yazıp geçmiştim, herhangi bir kütüphane çağırmadım. Kendisi arka planda ne yaptı bilmiyorum.

Bu arada, CMSIS-DSP sinus hesabı gibi trigonometrik işlemleri arka planda tablo kullanarak yapıyor zaten. Fonksiyon dokümanında belirtmişler. Map dosyasında da tablonun eklendiğini görmek mümkün.
Anladığım kadarıyla en yakın değeri tablodan bulduktan sonra ara değeri interpolasyon ile buluyor.

Bu arada ben de yıllar önce dspic33 ve microchip smps-lib kullanarak 100kHz 2kW buck converter yapmıştım. Microchip'in smps kütüphanesinde hem donanımsal hem de yazılımsal 2kutup-2sıfır, 3kutup-3sıfır ve pid olmak üzere üç farklı dijital kompensatör bulunuyordu.

Ben akım ve gerilim için iki ayrı pid fonksiyonu kullanmıştım ve tuning işlemi beklediğimden kolay olmuştu. Ayrıca kütüphane doğrudan assembly tabanlı yazıldığından çok hızlı çalışıyordu.

Şimdi düşündüm de dspic serisi aslında çok kullanışlıymış. Ne fazla karmaşık ne de fazla basit, sıradan kullanımlar için tam ayarında. Niye kullanmaktan vazgeçtim ben de hatırlamıyorum:)
Hatırlarsam sebebini yazarım buraya.