7 votos

No se puede leer archivo mayor a 2K en FatFS

Estoy leyendo un archivo de la Flash SPI con FATFS sistema de archivos, en STM32F103 de la plataforma de ejecución de FreeRTOS. Puedo leer correctamente Archivo de tamaño menor que el 2048, pero si se lee un archivo de mayor tamaño de 2048, (Como estoy leyendo en bloques de 128 bytes) solo lee hasta 2048 bytes y f_read devuelve 'FR_INT_ERR' error al puntero de Archivo mover a la ubicación por encima de 2048 bytes.

A continuación en mi código para Leer la prueba de escritura. f_size es mostrar el tamaño de archivo correcto. Pero cuando he leído, da error, Si me focefully ejecutar el bucle hasta el final del archivo para lectura de datos siempre devuelve el último fragmento antes de 2048 bytes de nuevo y de nuevo.

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!!!");

1voto

William Watson Puntos 341

No puedo hablar con FreeRTOS f_read() llamada, pero para algunos sistemas operativos, f_read() puede leer sólo el límite del tamaño del sector de los medios de comunicación subyacente, generalmente 512 o 2048 bytes. Para leer más datos que, la llamada de f_read() sería necesario implementar una función de reunir, leer datos de múltiples sectores.

Hemos visto este comportamiento en nuttx, y sospecho que FreeRTOS hace lo mismo. Para leer un archivo más grande, trate de leerlo en bloques de tamaño a sus medios.

0voto

Martin R-L Puntos 2300

Creo que el problema podría ser que tienes la misma instrucción "fs = f_size..." dos veces. Uno antes y uno después de la impresión de Lee instrucciones de archivo. ¿Si este no es el problema, entonces dónde están obteniendo la información de "tamaño del archivo"?

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X