C -MSP430 SD卡应用程序在FATF上运行的应用程序似乎过于限制.我的理解是正确的



我正在通过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);
}

所以回到我的问题:

  1. 我是否正确理解了此代码,它是否确实确实将目录和文件的数量限制为每个代码?

  2. 如果是这样,为什么文件和目录的数量如此限制?此示例代码随附的特定MSP430具有256KB的程序空间和8KB的RAM。编译的代码不到可用资源的一半(68KB的程序空间和约2.5kb的RAM)。是因为较大的堆栈段会溢出吗?

  3. 我想增加可以存储的文件数量。如果我查看基础FATFS代码,则不会对文件或目录的数量限制(至少在SD卡已满之前)。如果我从不打算在MSP430上显示或搜索目录的内容,我的想法是删除SDCARD_GETDIRECTORY()和两个char阵列(文件和dirs)。这会有一个理由为什么这是一个坏主意吗?

还有其他微控制器,内存较少。

SDCardLib_getDirectory()函数将其dirListfileList参数视为简单字符串,即,它在 same Same Pointers上调用strcat()。这意味着它可以读取与10*8或10*12个字节的同样多的名称。

并在不添加定界符的情况下调用strcat()意味着不可能将单个名称从字符串中取出。

这表明可以使用FATFS库,并且需要调用其功能,但不一定是如何做到这一点的一个很好的例子。我建议您编写自己的代码。

最新更新