Forum: Compiler & IDEs MMC/SD/SDHC card library von R.Riegel "verkleinern"


von graul (Gast)


Lesenswert?

Hallo,
ich befürchte beim Problem ist banal, jedoch habe ich seit Stunden keine 
Antwort.
Ich versuche ganz simple ein UART bedingt auf eine SD Karte zu loggen, 
jetzt habe ich endlich eine Lib gefunden die sich auf Anhieb für meinen 
AtMega168 compilieren lässt, jedoch ist sie zu groß, ob wohl sie laut 
Autor für einen 168er gemacht wurde. Ich habe schon FAT32 in der config 
auf 0 gesetzt, trotzdem hab ich immernoch:
1
    ----------------
2
    Device: atmega168
3
    Program:   20876 bytes (127.4% Full)
4
    (.text + .data + .bootloader)
5
    Data:        616 bytes (60.2% Full)
6
    (.data + .bss + .noinit)
7
  Done executing task "RunAvrGCC".

Weis jemand wo ich was drehen muss, dass ich das Programm in meinen 
AtMega packen kann?

MfG

Link zu der Lib: http://www.roland-riegel.de/sd-reader/doc/

von Codeumgebung (Gast)


Lesenswert?

Die Lib ist denke ich vielen hier bekannt.

Hast Du die Optimierung eingeschaltet?

von graul (Gast)


Lesenswert?

Jetzt komm ich mir blöd vor... welche Optimierung meinst du?

von Codeumgebung (Gast)


Lesenswert?

Benutzt Du AVR-Studio?
Dann Project --> Configuration Options --> General --> Optimization auf 
-Os

Ich hab hier grad bestimmt nicht die aktuelle Lib von ihm, wenn ich aber 
mal in ein altes Beispielprojekt schaue, dann heißt es da:
1
Program:   16718 bytes
2
(.text + .data + .bootloader)
3
4
Data:        842 bytes
5
(.data + .bss + .noinit)

Das war dann allerdings mit kompletter Shell über UART.

Ich weiß von damals wo ich die Lib benutzte, dass dieses Beispiel auf 
einen ATMEGA16 gepasst hatte (hart am Anschlag).
Eine Ergänzung und es gab seltsame Phänomene (Stack/Heap - Overflow).

Deshalb bin ich kurzerhand auf ein ATMEGA644 umgestiegen.
Bei dem sind das dann lediglich 25 %.

Grüße

von graul (Gast)


Lesenswert?

1
AVR Memory Usage
2
----------------
3
Device: atmega168
4
Program:   12958 bytes (79.1% Full)
5
(.text + .data + .bootloader)
6
Data:        616 bytes (60.2% Full)
7
(.data + .bss + .noinit)
HA! Danke. Als "Neueinsteiger" kannte ich diese Option garnicht. Ich 
sehe gerade vor meinem inneren Auge die Zeit die ich mit Optimierung per 
Hand wegen ein paar Bytes gemacht habe... Grr ;-)

Danke vielmals, schönen Abend noch. =)

von Codeumgebung (Gast)


Lesenswert?

No Problemo.
Hasta la Vista.

von graul (Gast)


Lesenswert?

Ich bin mal so frei und antworte hier im alten Thread...

Die Zeilen beim Initialisieren
1
       
2
/* open root directory */
3
struct fat_dir_entry_struct directory;
4
fat_get_dir_entry_of_path(fs, "/", &directory);
5
6
struct fat_dir_struct* dd = fat_open_dir(fs, &directory);
7
if(!dd)
8
{
9
   //opening root directory failed
10
   error();
11
   continue;
12
}

führen bei mir zu einem Problem, heißt "!dd" ist true, und ich bekomme 
den error();
Ich weis aber das die Hardware funktioniert, da ich schon mit anderem 
Code auf die SD Karte geschrieben habe.
Jemand eine Idee?

von holger (Gast)


Lesenswert?

>Ich versuche ganz simple ein UART bedingt auf eine SD Karte zu loggen,

Viel Spass damit wenn die Karte mal eine kleine
Pause von 100-500ms wegen Wear Levelling einlegt.
Dein Atmega168 ist mit 1kB RAM viel zu klein um
das gebacken zu kriegen. Selbst bei nur 9600 Baud
wirst du da Ärger kriegen.

