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
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?
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.
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
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.
Hallo, poste doch mal deinen Code. So kann man nur schwer was sagen... Grüße Daniel
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]
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.