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?
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
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! :-)
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?
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.
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?
> 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.
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.
> 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?
>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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.