首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将使用f_mount创建的工作区传递给另一个源文件

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

Stack Overflow用户
提问于 2019-03-29 07:13:49
回答 1查看 536关注 0票数 0

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

这是一个有点奇怪的场景,需要一些背景知识:我是一名电子技术专业的学生,承担了一项相当艰巨的任务,即重新利用MCU及其专有的RTOS。在RTOS中,已经有一个装载SD卡的源文件(我们称其为sd.cpp)和另一个将传感器数据文件写入SD卡的文件(我们称其为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挂载功能:

代码语言:javascript
复制
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卡”打印到命令行界面。

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

代码语言:javascript
复制
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挂载函数中使用指针:

代码语言:javascript
复制
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;
}

当我尝试这样做时,我还向sd.h文件添加了行"extern FATFS* fs;“。不幸的是,这也是不成功的。

值得一提的是,我已经阅读了关于信息量很大的Fatfs support page的所有文档。

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

EN

回答 1

Stack Overflow用户

发布于 2019-03-30 08:18:26

您的实时操作系统似乎正在使用ELM FatFs完整记录的here

在实时操作系统中成功地将该卡挂载到一个单独的源文件中,但当我尝试在自己的源文件中使用FatFs操作时,我得到结果FR_NOT_ENABLED。..。在RTOS中,已经有一个装载SD卡的源文件

如果您的意思是文件系统已经挂载,并且您正在第二次挂载它,那么这是不必要的,并且如果它挂载相同的卷,则很可能会导致错误。该库为每个卷保存一个指向所提供的FATFS实例的指针,当第一个实例正在使用时,您不应将其传递给另一个实例。这就是说,我认为它应该被检查,所以这里可能不是问题。

不需要使FATFS对象成为全局对象或外部对象;它只需要在文件系统操作继续时存在。在fsMountSd()中最好将其设为static,例如:

代码语言:javascript
复制
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”等。

如果您只有一个卷,则可以使用:

代码语言:javascript
复制
    res = f_mount(&fs, "", 1);

挂载默认(仅限)卷。

如果要显式地卸载和重新挂载,则可以通过将NULL传递给f_mount来完成

代码语言:javascript
复制
    if( isMounted )
    {
        f_mount( NULL, "", 1);
    }

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

但这可能会导致其他线程访问文件系统时出现问题,如果这些线程当时打开了文件。

...也许有人可以告诉我如何在我自己的函数中调用这个指针。

我不确定你所说的“调用指针”是什么意思,指向FATFS实例的指针是由库内部保存的。它不需要被“传递”或对其他模块可见。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55408237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档