SD kartı beklenmedik elektrik kesintilerine karşı nasıl koruyabilirim?


18

Bir SD karta veri depolamak için Microchip MDDFS kitaplığını kullanan bir aygıt üzerinde çalışıyorum. Kaydedici her dakika maksimum 1 giriş (56bayt) hızında veri kaydedecektir. Sorun, cihazın herhangi bir zamanda, potansiyel olarak bir yazma dizisinin ortasında güç kaybedebilmesidir. Verilerimi yolsuzluğa karşı korumanın en iyi yolunun ne olduğunu merak ediyorum. Güç kaybolduğunda dosya açıksa, son dosya kapatıldıktan sonra dosyaya yazılan tüm verilerin kaybolduğunu gördüm. Yazma dizisinin ortasında güç kaybolursa, aynısının geçerli olup olmadığını bilmiyorum.

Yazma yordamı çok sık gerçekleşmediği için, verileri her açtığımda dosyayı açabilir, verileri yazabilir ve sonra dosyayı kapatabilirim. Bu yaklaşım sd karta zamanla zarar verir mi?

Başka bir yaklaşım dosyayı açık tutmak olabilir, ancak her 10 veya 50 yazımdan sonra dosyayı kapatabilir ve sonra tekrar açabilirim.

Ben de bellekte veri arabelleğe olabilir, daha sonra bazen bir kbyte ya da öylesine sonra verileri yıkayın.

Son fikrim, devremde, dosyayı hızlı bir şekilde kapatmak için güç kesildikten sonra yeterince uzun bir süre boyunca pic / sd kartıma güç sağlayacak büyük bir kapasitör ekleyebilirdim. Bu yaklaşımdaki sorun, dosyayı kapatmak ve / veya veri kaydetmek için geçen sürenin çok tutarsız olmasıdır. Anladığım kadarıyla, bu sefer dosyanın bulunduğu flash sayfadaki geçerli yere bağlı olabilir.

Her neyse, siz ne önerirsiniz?


2
En az dosya sistemi ile ham NAND flash'a geçtiyseniz, şu anda küçük yazma işlemleri yapma yeteneğinizi engelleyen soyutlama katmanlarının çoğunu inceleyebilir ve muhtemelen veriler hazır olduğunda hemen kısmi blok yazma yapma yeteneğini kazanabilirsiniz. Ayrıca, yolda farklı performans bilgileriyle (belki de marjinal bir gri piyasa kartını bile olsa) değiştiren bir son kullanıcıya karşı da korumanız olur.
Chris Stratton

Yanıtlar:


16

Bir dosyaya veri yazdığınızda birkaç şey olabilir. Verilerin güvenli olması için olması gereken diziyi, mutlaka kütüphane çağrılarını değil, açıklayacağım.

Yazarken ve dosyanın sonuna eklerken (normal yazma modu), dosyanın son bloğunu belleğe okur, yazma verilerinizle değiştirir ve ardından tüm bloğu SD karta geri yazarsınız . Blok doluysa, Dosya Ayırma Tablosunda (FAT) yeni bir blok bulunmalıdır. Yeni bir blok bulduktan sonra, bir okuma-değiştirme-yazma döngüsü olan FAT güncellenmelidir. Dosyayla işimiz bittiğinde, kök dizindeki dosya özniteliklerini (dosya uzunluğu gibi) güncellememiz gerekir, bu da başka bir okuma-değiştirme-yazma döngüsüne neden olur.

