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 */