将使用f_mount创建的工作区传递到另一个源文件

时间:2019-03-28 23:13:49

标签: eclipse stm32 rtos fatfs

我正在尝试使用RTOS中的FATFS读取SD卡上的文件。该卡已成功安装在RTOS中的一个单独的源文件中,但是当我尝试在自己的源文件中使用FatFs操作时,得到的结果为FR_NOT_ENABLED。

这是一个有些奇怪的场景,需要一些环境:我是一名电子技术学生,他承担了重新利用MCU及其专有RTOS的艰巨任务。在RTOS中,已经有一个装载SD卡的源文件(我们将其称为sd.cpp)和另一个将传感器数据文件写入其中的文件(我们将其称为Sensors.cpp)。我已经确保在我的源文件中包括所有相关的头文件(为清楚起见,我们将其称为myfile.cpp)。

我已经尝试了一些方法:首先是直接在myfile.cpp中实现f_mount操作。这导致了FR_DISK_ERR结果,据我所知是由于它已经被挂载在另一个文件中,因此显然是不可行的。从那里,我尝试注释掉Sensors.cpp中SD卡的所有实例,但这会打开一个真正的“蠕虫病毒罐”,我宁愿保存它,直到用尽其他选项为止……

我认为最终是要弄清楚如何将SD工作空间从sd.cpp传递到myfile.cpp。我试图研究Sensors.cpp以了解如何在此完成,但是不幸的是,它的内容远远超出了我作为一名纯电子技术学生的理解。

这是使用GNU-ARM工具链和OpenOCD构建工具的STM32L476RG。

代码都是非常标准的FATFS东西。 SD.cpp中的SD安装功能:

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卡已安装”打印到CLI。

然后在myfile.cpp中有我自己的FatFs操作:

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!");
}

当我在sd.cpp模块中运行f_stat操作时,此方法有效,确认这是在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 support page上的所有文档。

简而言之:我希望从myfile.cpp的f_stat(检查文件)中获取FR_OK,以便继续前进。我希望这一点足够详细,因为我最后一次在这里提出这个问题的尝试很快(并且可以理解)被否决了!

1 个答案:

答案 0 :(得分:0)

您的RTOS似乎正在使用here完整记录的ELM FatF。

  

该卡已成功安装在RTOS的单独的源文件中,   但是当我尝试在自己的源文件中使用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实例的指针由库内部保存。它不需要“传递”或对其他模块可见。