Yazma sürenizi en aza indirme

  • Bir sektör yazarken dosyanın zaten verilerinizi tuttuğundan emin olun. Büyük bir dosyayla başlar ve verileri eklemek yerine verilerin üzerine yazarsanız, SD kart sektörü yazma işlemi tamamlanır tamamlanmaz veriler güvende olur. Bir-iki okuma-değiştirme-yazma döngüsünü bu şekilde ortadan kaldırabilirsiniz. Başlangıç ​​kodum, SD kart dolana kadar sektör artışlarındaki bir dosyaya 0 yazar ve ardından dosyanın başına geri sarar.

  • Veri girişlerinizin boyutunu, tamsayı girişlerin bir sektöre sığacağı şekilde yapın. Girişlerinizi 64 bayta kadar çıkartacağım. Bu daha az verimli olsa da, iki sektörü okuma-değiştirme-yazma ihtiyacı duymanızı engeller.

  • Tüm sektörleri yazmanıza izin veren FSwrite işlevinin bir varyantını oluşturun. Tüm sektörü SRAM'de tutarsanız, döngünüz "okuma-değiştirme-yazma" ile "değiştirme-yazma" arasında değişir.

PIC ve SD gücünüzü mümkün olduğunca uzun süre açık tutun

  • Büyük kapasitörler iyidir. 470uF, bir yazma döngüsünü bitirmek için size fazlasıyla güç vermelidir.

  • Güç kaynağınızın yedek kapasitörünüzün gücünü emmediğinden emin olun! Gerekirse bir diyot ekleyin.

Ne zaman gücünüz kaldığını bilin

  • Büyük bir güç kaynağı kapağı, bir SD kartla işleri sarmak için size 10ms veya daha fazla verir, ancak şansınıza basmayın. Güç kaynağınızın hala iyi olup olmadığını görmek için mikro denetleyicinizde bir pim kullanın ve kaynağınız ölmüşse yazmaya başlamayın.

Bilgi için teşekkürler. Çok yararlı. Onunla neler yapabileceğimi göreceğim ...
PICyourBrain

Tüm sıfırları 4 GB'lık bir karta yazmak ne kadar sürer? Uzun bir zaman gibi görünüyor. Ayrıca, tüm sektörlere tüm yazmalara izin vermek için fswrite işlevini değiştirmek için paylaşabileceğiniz kod örnekleriniz var mı?
PICyourBrain

Ayrıca, tüm sıfırları dosyaya yazarsanız. Gerçek verilerinizin sonunun nerede olduğunu nasıl takip ediyorsunuz? Başlangıçta tüm verileri okuyor ve sıfırlar dizisini buluyor musunuz?
PICyourBrain

1
FAT16 kullanıyorsanız, 2GB ile sınırlı olduğunuzu düşünüyorum. SD / MMC kartın MDDFS kütüphanesinde uygulanmış görünmeyen bir "blokları sil" fonksiyonu olduğuna inanıyorum. SD kart projem için özel bir kod kütüphanesi kullandım, bu yüzden kod örneklerini paylaşamıyorum. Son verileri bulmak için, bir veri kaydında 0'ların tümünü bulana kadar okumanız gerekir. Veri kaydınızın tümü 0 olabilirse, sıfır olmayan bazı veriler veya bazı sınırlayıcılar eklemenizi öneririm.
W5VO

6

SD kartlarda (veya MMC, CompactFlash vb.) Henüz bahsedilmeyen bir sorun, SD kartın ana bilgisayara rasgele sırada okunabilen ve yazılabilen 512 baytlık sektörlerden oluşan basit bir koleksiyon olarak görünmesine rağmen, genellikle 528 bayt sayfaları, her biri daha büyük değilse 32 KB olan gruplar halinde depolayın ve desteklenen tek işlem, aksi takdirde boş bir sayfaya yazmak veya tüm bir grubu silmek içindir. Bu sınırlama ile başa çıkmak için, bir SD karttaki denetleyici, herhangi bir mantıksal sektörün herhangi bir fiziksel sayfaya eşlenmesini sağlayacak bir tablo tutacaktır. Bir sektör yazmak için istekte bulunulduğunda, kontrolör çip üzerinde boş bir sayfa bulur ve eşlemeyi söz konusu sektörün yeni adresiyle günceller. Boş sayfalar az miktarda veya başka zamanlarda tedarik edilirse,

