Передача рабочей области, созданной с помощью f_mount, в другой исходный файл - PullRequest
0 голосов
/ 29 марта 2019

Я пытаюсь прочитать файл на SD-карте, используя FATFS в RTOS.Карта успешно монтируется в отдельный исходный файл в ОСРВ, но когда я пытаюсь использовать операции FatFs в своем собственном исходном файле, я получаю результат FR_NOT_ENABLED.

Это несколько странный сценарий, требующий некоторого контекстаЯ студент-техник по электронике, взявший на себя довольно сложную задачу переделать MCU и его собственную ОСРВ.В RTOS уже есть исходный файл, который монтирует SD-карту (назовем ее sd.cpp), и другой файл (назовем его Sensors.cpp), который записывает в него файлы данных датчика.Я удостоверился, что включил все соответствующие заголовочные файлы в мой исходный файл (который, для ясности, давайте назовем myfile.cpp).

Я попробовал несколько вещей: первым была реализация операции f_mountпрямо в myfile.cpp.Это вызвало результат FR_DISK_ERR, который, как я понимаю, связан с тем фактом, что он уже смонтирован в другом файле, так что это явно за кадром.Оттуда я попытался закомментировать все экземпляры SD-карты в Sensors.cpp, но это открывает реальную «банку червей», которую я предпочел бы сохранить, пока не исчерпаны другие параметры ...

IПолагаю, что все сводится к тому, чтобы выяснить, как передать рабочую область SD из sd.cpp в myfile.cpp.Я пытался изучить Sensors.cpp, чтобы понять, как это делается там, но, к сожалению, его содержание далеко за пределами моего понимания, как простой студент-электронщик.

Это STM32L476RG, использующий цепочку инструментов GNU-ARM и инструменты сборки OpenOCD.

Код - это все довольно стандартные вещи FATFS.Функция монтирования SD в SD.cpp:

FATFS fs;
bool isMounted = false;

FRESULT fsMountSd(){
    FRESULT res = f_mount(&fs, "0:", 1);
    if( res == FR_OK) isMounted = true;
    if (isMounted = true){
    CLI_printMessage("SD Card mounted");
    }
    return res;
}

Возвращает FR_OK и печатает «SD Card mount» в CLI.

Тогда есть мои собственные операции FatFs в myfile.cpp:

FIL config; //file object of  from the SD card


FRESULT fr;
FILINFO fno;

//check for config.txt file
fr = f_stat("0:config.txt", &fno);    //check for config.txt file

if (fr == FR_OK){
      CLI_printMessage("File found!");
}

Это работает, когда я запускаю операцию f_stat в модуле sd.cpp, подтверждая, что это проблема отсутствия поискаобъект файловой системы в myfile.cpp.

Я также пытался использовать указатели в функции монтирования sd.cpp:

FATFS *fs;

bool isMounted = false;

FRESULT fsMountSd(){
    FRESULT res = f_mount(fs, "0:", 1);
    if( res == FR_OK) isMounted = true;
    if (isMounted = true){
    CLI_printMessage("SD Card mounted");
    }
    return res;
}

Когда я попробовал это, я также добавил строку "extern FATFS * fs;"в файл sd.hК сожалению, это также не удалось.

Стоит добавить, что я прочитал всю документацию на высокоинформативной странице поддержки Fatfs .

Короче говоря: я надеюсь получить FR_OK из этого f_stat(проверяя файл) в myfile.cpp, чтобы я мог двигаться дальше.Я надеюсь, что это было достаточно подробно, так как моя последняя попытка задать этот вопрос здесь была очень быстро (и понятно), за что проголосовали!

1 Ответ

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

Ваша ОСРВ, по-видимому, использует полностью задокументированные файлы ELM FatF здесь .

Карта успешно монтируется в отдельный исходный файл в ОСРВ, но когда я пытаюсь использоватьоперации FatFs в моем собственном исходном файле, я получаю результат FR_NOT_ENABLED.[...] В RTOS уже есть исходный файл, который монтирует SD-карту

Если вы имеете в виду, что файловая система уже смонтирована, и вы монтируете ее во второй раз, то естьненужный и может вызвать ошибки, если он монтирует тот же объем.Библиотека содержит один указатель на предоставленный экземпляр FATFS для каждого тома, вы не должны передавать ему другой экземпляр, когда используется первый.Тем не менее, я считаю, что это следует проверить, поэтому здесь проблема может не быть.

Нет необходимости делать объект FATFS глобальным или внешним;он просто должен существовать, пока продолжаются операции с файловой системой.Лучше сделать это static в fsMountSd(), например:

FRESULT fsMountSd()
{
    static FATFS fs;
    static bool isMounted = false;
    FRESULT res = FR_OK ;

    if( !isMounted )
    {
        res = f_mount(&fs, "0:", 1);
        isMounted = (res == FR_OK) ;
    }

    if( isMounted )
    {
        CLI_printMessage("SD Card mounted");
    }

    return res;
}

Я также попробовал каждую конфигурацию пути: "config.txt", "0: config.txt "," 0: \ config.txt "," 0: /config.txt "и т. д.

Если у вас только один том, вы можете использовать:

    res = f_mount(&fs, "", 1);

для монтирования (только) тома по умолчанию.

Если вы хотите явно размонтировать и перемонтировать, то это делается путем передачи NULL f_mount:

    if( isMounted )
    {
        f_mount( NULL, "", 1);
    }

    res = f_mount(&fs, "", 1);
    isMounted = (res == FR_OK) ;

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

[...] может кто-то может дать мне знать, как затем вызвать этот указатель в моей собственной функции.

Я не уверен, что вы подразумеваете под " вызывать этот указатель ", указатель на экземпляр FATFS хранится внутри библиотеки.Его не нужно «передавать» или видеть другим модулям.

...