Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

Linux'te ramdisk hakkında bir soru?

Başlatan yamak, 29 Ağustos 2013, 20:12:32

yamak

Linux üzerinde ADC verilerine erişmek istiyorum.Sistem dosyaları üzerinden eriştiğim istediğim hızda verileri okuyamıyorum.

Çünkü /sys/devices/ocp.2/helper.14/AIN* dosyalarını açıp okumak uzun sürüyor.Benim de aklıma şöyle bi yöntem geldi acaba ramdisk oluşturup bu dizini ramdisk e taşıyabilir miyim diye?

Eğer böyle olursa dizin ramde olacağı için hem linux un kendi driver ı verileri dosyalara daha hızlı yazacak hem de be bu verilere daha hızlı okuyabilecem. Sizce böyle bişey yapılabilir mi? Ya da başka bi öneriniz var mı?

Driver ı kendim yazmayı düşündüm ama bu da uzun sürecek projeyi acil bitirmem lazım.

yamak


everygelem

ram disk oluşturmak kolayda, oluşan kalsöre bu dosyaları sembolk link olarak koymak ne derece işine yarar onu düşünüyordum.

arm-beginner

Alıntı yapılan: yamak - 29 Ağustos 2013, 21:52:56
Linux üzerinde ADC verilerine erişmek istiyorum.Sistem dosyaları üzerinden eriştiğim istediğim hızda verileri okuyamıyorum.

Çünkü /sys/devices/ocp.2/helper.14/AIN* dosyalarını açıp okumak uzun sürüyor.Benim de aklıma şöyle bi yöntem geldi acaba ramdisk oluşturup bu dizini ramdisk e taşıyabilir miyim diye?

Eğer böyle olursa dizin ramde olacağı için hem linux un kendi driver ı verileri dosyalara daha hızlı yazacak hem de be bu verilere daha hızlı okuyabilecem. Sizce böyle bişey yapılabilir mi? Ya da başka bi öneriniz var mı?

Driver ı kendim yazmayı düşündüm ama bu da uzun sürecek projeyi acil bitirmem lazım.
------------------
Arkadaşlar bi fikri olan yok mu?

Ben şahsen arkadaşların bir fikir üretebilmesi için ne tür bir Linux kullandığımı, kaç kHz ile okumak istediğimi v.s. belirtirdim.
Herneyse. Bunun dışında: hayır, /sys/devices/ocp.2/helper.14/AIN* RamDisk'e taşıyamasın. Bu belki fopen() ile açılıyor, ama bildiğimiz bir dosya değil.


yamak

#4
Alıntı yapılan: arm-beginner - 29 Ağustos 2013, 23:10:51
Ben şahsen arkadaşların bir fikir üretebilmesi için ne tür bir Linux kullandığımı, kaç kHz ile okumak istediğimi v.s. belirtirdim.
Herneyse. Bunun dışında: hayır, /sys/devices/ocp.2/helper.14/AIN* RamDisk'e taşıyamasın. Bu belki fopen() ile açılıyor, ama bildiğimiz bir dosya değil.
Hocam ubuntu kullaniyorum  7 adet adc kanalinin herbirinden saniyede en az 200 veriokumam gerekiyo ama su an cikabildigim rakam yaklasi 70.
Alıntı yapılan: gerbay - 29 Ağustos 2013, 23:11:23
Hocam sanirim onlar gerçek disk üzerindeki dsyalar değil. Onlar dosya gibi gözüken aygıtlar. Orada dosyayi değil adc icin yazilmis driver in adc den okuma yapip ize vermesini bekliyorsunuz
Hocam yani o dosyayi actigimda driver a oku komutunu mu gondermis oluyorum. Ya da asil aygitlar bu dizinlere mi mount edilmisler.Peki hocam acaba driverin cikisini pipe ile ram uzerinde bir alana yonlendiremez miyim.

trgtylcnky

Linux her aygıtı bir dosya olarak tanımladığı için böyle oluyor. Galiba "memory map" gibi bir yöntemle amacınıza ulaşabilirsiniz. Yani ADC verisinin geldiği belek bölümünü doğrudan bir değişkene "map" yaparak falan oluyormuş bu işler heralde.

Kullandığınız sistem Beaglebone mu?

yamak

#6
Alıntı yapılan: gerbay - 30 Ağustos 2013, 10:27:55
Hocam oradaki olay adc ve driver le ilgili, dosya sistemi ile ilgili değil. Driver in kaynak kodu sizde varmi? Okuma yaptiginiz task in priority sini yukseltin, nasil bir kod ile okuyorsunuz? Tam okudugunuz yerin oncesinde ve sonrasinda yapabiliyorsaniz hassas zaman olcumu yapip bir bakin ne kadar suruyor driver dan veriyi almak?
Hocam normalde AM335x in datasheetinde saniyede 100k sample alabileceğim yazıyor ama ben bu rakamın yanına bile yaklaşamıyorum.Hadi diyecem işletim sistemi kendi işleriyle uğraşıyo o sırada o yüzden yavaşlama oluyo ama bu kadar da olmaması lazım.Ben her bir kanaldan şu anda sadece saniyede yaklaşık 100 örnek alabiliyorum.
Okuma kodum aşağıdaki gibi
for(j=0;j<7;j++)
{
            memset(buf,0,sizeof(buf));
            sprintf(buf,"/sys/bus/iio/devices/iio\:device0/in_voltage%d_raw",sira[j]);
            fp1=fopen(buf,"r");
            fread(f[j],1,5,fp1);
            fclose(fp1);
}

Bu şekilde 7 adet adet kanalı tarıyorum.Ama dediğim gibi herbir kanaldan yaklaşık 100 sps alabiliyorum.Kullandğım board Beaglebone Black,işletim sistemi kartın üzerindeki e-mmc'ye kurulu acaba dedim e-mmc nin okuma hızı mı düşük ama test ettim diğer dosyaları okurken bu kadar yavaş değil. Muhtemelen dediğiniz gibi ben orada okurken aslında driver ın çevrimi bitirmesini bekliyorum.

Bu sorunu çözmek için ne yapmam gerekiyo. Kaç gündür uğraşıyorum bi türlü sorunu çözemedim.Çok yoruldum artık.Başım feci ağırıyo  :(

Alıntı yapılan: trgtylcnky - 30 Ağustos 2013, 17:01:28
Linux her aygıtı bir dosya olarak tanımladığı için böyle oluyor. Galiba "memory map" gibi bir yöntemle amacınıza ulaşabilirsiniz. Yani ADC verisinin geldiği belek bölümünü doğrudan bir değişkene "map" yaparak falan oluyormuş bu işler heralde.

Kullandığınız sistem Beaglebone mu?
Evet Hocam Beaglebone Black kullanıyorum.
mmap fonksiyonundan bahsediyorsunuz heralde.Onu denemedim ama onun için adc sonuçlarının saklandığı FIFO nun adresini bilmek gerekiyo.Hatta driver ı komple benim yazmam bile gerekebilir.Sonuçta okuma yapmadan önce hangi kanalı okuyacağımı belirtip çevrimi başlatmam gerekiyo.Hem düşündüm de ram'e o kadar ihtiyaç yok heralde.Çünkü ben zaten çok fazla bir hız istemiyorum.Saniyede herbir kanaldan en az 200 sample alsam yeter bana.

EOS

Hocam, buray sanırım görmüşsünüzdür.
http://appusajeev.wordpress.com/2011/06/18/writing-a-linux-character-device-driver/


Birde Nazım Koç'un Gömülü Linux Sistemleri kitabının ilk sayfalarında aytgıların kullanmı ile ilegili geniş açıklamalar var.