Bunun önemi, belirli bir mantıksal sektöre yazma eyleminin, birçok mantıksal sektörden gelen verilerin karıştırılmasını gerektirebilmesidir. Bu süreçte bir şeyler ters giderse, yalnızca kartın yazılması istenen sektörle değil, herhangi bir keyfi sektörün bozulmasına neden olabilir. Veri karıştırma işlemlerini, veri karıştırma sırasında güç kesilirse, işlemin hangi bölümlerinin tamamlandığını ve hangilerinin tamamlanmadığını belirleyebilecek şekilde iyi bir SD kart denetleyicisi tasarlanmalıdır. dolayısıyla işlemi düzgün şekilde bitirebilecektir. Ne yazık ki, bir indirim mağazasında alınan 5 $ SD kartın bu konuda herhangi bir iyi olup olmadığını nasıl anlayabileceğimi bilmiyorum.

Emin olmak için, bir SD kart tamamlanmış olarak bildirilen her yazma işleminin aslında bir elektrik kesintisinden (yani, tüm işin yazmanın neden olur tamamlandığında, güç yeniden uygulandığında kartın işlemi bitirmesi yeterli olacaktır), bu, ana işletim sisteminin bir miktar gerçekleştirmesi durumunda sorun yaşamayacağı, ancak tüm verilerin yazdığı gibi sorun yaşamayacağı anlamına gelmez. Bununla birlikte, SD kart "pazarlık" sonunu kaldıramazsa, elektrik kesintisinden kaynaklanan veri kaybını önlemek için ana bilgisayar tarafında yazılım üzerinde yapılabilecek hiçbir şey olmadığını akılda tutmak önemlidir.


Bu çok anlayışlı bir yorum.
fred basset

5

Ayrıca SD'deki verilerin okunması gerektiğinde doğru olduğunu doğrulamak için bir tür sağlama toplamı kullanmanızı öneririm .


3

Belki de Sparkfun'daki bu süper kapasitör sorunu çözerdi.


2
PIC'nin hafızasını tutar, ancak maksimum 10uA akım değerine sahiptir. Bu kadar güncel bir SD karta yazabileceğinizi sanmıyorum.
W5VO

1
Kavram iyi olsa. Hızlı bir arama bulundu Illinois Kapasitör ( illinoiscapacitor.com ) 8 F'ye kadar süper kapasitör vardır ve 4 A'ya kadar akımları destekleyebilir. ana güç kaynağı başarısız olursa güzel.
Foton

3

Yazma yordamı çok sık gerçekleşmediği için, verileri her açtığımda dosyayı açabilir, verileri yazabilir ve sonra dosyayı kapatabilirim. Bu yaklaşım sd karta zamanla zarar verir mi?

Herhangi bir mühendislik probleminde olduğu gibi, buradaki ödünleşmelerle uğraşmanız gerekir.

Hiçbir verinin kaybolmaması kritik midir? Sonra yukarıdakileri yaparım. Verileri kaybederek kartı mahvetmekten daha fazla hasar görürsünüz. Kart bozulmadan önce bu işlemi kaç kez yapabileceğinizi belirlemek için bir çeşit stres testi yapmak isteyebilirsiniz. Eğer kart kullanılmaz hale gelmeden önce geçen süre çok iyiyse ve kartı değiştirmeden önce kabul edilebilir bir süre gibi gözüküyorsa, o rotaya giderdim.


1

Sadece veri depolamak istiyorsanız, bir dosya sistemine gerek yoktur. yazma işlemi blok adres seçilerek doğrudan SPI üzerinden yapılacaktır. bunu yaparak yazma süresini en aza indirirsiniz ve verilerin bozulma riskini yaşarsınız.

Güç kaybı ve şansı olmasa bile, sadece bir girişi kaybedersiniz (bu bazı sistemlerde kabul edilebilir).

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.