www.mikrocontroller.net

Forum: Compiler & IDEs Optimierungsproblem mit Array in Subroutine


Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich teste gerade was mit SD-Karten, funktioniert auch im Prinzip. 
Programm soll eine Datei kopieren.

"buffer_sd" wird in der Subroutine offenbar nicht korrekt angelegt bzw. 
wegoptimiert (-Os). "dstfile1.txt" ist 0 Byte lang.

Wenn ich buffer_sd static deklariere oder als globale Variable 
vereinbare, klappt es.

Ist dieses Verhalten normal? Eigentlich müsste der Compiler/Linker doch 
merken, dass buffer_sd verwendet wird. Oder habe ich was grundsätzliches 
übersehen?
typedef unsigned char  BYTE;

...

// SDCARD
void sdcard_test (void) {

    FATFS fs[1];         /* Work area (file system object) for logical drives */
    FIL fsrc, fdst;      /* file objects */
    BYTE buffer_sd[4096];   /* file copy buffer */
    FRESULT res;         /* FatFs function common result code */
    UINT br, bw;         /* File read/write count */


    disk_initialize(0);

    /* Register work area for each volume (Always succeeds regardless of disk status) */
    f_mount(0, &fs[0]);

    /* Open source file on the drive 1 */
    res = f_open(&fsrc, "0:my_test.txt", FA_OPEN_EXISTING | FA_READ);
    sprintf(&lcd.buffer[0],"Open Read res=%d",(UINT)res); //lcd.buffer ist global definiert
    printf_tft(1,15,lcd.buffer);

    /* Create destination file on the drive 0 */
    res = f_open(&fdst, "0:dstfile1.txt", FA_CREATE_ALWAYS | FA_WRITE);
    sprintf(&lcd.buffer[0],"Open Write res=%d",(UINT)res);
    printf_tft(1,30,lcd.buffer);

    /* Copy source to destination */
    for (;;) {
        res = f_read(&fsrc, buffer_sd, sizeof(buffer_sd), &br);    /* Read a chunk of src file */
        sprintf(&lcd.buffer[0],"Read Anzahl: %d (res=%d)",br,(UINT)res);
        printf_tft(1,45,lcd.buffer);
        delay(100);

        if (res || br == 0) break; /* error or eof */
        res = f_write(&fdst, buffer_sd, br, &bw);               /* Write it to the dst file */
        if (res || bw < br) break; /* error or disk full */
    }

    /* Close open files */
    f_close(&fsrc);
    f_close(&fdst);

    /* Unregister work area prior to discard it */
    f_mount(0, NULL);
}

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
buffer_sd wird auf dem Stack angelegt. Möglicherweise hat die Maschine 
(welche auch immer) nicht genügend Stack. Der Linker sieht von dieser 
Variablen jedenfalls nichts, für sie wird ja kein Symbol 
angelegt/benötigt wenn sie nicht-statisch ist.

Ist sicher, daß f_open immer erfolgreich ist?

Ein Wegoptimiern von buffer_sd ist vorstellbar, wenn der Compiler die 
Quelle von f_read und f_write zu sehen bekommt, was aber wohl nicht der 
Fall ist?

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>buffer_sd wird auf dem Stack angelegt

Gut zu wissen. Der Stack wäre dafür natürlich zu klein. (STM32 Stack auf 
1k eingestellt.)

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Lesen eines C-Grundlagenbuchs wird dringend empfohlen. [x]

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.