von graul (Gast)


Lesenswert?

Aber es gibt so viele GPS Logger etc die mit einem AtMega8 oder 168 
arbeiten...

von Codeumgebung (Gast)


Lesenswert?

graul schrieb:
> Aber es gibt so viele GPS Logger etc die mit einem AtMega8 oder 168
> arbeiten...

Wie gesagt, auf nen Atmega16 passt es drauf.
Aber arg viel mehr geht dann nicht mehr.
Ich hatte das mal auf nem 16ner, 1-2 Zeilen mehr und es gab ein 
Overflow...

von graul (Gast)


Lesenswert?

Das heißt ich brauch eine andere Lib?

von Codeumgebung (Gast)


Lesenswert?

graul schrieb:
> Das heißt ich brauch eine andere Lib?

Die Frage ist, ob Du eine kleinere findest!?

Oder einfacher wäre es einen anderen Controller zu nehmen.

von graul (Gast)


Lesenswert?

Ich hab leider gerade kein größeren Controller da. Ich dachte, wenn fast 
jeder ein 168er oder 8er hat, sollte das kein Problem sein.

von graul (Gast)


Lesenswert?

Da ich mir irgendwie nicht vorstellen kann, dass es garnicht geht, habe 
ich weitergemacht.

Initialisieren geht einwandfrei (lang erst natürlich an der SD 
Karte...), auslesen des root Dirs geht auch. ("ls").

Nur am Schreiben haperts.

Stimmt es, wenn ich es so mache?
1
char name[8] = "hallo-du";
2
    
3
struct fat_dir_entry_struct file_entry;
4
uint8_t returns;
5
returns = fat_create_file(dd, name, &file_entry);
6
uart_putc(48 + returns);

Leider kommt da immer "0" zurück ("0 on failure, 1 on success, 2 if the 
file already existed.")

Muss ich den Namen noch mit \0 abschließen oder der gleichen? Ich habs 
auch schon versucht, aber ich bekomm keine Datei oder ein Ordner 
erstellt.

Danke,
Gruß

PS: Kein Write-Lock drin ;-)

von Codeumgebung (Gast)


Lesenswert?

Sieht eigentlich nicht schlecht aus.
Mach mal ein sd_raw_sync(); (musst Du immer machen vor dem Auswurf der 
Karte)
--> Evtl. ist die Datei bereits vorhanden?

Kriterien für einen Abbruch mit "0" sind eigentlich nur die 3:
1
if(!parent || !file || !file[0] || !dir_entry) //Falsche Parameter
2
...
3
if(strcmp(file, dir_entry->long_name) == 0) //Datei existiert bereits
4
...
5
if(!(dir_entry->entry_offset = fat_find_offset_for_dir_entry(fs, parent, dir_entry))) // Fehler beim finden eine Directory Entry
6
...
7
if(!fat_write_dir_entry(fs, dir_entry)) //Schreiben eines Directory Entry
8
...

Kannst Du debuggen?
Dann mach mal ein Breakpoint in der fat.c bei den 3 return 0;
Alternativ kannst Du Dir ja den Fehler auch über UART ausgeben lassen.

von Codeumgebung (Gast)


Lesenswert?

:-D sind natürlich 4...zählen sollte man können.

von graul (Gast)


Lesenswert?

1
  
2
[...]
3
  
4
    /* write directory entry to disk */
5
    if(!fat_write_dir_entry(fs, dir_entry))
6
        return 4;
7
    
8
    return 1;
9
}
Ich hab einfach mal alle returns geändert, und siehe da, es ist die 
Zeile.
Aber ab der Funktion "fat_write_dir_entry" ist mit langsam zu hoch...

MfG

von graul (Gast)


Lesenswert?

Also ich habs mit anderen Code versucht, der wesentlich mehr Speicher 
verbraucht (~90%/~90%) und es geht einwandfrei.

Die UART Daten werden ohne Probleme auf der SD Karte gespeichert.

von Klaus W. (mfgkw)


Lesenswert?

graul schrieb:
> char name[8] = "hallo-du";

Codeumgebung schrieb:
> ..zählen sollte man können.

wie wahr!

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.