Array in Datei schreiben

Gast #2907795
Lesenswert?

Hallo zusammen,

habe eine Frage zum Thema Multitasking und Embedded Systems.

Folgende Tasks gibt es im programm:
Task1
AD Wandlung

Task2
Werte auf SD Karte schreiben

Das Problem liegt im umsetzen der funktion auf SD-Card schreiben.
Es gibt ja die Funktion sprintf um auf den Filepointer zu schreiben.
Jedoch gibt es Probleme wenn ich jeden einzelnen wert in den der task 
mit dieser funktion auf die sd-karte schreibe.

Wie würdet ihr das Problem lösen?? Ist generell davon abzuraten sprintf 
dafür zu verwenden oder gibt es bessere lösungen dafür?
Gast #2907832
Lesenswert?

also die doku gibt ein beispiel her indem die sd card mit sprintf 
beschrieben wird.

nutze ich das aber in meinem programm, so meine ich das das sprintf in 
einen speicherbereich schreibt wo der scheduler der tasks arbeitet. da 
die task erst wieder funktionieren sobald ich die funktion 
auskommentiere. den heap bzw. stack hab ich auch schon vergrößert
#2907834
Lesenswert?

matrix1900 schrieb:
> Wie würdet ihr das Problem lösen??

Artikel lesen und nachmachen:

http://www.mikrocontroller.net/articles/MMC-_und_SD-Karten

Wenn Du es geschafft hast, "Hallo Welt" in eine Datei zu schreiben, hast 
Du unterwegs soviel gelernt, dass Du weißt, wie man z.B. ein Stück Ram 
als Puffer für einen Sektor verwendet etc etc.

Also - nicht rumtheoretisieren - 'ran an den Speck! :-)
Gast #2907855
Lesenswert?

sprintf ist eine Funktion die das FORMATIERTE Schreiben unterstützt. 
Unnötig langsam, wenn Du denn Zeitprobleme hast und Du keine 
Formatierung vorhast/benötigst.

Ich schreibe Messwerte fast immer im Rohformat.

Du kannst auch etwas Zeit sparen, wenn Du einen kleinen Zwischenpuffer 
anlegst und dann immer mehrere Datensätze schreibst.

Viele Datenspeicher haben auch eine "Lieblingsblockgröße". Hast Du also 
genügend freien Speicher im System, so solltest Du diese Blockgröße 
jedenfalls zum Schreiben nutzen.
Gast #2907871
Lesenswert?

> Jedoch gibt es Probleme wenn ich jeden einzelnen wert in den der task
> mit dieser funktion auf die sd-karte schreibe.

Welcher Art sind denn diese Probleme?

> nutze ich das aber in meinem programm, so meine ich das das sprintf in
> einen speicherbereich schreibt wo der scheduler der tasks arbeitet. da
> die task erst wieder funktionieren sobald ich die funktion
> auskommentiere. den heap bzw. stack hab ich auch schon vergrößert

Meinst du? Das klingt ziemlich abenteuerlich... Ich vermute eher, dass 
dein Call blockiert und der Scheduler deinen Task auf Eis legt. Zeig mal 
den Code.
#2907879
Lesenswert?

matrix1900 schrieb:

> nutze ich das aber in meinem programm, so meine ich das das sprintf in
> einen speicherbereich schreibt wo der scheduler der tasks arbeitet.

Abgesehen davon, das man überlegen sollte, wie sinnvoll es ist, Werte in 
Textform auf eine Datei zu schreiben (das kann durchaus sinnvoll sein):

Ganz sicher nicht.
sprintf schreibt in einen Speicherbereich, dessen Adresse du angeben 
musst. Wenn du sprintf einen Mist-Pointer als Speicherfläche gibst, 
darfst du dich nicht wundern, wenn die sprintf alles mögliche über den 
Haufen wirft.

Wenn eine Funktion in der Argumentliste einen Pointer hat, muss man 
aufpassen, was dieser Pointer repräsentiert. Oft genug wird an dieser 
Stelle die Adresse eines Arrays erwartet, welches groß genug sein muss 
um die erzeugten Daten auch aufzunehmen
1
   int Wert1 = 5, Wert2 = 8, Wert3 = 12, Wert 4 = 3;
2

3
   char Zeile[40];
4
   sprintf( Zeile, "%d %d %d &d\n", Wert1, Wert2, Wert3, Wert4 );

sprintf legt in Zeile einen String an, der die Textrepräsentierung laut 
Formatierstring enthält. Das Array Zeile muss groß genug sein, damit da 
alles reinpasst.

Völlig falsch wäre
1
   int Wert1 = 5, Wert2 = 8, Wert3 = 12, Wert 4 = 3;
2

3
   char *Zeile;
4
   sprintf( Zeile, "%d %d %d &d\n", Wert1, Wert2, Wert3, Wert4 );


Der Compiler kann sich zwar nicht wehren und syntaktisch ist auch alles 
korrekt, aber hinter Zeile steht kein Speicher, in den sprintf den 
String schieben könnte bzw. der Zeiger zeigt irgendwo in den Speicher 
und wenn sprintf dann dort den String hinschiebt, dann nüdelt es dir 
klarerweise irgendwas im System nieder.
#2907891
Lesenswert?

> Es gibt ja die Funktion sprintf um auf den Filepointer zu schreiben.

Seit wann gibt es diese Funktion?

No.
sprintf schreibt in einen Buffer, den du angibst. Was du dann weiter mit 
diesem Buffer machst, zb seinen Inhalt in eine Datei schreiben lassen, 
steht auf einem anderen Blatt. Das interessiert sprintf nicht die Bohne.

Oder redest du von fprintf?
Gast #2907896
Lesenswert?

>Wie kann ich den freien Speicher bestimmen?

Ich kenne Dein System nicht. Bei mir spuckt der Compiler diese Info bei 
jedem Lauf aus. Kann allerdings in dem Gewühl leicht untergehen. Scrol 
Dich da mal durch.
Direkt ermitteln geht eigentlich nur, wenn Du Assembler sprichst und das 
Datenblatt zu deinem Prozessor zur Hand hast.
Gast #2908012
Lesenswert?

amateur schrieb:
> Ich kenne Dein System nicht. Bei mir spuckt der Compiler diese Info bei
> jedem Lauf aus.

Bei mir auch .-) aber ich kann es nicht deuten:

Size after:
  text     data      bss      dec      hex  filename
 84016  +   262   + 8998  = 93276    16c5c  main.elf

Aber was hat dec mit hex zu tun? Und wieviel freier Speicher ist das 
z.B. bei einem atmega1284p?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren