el acceso a la tarjeta SD disminuye con muchos archivos

6

Estoy trabajando en una aplicación de registro de datos usando un MSP430F5529 que se ejecuta a 2 MHz y una tarjeta SD usando FatFs . La interfaz SPI ya se está ejecutando con la máxima frecuencia.

Sin embargo, estoy viendo un rendimiento muy errático: incluso con una tarjeta SD vacía, los tiempos de creación de archivos comienzan a ser más lentos, hasta el punto de que tener 100 archivos en la tarjeta a veces toma casi 10 segundos. En esta trama se hace visible que:

Intenté con algunas tarjetas SD diferentes para los mismos resultados. ¿Qué hacer además de aumentar la frecuencia?

La configuración de My FatFs ( ffconf.h ) es

#define _FS_TINY        1    /* 0:Normal or 1:Tiny */
#define _FS_READONLY    0   /* 0:Read/Write or 1:Read only */

#define _FS_MINIMIZE    0   /* 0 to 3 */

/* To enable string functions, set _USE_STRFUNC to 1 or 2. */
#define _USE_STRFUNC    2   /* 0:Disable or 1/2:Enable */


/* To enable f_mkfs function, set _USE_MKFS to 1 and set _FS_READONLY to 0 */
#define _USE_MKFS       1   /* 0:Disable or 1:Enable */

#define _USE_FORWARD    1   /* 0:Disable or 1:Enable */
/* To enable f_forward function, set _USE_FORWARD to 1 and set _FS_TINY to 1. */

/* To enable fast seek feature, set _USE_FASTSEEK to 1. */
#define _USE_FASTSEEK   1   /* 0:Disable or 1:Enable */

/* The _CODE_PAGE specifies the OEM code page to be used on the target system.
/  Incorrect setting of the code page can cause a file open failure. */
#define _CODE_PAGE  850 // CP850 used for Portuguese

#define _USE_LFN    1       /* 0 to 3 */
#define _MAX_LFN    255     /* Maximum LFN length to handle (12 to 255) */

/* The _USE_LFN option switches the LFN support.
/
/   0: Disable LFN feature. _MAX_LFN and _LFN_UNICODE have no effect.
/   1: Enable LFN with static working buffer on the BSS. Always NOT reentrant.
/   2: Enable LFN with dynamic working buffer on the STACK.
/   3: Enable LFN with dynamic working buffer on the HEAP.
/
/  The LFN working buffer occupies (_MAX_LFN + 1) * 2 bytes. To enable LFN,
/  Unicode handling functions ff_convert() and ff_wtoupper() must be added
/  to the project. When enable to use heap, memory control functions
/  ff_memalloc() and ff_memfree() must be added to the project. */


#define _LFN_UNICODE    0   /* 0:ANSI/OEM or 1:Unicode */

/* The _FS_RPATH option configures relative path feature.
/
/   0: Disable relative path feature and remove related functions.
/   1: Enable relative path. f_chdrive() and f_chdir() are available.
/   2: f_getcwd() is available in addition to 1.
/
/  Note that output of the f_readdir fnction is affected by this option. */
#define _FS_RPATH       2   /* 0 to 2 */



/*---------------------------------------------------------------------------/
/ Physical Drive Configurations
/----------------------------------------------------------------------------*/
#define _VOLUMES    1 /* No de volumes a ser usado */

/* 512, 1024, 2048 or 4096 */
/* Maximum sector size to be handled.
/  Always set 512 for memory card and hard disk but a larger value may be
/  required for on-board flash memory, floppy disk and optical disk.
/  When _MAX_SS is larger than 512, it configures FatFs to variable sector size
/  and GET_SECTOR_SIZE command must be implememted to the disk_ioctl function. */
#define _MAX_SS     512     /* 512, 1024, 2048 or 4096 */

#define _MULTI_PARTITION    0   /* 0:Single partition, 1/2:Enable multiple partition */

/* To enable sector erase feature, set _USE_ERASE to 1. CTRL_ERASE_SECTOR command
/  should be added to the disk_ioctl functio. */
#define _USE_ERASE  0   /* 0:Disable or 1:Enable */


/* Set 0 first and it is always compatible with all platforms. The _WORD_ACCESS
/  option defines which access method is used to the word data on the FAT volume.
/
/   0: Byte-by-byte access.
/   1: Word access. Do not choose this unless following condition is met.
/
/  When the byte order on the memory is big-endian or address miss-aligned word
/  access results incorrect behavior, the _WORD_ACCESS must be set to 0.
/  If it is not the case, the value can also be set to 1 to improve the
/  performance and code size.
*/
#define _WORD_ACCESS    0   /* 0 or 1 */


#define _FS_REENTRANT   0       /* 0:Disable or 1:Enable */
#define _FS_TIMEOUT     1000    /* Timeout period in unit of time ticks */
#define _SYNC_t         HANDLE  /* O/S dependent type of sync object. 
                                e.g. HANDLE, OS_EVENT*, ID and etc.. */

#define _FS_SHARE   0   /* 0:Disable or >=1:Enable */

#endif /* _FFCONFIG */
    
pregunta Renan

1 respuesta

4

Estás utilizando _FS_TINY. De la documentación :

  

La desventaja de la pequeña configuración del búfer es: los datos FAT   almacenado en la memoria caché del sector se perderá por la transferencia de datos de archivos y   debe volver a cargarse en cada límite del clúster.

Entonces, tu micro está gastando mucho tiempo recargando información FAT en lugar de almacenarla en caché.

Si puedes ahorrar la memoria, prueba la configuración _FS_TINY = 0.

    
respondido por el markrages

Lea otras preguntas en las etiquetas