6 votos

El acceso a la tarjeta SD se ralentiza con muchos archivos

Estoy trabajando en una aplicación de registro de datos utilizando un MSP430F5529 funcionando a 2 MHz y una tarjeta SD con FatFs . La interfaz SPI ya está funcionando a 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 empiezan a ser más lentos, hasta el punto de que tener 100 archivos en la tarjeta a veces lleva casi 10 segundos. En este gráfico se hace visible que:

enter image description here

He probado con varias tarjetas SD diferentes con los mismos resultados. ¿Qué hacer además de aumentar la frecuencia?

Mi configuración de 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 */

2voto

AnonJr Puntos 111

Está utilizando _FS_TINY. En la documentación :

La desventaja de la configuración del buffer diminuto es: los datos FAT almacenados en caché en el búfer del sector se perderán con la transferencia de datos del archivo y deben ser recargados en cada límite del cluster.

Así que tu micro está gastando mucho tiempo en recargar la información de la FAT en lugar de guardarla en la caché.

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

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