Datei mit mehr als 2 KB in FatFS kann nicht gelesen werden


7

Ich lese eine Datei aus dem SPI Flash mit FATFS-Dateisystem auf der STM32F103-Plattform, auf der FreeRTOS ausgeführt wird. Ich kann erfolgreich Dateien mit einer Größe von weniger als 2048 lesen, aber wenn ich eine Datei mit einer Größe von mehr als 2048 lese (da ich in Blöcken von 128 Bytes lese), liest sie nur bis zu 2048 Bytes und f_read gibt bei Datei den Fehler 'FR_INT_ERR' zurück Zeiger auf Position über 2048 Bytes verschieben.

Unten in meinem Code für Read Write Test. f_size zeigt die richtige Dateigröße an. Aber wenn ich lese, gibt es einen Fehler. Wenn ich die Schleife bis zum Ende der Datei zum Lesen von Daten schleichend ausführe, gibt sie immer wieder den letzten Block vor 2048 Bytes zurück.

FRESULT xRes;
FIL xFile;
const char cWBuffer[] = "Hello FAT World! 0123456789abcdef";
char cRBuffer[128]

xRes = f_mount(0, &s_xVolume);
printf("\r\n mount result %d successful!",xRes);

#ifdef FAT_MAKEFS_TEST
    // this delay is to prevent the FAT corruption after a systenm reset.
    Delay_us( 200 );

    printf("\r\n MAKE FS Test");
    printf("\r\n format the ext FLASH");
    printf("\r\n please wait...");
    xRes = f_mkfs(0, SFD_FORMAT, 4096 *10 );
    printf("\r\n Format result : %d ",xRes);
    assert(xRes == FR_OK);
#endif

#ifdef FAT_WRITE_TEST
    Delay_us( 1000 );

    printf("\r\n WRITE Test");
    printf("\r\n open file: W+CA");
    xRes = f_open(&xFile, filename, FA_WRITE|FA_CREATE_ALWAYS);
    printf("\r\n Open result : %d ",xRes);
    assert(xRes == FR_OK);

    printf("\r\n write file");
    for(i=0;i<1024;i++)
    {
        xRes = f_write(&xFile, cWBuffer, strlen(cWBuffer), &n);
        //printf("\r\n Write result : %d, bytes = %d ",xRes,n);
        assert(xRes == FR_OK);
        //assert(n == strlen(cWBuffer));
    }

    printf("\r\n close file");
    xRes = f_close(&xFile);
    assert(xRes == FR_OK);

#endif

#ifdef FAT_READ_TEST
    Delay_us( 100 );

    printf("\r\n READ Test");
    printf("\r\n open file: R+OE");
    xRes = f_open(&xFile, filename, FA_READ|FA_OPEN_EXISTING);
    printf("\r\n Open result : %d ",xRes);
    assert(xRes == FR_OK);

    fs = f_size(&xFile);

    printf("\r\n read file size = %d",fs);
    i=0;
    fs = f_size(&xFile);
    while(i<fs)
    {
        xRes = f_read(&xFile, cRBuffer, sizeof(cRBuffer), &m);
        printf("\r\n Read result : %d, bytes read = %d, i =%d ",xRes,m,tread);
        tread += m;
        assert(xRes == FR_OK);
        //assert(m == strlen(cWBuffer));
    }
    printf("\r\n Total bytes read = %d",tread);
    printf("\r\n close file");
    printf("\r\n file content:");
    printf("%s :\n",cRBuffer);
    xRes = f_close(&xFile);
    assert(xRes == FR_OK);
#endif
printf("\r\n test success!!!");

1
Sie müssen mehr Informationen, Code-Teile ...
Dzarda

Dzarda, ich habe das Code-Snippet hinzugefügt, das helfen könnte ...
CAK

2
Es scheint ein innerer Fehler zu sein. Vielleicht könnten Sie versuchen, den Flash-Speicher zu formatieren und es erneut zu versuchen. Eine andere Möglichkeit besteht darin, die Stapelgröße für diese Aufgabe zu erhöhen. es geht vielleicht der Raum aus.
Roger C.

Antworten:


1

Ich kann nicht mit dem FreeRTOS-Aufruf f_read () sprechen, aber für einige Betriebssysteme kann f_read () nur die Grenze der Sektorgröße des zugrunde liegenden Mediums lesen, normalerweise 512 oder 2048 Byte. Um mehr Daten als diese zu lesen, müsste der Aufruf von f_read () eine Erfassungsfunktion implementieren, die Daten aus mehreren Sektoren liest.

Wir haben dieses Verhalten in Nuttx gesehen, und ich vermute, dass FreeRTOS dasselbe tut. Um eine größere Datei zu lesen, lesen Sie sie in Blöcken, die Ihren Medien entsprechen.


0

Ich glaube, das Problem könnte sein, dass Sie zweimal dieselbe Anweisung "fs = f_size ..." haben. Eine vor und eine nach der Anweisung zum Lesen der Druckdatei. Wenn dies nicht das Problem ist, woher erhalten Sie dann die Informationen zur "Dateigröße"?

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.