Moin,
ich versuche mich gerade am Schreiben auf SD-Karte. Dazu benutze ich die
hier verlinkte Bibliothek von Daniel R.
Das Schreiben auf Datei funktioniert auch ganz gut, nun wollte ich ein
neues Verzeichnis anlegen und dann darin die Datei erstellen. Ich
bekomme jetzt von Atmelstudio die Meldung, "undefined reference to
`ffmkdir' ", obwohl diese auch in der file.h zu finden sind, wie zum
Beispiel "ffwrites()" auch.
Hier mal mein Code:
Marco G. schrieb:> char buffer[];> itoa(counter,buffer,10);
halte ich für sehr bedenklich. Die schreibst damit wild im Speicher rum
1
if(TRUE==fat_loadFatData()){
2
3
uart_puts("Ok");
4
5
}
und was ist wenn es schief gelaufen ist, dann machst du einfach weiter?
zu dem eigentlichen Problem:
> "undefined reference to `ffmkdir' ",
ist eine Fehlermeldung von Linker, es scheint also eine lib oder ein
objekt-File zu fehler.
> obwohl diese auch in der file.h zu finden sind, wie zum> Beispiel "ffwrites()" auch.
das hat nichts zu sagen.
Peter II schrieb:>> char buffer[];>> itoa(counter,buffer,10);>> halte ich für sehr bedenklich. Die schreibst damit wild im Speicher rum
Wie würdest du es denn besser lösen?
Das es eine Fehlermeldung von Linker ist hatte ich mir bereits gedacht;
wie könnte ich den Fehler weiter eingrenzen, um zu erfahren was genau
fehlt?
Marco G. schrieb:> Wie würdest du es denn besser lösen?
eine größe für die Variabel vorgeben.
> Das es eine Fehlermeldung von Linker ist hatte ich mir bereits gedacht;> wie könnte ich den Fehler weiter eingrenzen, um zu erfahren was genau> fehlt?
schau doch mal nach, in welcher *.c Datei die Funktion ist, gehört die
zu deinen Projekt?
Ok, bis auf die Fehlende Größe ist die Zeile also in Ordnung gewesen.
Gut, dann vergebe ich eine Größe, um den Bereich einzugrenzen.
Die Funktion findet sich, genau wie ffwrites() in der Datei file.c. Dies
File, wie auch die file.h gehören in mein Projekt. Es gibt auch die
Objekt-Datei, file.o
Marco G. schrieb:> Ok, bis auf die Fehlende Größe ist die Zeile also in Ordnung gewesen.> Gut, dann vergebe ich eine Größe, um den Bereich einzugrenzen.
richtig, bis auf den Fehler ist alles richtig
> Die Funktion findet sich, genau wie ffwrites() in der Datei file.c. Dies> File, wie auch die file.h gehören in mein Projekt. Es gibt auch die> Objekt-Datei, file.o
merkwürdig, gibt es Warnungen?
Ja, aber nur folgende: Line
pointer targets in passing argument 1 of 'ffwrites' differ in signedness
Also nichts zu den anderen Funktionen, nur zu ffwrites
Marco G. schrieb:> Ja, aber nur folgende: Line> pointer targets in passing argument 1 of 'ffwrites' differ in signedness>> Also nichts zu den anderen Funktionen, nur zu ffwrites
dann behebe das doch erst mal.
Marco G. schrieb:> Ok, wie ich in meinem Eingangspost bereits erwähnt hatte habe ich sie> aber nicht selbst geschrieben.
merkwürde Datei...
#if (MMC_WRITE==TRUE && MMC_MKDIR==TRUE)
hast du diese defines auch gesetzt?
Deine Frage hat mich zur Lösung geführt. Ich muss in der config.h die
Funktion zum Erstellen erst einschalten. Standardmäßig ist sie auf false
gesetzt.
Danke für deine Hilfe :)
Marco G. schrieb:> Deine Frage hat mich zur Lösung geführt. Ich muss in der config.h die> Funktion zum Erstellen erst einschalten. Standardmäßig ist sie auf false> gesetzt.>> Danke für deine Hilfe :)
normalerweise müssten die gleiche abfragen auch in der Header Datei drin
sein, dann hätte man direkt einen Compiler-fehler erhalten.
Auch das "unsigned char" für String halte ich verbesserungswürdig.
Ich habe noch ein wenig weiter "experimentiert" und den Code erweitert.
Ich übergebe einem MCP4921 WErte und lese sie wieder über den internen
ADC ein. Die eingelesenen Werte schreibe ich auf die SD-Karte.
Merkwürdigerweise ignoriert er das vorhandene File und legt alle ca
6-7Werte ein neues File mit selben Namen an, was ja eigentlich schon
nicht geht.
Ist das ein Problem der Programmierung, oder ein Problem unter Windows
(wenn ich die Daten mir ansehen möchte).
Hier noch mal der Code dazu:
1
#define F_CPU 8000000UL
2
3
#define VTESC uart_putc(0x1b) //Definieren des Befehls 'VTESC'
4
#define VTAUTO uart_puts(">") //Definieren des Befehls 'VTAuto'
5
#define VTPosZero uart_puts("[f") //Definieren des Befehls 'VTPosZero'
6
#define VTRESET uart_puts("c") //Definieren des Befehls 'VTReset'
7
#define VTCLSLine uart_puts("[K") //Definieren des Befehls 'VTCLSLine'
8
#define VTCLSbelow uart_puts("[2J") //Definieren des Befehls 'VTCLSbelow'
9
#define VTCURSERoff uart_puts("[?25l") //Definieren des Befehls 'VTCURSERoff'
10
#define VTdown uart_puts("#3") //Definieren des Befehls 'VTdown'
11
#define VTup uart_puts("#4") //Definieren des Befehls 'VTup'
12
#define VTUnderline uart_puts("[4m") //Definieren des Befehls 'VTUnderline'
13
#define VTnormal uart_puts("[0") //Definieren des Befehls 'VTnormal'
14
#define LF uart_putc(0x0A) //Definieren des Befehls 'LF'
15
#define CR uart_putc(0x0D) //Definieren des Befehls 'CR'
16
17
#include<avr/io.h>
18
#include<util/delay.h>
19
#include<avr/interrupt.h>
20
#include<stdlib.h>
21
#include"avr.h"
22
#include"mcp4921.h"
23
#include"UART.h"
24
#include"SPI.h"
25
#include"ADC.h"
26
#include"VT100.h"
27
28
#include"config.h" // Hier werden alle nötigen Konfigurationen vorgenommen, umbedingt anschauen !
Bei dem Makro MMC_OVERWRITE hätte ich gedacht, dass es das File
Überschreibt, wenn es vorhanden ist, nicht immer neue mit dem selben
Namen erzeugt.
Das der µC natürlich geringere Ressourcen hat als ein PC ist mir klar.
Auch das dadurch einige Operationen nicht funktionieren.
Bei meinem Code war es allerdings so, dass er erst funktioniert hatte.
Ich hatte dann die Anzahl der Durchläufe zum schreiben erhöht. Danach
ging nichts mehr. Ich hatte dann zum Testen alle Dateioperationen
auskommentiert, aber dennoch hat es nicht wieder funktioniert.
Ich denke, ich werde morgen mal den Code komplett neu schreiben (Stück
für Stück) um zu testen, wo es beginnt zu haken.
Da ich nur eine Datei beschreibe, werde ich das ffclose() nur noch alle
x Operationen nutzen. Anstelle der Funktion werde ich in der Schleife
mal die Funktion ffflushData ausprobieren.
@ Marco G. (grmg2010)
>>Bei meinem Code war es allerdings so, dass er erst funktioniert hatte.>Ich hatte dann die Anzahl der Durchläufe zum schreiben erhöht. Danach>ging nichts mehr.
Was ein klares Anzeichen für einen Fehler ist!
>Da ich nur eine Datei beschreibe, werde ich das ffclose() nur noch alle>x Operationen nutzen.
FALSCH!
> Anstelle der Funktion werde ich in der Schleife>mal die Funktion ffflushData ausprobieren.
Auch falsch!
Bei normalen Dateioperationen mit einer Lib, die den Namen FAT-Lib
verdient, muss man mit flush gar nichts machen, darum kümmert sich die
LIB! Man schreibt nur mit .._write() schön seine Daten in die Datei und
am ENDE macht man EINMALIG ein close(). Damit ist der Dateizugriff
beendet. Alles andere ist Murks!
Ein flush() ist nur in SEHR speziellen Fällen nötig.