Forum: Mikrocontroller und Digitale Elektronik Array in Datei schreiben


von matrix1900 (Gast)


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?

von Coder (Gast)


Lesenswert?

Was sagt denn die Dokumentation zu deinem SD-Card-Module?

von matrix1900 (Gast)


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

von Rainer U. (r-u)


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! :-)

von Dominik S. (dasd)


Lesenswert?

matrix1900 schrieb:
> gibt es Probleme

Es gibt also Probleme? Echt? Oh das ist ja prima - zum Glück weiß man 
jetzt was los ist...

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

Welches Problem?

Komm schon... Wie soll man das beantworten?

von Coder (Gast)


Lesenswert?

Controller, OS bzw. RTOS, verwendete Module...

von amateur (Gast)


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.

von Herbert (Gast)


Lesenswert?

amateur schrieb:
> Hast Du also
> genügend freien Speicher im System, so solltest Du diese Blockgröße
> jedenfalls zum Schreiben nutzen.

Wie kann ich den freien Speicher bestimmen?

von Liberty Limerix (Gast)


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.

von Karl H. (kbuchegg)


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.

von Karl H. (kbuchegg)


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?

von amateur (Gast)


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.

von Herbert (Gast)


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?

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.