No se puede leer el archivo mayor de 2K en FatFS

7

Estoy leyendo un archivo del sistema de archivos SPI Flash con FATFS, en la plataforma STM32F103 que ejecuta FreeRTOS. Puedo leer exitosamente el archivo de tamaño menor al 2048, pero si leo un archivo de tamaño mayor al 2048 (ya que estoy leyendo en trozos de 128 bytes) solo lee hasta 2048 bytes y f_read devuelve el error 'FR_INT_ERR' cuando el archivo el puntero se mueve a una ubicación por encima de 2048 bytes.

Abajo en mi código para la prueba de lectura y escritura. f_size es mostrar el tamaño correcto del archivo. Pero cuando leo, da error. Si ejecuto el bucle hasta el final del archivo para leer datos, siempre devuelve el último fragmento antes de 2048 bytes una y otra vez.

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

2 respuestas

1

No puedo hablar con FreeRTOS f_read () call, pero para algunos sistemas operativos, f_read () solo puede leer el límite del tamaño de sector del medio subyacente, generalmente 512 o 2048 bytes. Para leer más datos que eso, la llamada f_read () necesitaría implementar una función de recopilación, leyendo 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, intente leerlo en bloques del tamaño de sus medios.

    
respondido por el William Watson
0

Creo que el problema podría ser que tienes la misma instrucción "fs = f_size ..." dos veces. Un antes y otro después de la impresión leer las instrucciones del archivo. Si este no es el problema, ¿dónde obtiene la información del "tamaño del archivo"?

    
respondido por el Guill

Lea otras preguntas en las etiquetas