Arduino'da SD Kart Yazma Hızı Nasıl Artırılır


12

SD karttaki verileri saniyede yaklaşık 20000-30000 bayt yüksek hızda kaydeden bir veri kayıt sistemi oluşturuyorum. Ancak arduino'daki SD kütüphanesi şu anda saniyede yaklaşık 4500-5000 bayta veri yazıyor ve bu da çok yavaş.

Bunu okudum yazma hızını artırmak için hack ancak daha doğrudan bir yaklaşım belki ayarlayarak, mümkün olup olmadığını merak ediyorum SPISettings .


1
SdFat kütüphanesini deneyebilirsiniz - varsayılan SD kütüphanesinden çok daha verimlidir.
Majenko

Ayrıca, 5000 bayt her türlü SD kart için çok düşük görünse de, SD kartınızın kaliteli olduğundan emin olmak isteyebilirsiniz.
Len

Yanıtlar:


11

TAMAM. SDFat lib denedim. Bu kütüphane kesinlikle adruino ile birlikte gelen varsayılan SD kütüphanesinden daha iyidir. Ancak düşük veri hızı sorunumu bu şekilde çözmedim.

SDFat kütüphanesinin yazarının talimatını bu yazıda takip ettim .

Fat16lib'e göre , veri hızını artırmak için flush () yöntemini akıllıca kullanmamız gerekiyor. Her döngüdeki verileri yazmak () isteriz, ancak her döngüde ne kadar verinin yazıldığına bağlı olarak her 100 döngüde bir () kadar yalnızca temizlememiz () gerekir. Ayrıca, bayrağı SD.open () 'de' O_WRITE | 'FILE_WRITE' yerine O_CREAT '.

Bu kesinlikle hızı büyük bir faktör artırdı. Ama daha fazlasına ihtiyacım vardı!

Verilerin ikili olarak depolanması ( bu bloga göz atın ) performansı daha da artırdı.

Mevcut hızım 4. sınıf SD kartla yaklaşık 100-120 KBps (kilo byte)!

Sonunda yardımlarınız için size teşekkür etmek istiyorum.


4

Bu istenen hıza ulaşıp ulaşamayacağınıza birçok faktör karar verecektir. Bunlardan sadece bazıları.


1. Yazılımınız

SdFat Kütüphane hızlı Arduino IDE standart SD Kütüphanesi aşıyor. Ayrıca standart SD Kütüphanesi ile kullanımı kolay bir uyumluluk işlevine sahiptir. Denemek.

2. Donanımınız

Yüksek sınıf bir SD Kart kullanmalısınız. Bildiğiniz gibi SD Kartlar performans sınıflarına ayrılmıştır. İnternetteki çoğu insan bir SanDisk SD Kartı önerir.


Bunu birkaç gün içinde deneyeceğim ve sonuçları size bildireceğim. Teşekkürler.
Ashish Ranjan

4

El sıkışmasının tampon almasından kaçının!

SD.write (buf, boyut) kullanın ;

Herkese selam, ben aynı konuyla bir projede çalışıyorum. Aynı adımlarını takip ediyordum ve tam olarak aynı sayıları aldım. Sadece düzelttim. Sorun, aradığınızda el sıkışmasıdır SD.write().

Yerine:

//for each loop, it is going to make a handshake
while(<yourCondition>){
    SD.write(<yourValue>);
}

Yapmak:

char buf[length];
while(yourCondition){
    buf[index] = yourValue;
}
SD.write(buf,index);//only one handshake

Projemde var ilk 4100 bayt, 128 (tampon tamponundan [128]) ile bir tampon kullanılarak ikincisi de var 145.408 Projemdeki bayt. Yeterince iyi.


1
El sıkışma ile ne demek istediğini bilmiyorum, çünkü AFAIK SD yine de dahili olarak (512 kB) bir tampon kullanıyor. Ama aynı zamanda File.write ile bireysel bayt yazmanın son derece yavaş olduğunu ve derleyicinin onu optimize edemediğini gözlemledim (sonuçta sadece bir baytı dahili tampon belleğe kopyalayıp tamponun dolu olup olmadığını ve SPI iletiminin Başlat). Dışarıda kendi arabelleğimi kullanmak ve File.write (buffer, size) uygulamamda da aşırı performans artışı sağladı.
oliver
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.