Я работаю над примером кода приложения 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);
}
Итак, возвращаясь к моим вопросам:
Я понял этот кодправильно, действительно ли оно ограничивает количество каталогов и файлов до 10?
Если так, почему число файлов и каталогов так ограничено?Конкретный MSP430, с которым поставляется этот пример кода, имеет 256 КБ программного пространства и 8 КБ ОЗУ.Скомпилированный код потребляет менее половины доступных ресурсов (68 КБ программного пространства и около 2,5 КБ ОЗУ).Это из-за того, что больший сегмент переполнит сегмент стека?
Я хочу увеличить количество файлов, которые можно сохранить.Если я смотрю на основной код FATFS, он не накладывает ограничения на количество файлов или каталогов (по крайней мере, до тех пор, пока SD-карта не заполнится).Если я никогда не собираюсь отображать или искать содержимое каталога на MSP430, моя мысль состоит в том, чтобы удалить SDCard_getDirectory () и два массива char (файлы и каталоги).Будет ли причина, по которой это будет плохой идеей?