Приложение SD-карты MSP430, работающее поверх FATFS, выглядит слишком ограниченным.Правильно ли мое понимание? - PullRequest
0 голосов
/ 04 марта 2019

Я работаю над примером кода приложения SD-карты, предоставленным TI для их комплекта для разработки микроконтроллера MSP530 LaunchPad.Похоже, что в этом примере количество каталогов и количество файлов ограничено 10 (в общей сложности 100 файлов), что представляется чрезмерно ограничительным для 32-ГБ SD-карты.Текущий код компилируется, чтобы использовать менее половины программного пространства и менее половины доступного ОЗУ.Мне интересно, неправильно ли я понимаю код, или же код ограничен какой-либо другой причиной, например доступным размером стека в памяти.Ниже приведен код и мои комментарии.

Существует несколько уровней: SDCardLogMode, sdcard (SDCardLib) и ff (уровень HAL).Я сократил код ниже, чтобы проиллюстрировать конструкции, но не работает - меня больше интересует, правильно ли я понимаю и если мое решение по увеличению количества разрешенных файлов и каталогов имеет недостатки.

SDCardLogMode.c здесь есть две достопримечательности.Первым является объявление char dirs [10] [MAX_DIR_LEN] и файлов [10] [MAX_FILE_LEN].Максимальные значения 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 есть следующая функция (также уменьшенная для удобства чтения).Здесь интересно то, что код вызывает SDCardLib_getDirectory (& sdCardLib, "data_log", dirs, & dirNum, files & & fileNum), которые используют путь "data_log" и создают dir, а также обновляют & dirNum, files и & fileNum.Я не верю, что & sdCardLib (который содержит дескриптор FATFS и указатель интерфейса) используется в этой функции.По крайней мере, не то, что я могу сказать.

Что озадачивает то, что смысл вызывать SDCardLib_getDirectory (), а затем не использовать ничего, что он производит?Я не нашел никакого последующего использования массивов dirs и files 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. Я понял этот кодправильно, действительно ли оно ограничивает количество каталогов и файлов до 10?

  2. Если так, почему число файлов и каталогов так ограничено?Конкретный MSP430, с которым поставляется этот пример кода, имеет 256 КБ программного пространства и 8 КБ ОЗУ.Скомпилированный код потребляет менее половины доступных ресурсов (68 КБ программного пространства и около 2,5 КБ ОЗУ).Это из-за того, что больший сегмент переполнит сегмент стека?

  3. Я хочу увеличить количество файлов, которые можно сохранить.Если я смотрю на основной код FATFS, он не накладывает ограничения на количество файлов или каталогов (по крайней мере, до тех пор, пока SD-карта не заполнится).Если я никогда не собираюсь отображать или искать содержимое каталога на MSP430, моя мысль состоит в том, чтобы удалить SDCard_getDirectory () и два массива char (файлы и каталоги).Будет ли причина, по которой это будет плохой идеей?

1 Ответ

0 голосов
/ 04 марта 2019

Существуют другие микроконтроллеры с меньшим объемом памяти.

Функция SDCardLib_getDirectory() обрабатывает свои параметры dirList и fileList как простые строки, т. Е. Вызывает strcat() для того же указателей.Это означает, что он может читать столько имен, сколько уместится в 10 * 8 или 10 * 12 байтов.

А вызов strcat() без добавления разделителя означает, что невозможно извлечь отдельные имена из строки.

Этот код демонстрирует, что можно использовать библиотеку FatFs и в каком порядке нужно вызывать ее функции, но это не обязательно хороший пример того, как это сделать.Я рекомендую вам написать свой собственный код.

...