Forum: Mikrocontroller und Digitale Elektronik Frage zu mmc/sd lib dieser Homeage


von bb (Gast)


Lesenswert?

hallo

Ich habe eine Frage zur AVR-fat32 lib, die ich mir trotz recherche nicht 
beantworten konnte.
Ich will Messwerte die jeweils ein Byte groß sind auf einer sd oder mmc 
Karte speichern. Ist es besser wenn ich mehrere Messwerte zusammenspare 
oder macht es keinen unterschied wenn ich jeden wert extra speicheren. 
Ich denke da vor allem an eine Schonung der Hardware. Performance macht 
bei mir weniger aus.

Danke für Hilfe,
mfg

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

Es kommt drauf an, wie oft Du diese Daten sicherst.

Neben dem einen Byte kommen dann noch die Verzeichnisinformationen für 
jede Datei hinzu.

Denke daran, dass in ein Verzeichnis nicht unendlich viele Dateien 
stehen können (im Hauptverzeichnis, meine ich, wäre es maximal 512).

Schreibst Du die Karte immer voll, oder benutzt Du nur einen kleinen 
Teil des Speichers?

Eine Speicherzelle kann nicht beliebig oft gelöscht/beschrieben werden. 
Die Karte managed das zwar hinreichend genau; eine volle Karte kann da 
aber nichts machen. Die Lebensdauer ist begrenzt. Und man weiß nicht, 
wann welche Speicherzelle ausfällt und wohin sie gemappt wird.

Eventuell ist es besser, mehrere Messwerte im RAM zu halten und diese 
erst auf dem Flash abzulegen, wenn der RAM-Buffer voll ist.

FAT hat eine Blockstruktur: eine ein Byte-Datei wird immer einen 
kompletten Block (512Byte bis 32kByte; je nach Formatierung) 
beanspruchen.
Es ist daher sinnvoll, die einzelnen Dateien in Blockgröße zu haben. So 
passt am meisten auf die Karte drauf.

Auch wäre interessant, wie die Daten gelesen werden. Ist es hier 
vielleicht besser, alles in einer Datei zu haben, oder sind mehrere 
tausend Minidateien sinnvoller?

von andreas r. (Gast)


Lesenswert?

Hi,
wegen "schonung der Hardware": mach dir da mal keine Gedanken, denn die 
haben sich die Entwicker der Karte schon gemacht. Es wird wear-leveling 
gemacht, so dass sich die Haltbarkeit der Einzelzellen vervielfachen, da 
jedesmal eine andere Zelle beschrieben wird

>"eine volle Karte kann da aber nichts machen."

Woher soll die Karte denn wissen, ob sie voll oder leer ist? Sie 
speichert alles, ob dass jetzt Datenmüll oder Dateien sind, interessiert 
sie nicht.
Erst bei neueren SSD gibt es den TRIM Befehl, mit dem man dem Medium 
gezielt mitteilen kann, welche Sektoren vogelfrei sind.

Nemen wir mal an, die Blockgröße auf der Karte ist 512Byte und die Karte 
hat 512MB, es wird optimales Wearleveling betrieben (Schreibvorgänge 
werden auf alle Sektoren gleichmäßig verteilt). In deinem Fall 
verursacht das schreiben von einem Byte jedesmal das Neuschreiben eines 
ganzen 512er Sektors. Dann dauert es theoretisch 1mio +1 
Schreibzugriffe, bis ein Block zum zweitenmal angefasst wird. (in der 
Praxis früher, denn es müssen die Wear-leveling Informationen 
mitgespeichert werden)
Somit würde es IMHO mit einem AVR seeehr lange dauern, die Karte 
nennenswert abzunutzen.

von bb (Gast)


Lesenswert?

hallo

Danke erstmal für eure Antworten.

Ich werde alles in eine Datei schreiben. Das erscheint mir sinnvoller. 
das heißt datei öffnen -> daten anhängen -> datei schließen.Ausgelesen 
werden die Daten dann mittels Card reader am PC. vorerst werde ich die 
daten also nur speichern. Wird dann die datei immer auf den selben 
sektor geschrieben? So wie ich dass verstanden habe ist es dann besser 
die datei immer wieder zu überschreiben damit nicht immer der selbe 
cluster beansprucht wird. stimmt das?

mfg

von bb (Gast)


Lesenswert?

Hallo

Jetzt habe ich ein weiteres Problem.

Habe meine erste initialisierung der sd/mmc lib gemacht.
Der aufrudf der Funktion mmc_init() funktioniert. initialisiere fat 
fat_loadFatData(), erstelle eine datei mit ffopen(file_name) und 
schreibe mit  ffwrites(str). aber wen ich die datei dann wieder auslese 
kommt nichts bzw wenn ich die karte im pc auslese ist diese leer.
nehme an dass der schreibvorgang also nicht durchgeführt wurde.
Gibt es eine möglichkeit abzufrage ob der schreibvorgang erfolgreich 
war. funktion hat ja leider keinen rückgabewert.

mfg

P.S.: beschriebene vorgehensweise ict exact das simple_main der lib.

von zerrome (Gast)


Lesenswert?

Hallo,
poste doch mal deinen Code.
So kann man nur schwer was sagen...

Grüße Daniel

von bb (Gast)


Lesenswert?

hi
ja natürlich.
lg

[c]
while (FALSE==mmc_init()){
  lcd_puts("m");
  nop();
}

if(TRUE == fat_loadFatData()){
         lcd_puts("ok");
  unsigned char file_name[13]="BART    TXT";
  unsigned char str[14]="Hallo Datei!";

   // Datei existiert nicht, also anlegen !
   if(MMC_FILE_NEW == ffopen(file_name)){

           // Schreibt String auf Karte !
           ffwrites(str);

          // Neue Zeile in der Datei
          ffwrite(0x0D);
          ffwrite(0x0A);

         // Schließt Datei
        ffclose();
        lcd_puts("geschrieben");
           }
           else{
        lcd_puts("FALSE");
           }
       if(MMC_FILE_EXISTS == ffopen(file_name)){
    lcd_puts("exists");
           unsigned long int seek=file.length;

        // lesen eines chars und Ausgabe des chars.
        // solange bis komplette Datei gelesen wurde.
        do{
           lcd_putc(ffread());
        }while(--seek);

        ffclose();
    }
}
[c]

von zerrome (Gast)


Lesenswert?

Hm,
wie sieht denn deine Schaltung aus? Versuch mal mit der Option 
"MMC_MAX_SPEED FALSE" in der config.h

Also so, wie der Code da so ist würde ich sagen sollte die Datei 
zumindest mal angelegt werden und nach einem Reboot auch immer 
ausgegeben werden...

von bb (Gast)


Lesenswert?

hallo
danke für deine antwort.

die geschwindigkeit hab ich von anfang an auf FALSE
gelassen.
ja meine schaltung ist noch etwas schwindlig mit spannungsteilern. habe 
zwar alles nachgeprüft und die versorgungsspannung auch nachgemessen 
werde aber den aufbau verbessern und dann noch einmal schreiben wenns 
wieder nicht funktioniert.

mfg

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.