我正在通过TI提供的SD卡应用代码示例为其MSP530启动板MicroController Development套件努力。看来,该示例将目录的数量和文件数限制在每个(总共100个文件)中,这对于32GB SD卡似乎过于限制。当前的代码编译以使用少于程序空间的一半,少于一半可用的RAM。我想知道我是否误解了代码,还是代码受到其他原因的限制,例如内存中可用的堆栈大小。以下是代码和我的评论。
有几层:sdcardlogmode,sdcard(sdcardlib)和ff(hal层)。我已经减少了下面的代码以说明构造,但不能运行 - 如果我正确理解它,并且我的解决方案增加了允许的文件和目录的数量,我会更感兴趣。
sdcardlogmode.c这里有两个有趣的地方。第一个是char dir [10] [max_dir_len]和文件[10] [max_file_len]的声明。最大镜头分别为8和12,是名称的最大长度。
/*******************************************************************************
*
* SDCardLogMode.c
* ******************************************************************************/
#include "stdlib.h"
#include "string.h"
#include "SDCardLogMode.h"
#include "driverlib.h"
#include "sdcard.h"
#include "HAL_SDCard.h"
#pragma PERSISTENT(numLogFiles)
uint8_t numLogFiles = 0;
SDCardLib sdCardLib;
char dirs[10][MAX_DIR_LEN];
char files[10][MAX_FILE_LEN]; //10 file names. MAX_FILE_LEN =10
uint8_t dirNum = 0;
uint8_t fileNum = 0;
#define MAX_BUF_SIZE 32
char buffer[MAX_BUF_SIZE];
// FatFs Static Variables
static FIL fil; /* File object */
static char filename[31];
static FRESULT rc;
//....
稍后在同一sdcardlogmode.c文件中是以下功能(也降低了可读性)。和& filenum。我不相信此功能中使用了& sdcardlib(具有FATFS的手柄和接口指针)。至少我能说的。
令人困惑的是,调用sdcardlib_getDirectory(),然后不使用它产生的任何东西有什么意义?我找不到对dir和文件char阵列的下游使用。我也没有发现任何dirnum和filenum的用途。
在代码段中,我显示了sdcardlib_getDirectory()的代码。我找不到sdcardlib参数的位置。如前所述,我发现文件和DIRS数组没有使用。我可以看到文件和目录计数可以用于生成新名称,但是已经有静态变量可以容纳文件计数。谁能看到sdcard_getDirectory()被调用的原因?
/*
* Store TimeStamp from PC when logging starts to SDCard
*/
void storeTimeStampSDCard()
{
int i = 0;
uint16_t bw = 0;
unsigned long long epoch;
// FRESULT rc;
// Increment log file number
numLogFiles++;
,
//Detect SD card
SDCardLib_Status st = SDCardLib_detectCard(&sdCardLib);
if (st == SDCARDLIB_STATUS_NOT_PRESENT) {
SDCardLib_unInit(&sdCardLib);
mode = '0';
noSDCard = 1; //jn added
return;
}
// Read directory and file
rc = SDCardLib_getDirectory(&sdCardLib, "data_log", dirs, &dirNum, files, &fileNum);
//Create the directory under the root directory
rc = SDCardLib_createDirectory(&sdCardLib, "data_log");
if (rc != FR_OK && rc != FR_EXIST) {
SDCardLib_unInit(&sdCardLib);
mode = '0';
return;
}
//........
}
现在跳到sdcard.c(sdcardlib层)查看sdcardlib_getDirectory()很有趣。它将数组指针分配给一个维数数组(例如char(*filelist)[max_file_len],并在每次编写文件名时将其索引)。由于SDCardlib_CreateDirectory()只是返回f_mkdir(DirectoryName),因此此代码似乎很脆弱,因此它无法检查已经存在了多少文件。也许ti假定应该在sdcardlogmode上方的应用层进行此检查..
void SDCardLib_unInit(SDCardLib * lib)
{
/* Unregister work area prior to discard it */
f_mount(0, NULL);
}
FRESULT SDCardLib_getDirectory(SDCardLib * lib,
char * directoryName,
char (*dirList)[MAX_DIR_LEN], uint8_t *dirNum,
char (*fileList)[MAX_FILE_LEN], uint8_t *fileNum)
{
FRESULT rc; /* Result code */
DIRS dir; /* Directory object */
FILINFO fno; /* File information object */
uint8_t dirCnt = 0; /* track current directory count */
uint8_t fileCnt = 0; /* track current directory count */
rc = f_opendir(&dir, directoryName);
for (;;)
{
rc = f_readdir(&dir, &fno); // Read a directory item
if (rc || !fno.fname[0]) break; // Error or end of dir
if (fno.fattrib & AM_DIR) //this is a directory
{
strcat(*dirList, fno.fname); //add this to our list of names
dirCnt++;
dirList++;
}
else //this is a file
{
strcat(*fileList, fno.fname); //add this to our list of names
fileCnt++;
fileList++;
}
}
*dirNum = dirCnt;
*fileNum = fileCnt;
return rc;
}
以下是sdcardlib_createdirectory(sdcardlib *lib,char *directoryname)。它只是创建一个目录,不检查现有的文件数量。
FRESULT SDCardLib_createDirectory(SDCardLib * lib, char * directoryName)
{
return f_mkdir(directoryName);
}
所以回到我的问题:
我是否正确理解了此代码,它是否确实确实将目录和文件的数量限制为每个代码?
如果是这样,为什么文件和目录的数量如此限制?此示例代码随附的特定MSP430具有256KB的程序空间和8KB的RAM。编译的代码不到可用资源的一半(68KB的程序空间和约2.5kb的RAM)。是因为较大的堆栈段会溢出吗?
我想增加可以存储的文件数量。如果我查看基础FATFS代码,则不会对文件或目录的数量限制(至少在SD卡已满之前)。如果我从不打算在MSP430上显示或搜索目录的内容,我的想法是删除SDCARD_GETDIRECTORY()和两个char阵列(文件和dirs)。这会有一个理由为什么这是一个坏主意吗?
还有其他微控制器,内存较少。
SDCardLib_getDirectory()
函数将其dirList
和fileList
参数视为简单字符串,即,它在 same Same Pointers上调用strcat()
。这意味着它可以读取与10*8或10*12个字节的同样多的名称。
并在不添加定界符的情况下调用strcat()
意味着不可能将单个名称从字符串中取出。
这表明可以使用FATFS库,并且需要调用其功能,但不一定是如何做到这一点的一个很好的例子。我建议您编写自己的代码。