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

问题描述 投票:0回答:1

我正在尝试在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 Card mounted”打印到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 mount函数中的指针:

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,这样我就可以继续了。我希望这一点足够详细,因为我在这里提出这个问题的最后一次尝试很快(并且可以理解)被投了票!

eclipse stm32 rtos fatfs
1个回答
0
投票

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

该卡成功安装在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实例的指针由库内部保存。它不需要“传递”或对其他模块可见。

© www.soinside.com 2019 - 2024. All rights reserved.