MMC/SD/SDHC card library von R.Riegel "verkleinern"

Gast #2248443
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/
Gast #2248472
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
Gast #2248479
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. =)
Gast #2248531
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?
Gast #2248824
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.
Gast #2249555
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 ;-)
Gast #2249593
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.
Gast #2249604
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

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