我正尝试在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挂载功能:
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操作:
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;
}当我尝试这样做时,我还向sd.h文件添加了行"extern FATFS* fs;“。不幸的是,这也是不成功的。
值得一提的是,我已经阅读了关于信息量很大的Fatfs support page的所有文档。
所以简而言之:我希望在myfile.cpp中从这个f_stat (检查文件)中获得FR_OK,这样我就可以继续前进了。我希望这是足够详细的,因为我在这里提出这个问题的最后一次尝试很快(也可以理解)被否决了!
发布于 2019-03-30 08:18:26
您的实时操作系统似乎正在使用ELM FatFs完整记录的here。
在实时操作系统中成功地将该卡挂载到一个单独的源文件中,但当我尝试在自己的源文件中使用FatFs操作时,我得到结果FR_NOT_ENABLED。..。在RTOS中,已经有一个装载SD卡的源文件
如果您的意思是文件系统已经挂载,并且您正在第二次挂载它,那么这是不必要的,并且如果它挂载相同的卷,则很可能会导致错误。该库为每个卷保存一个指向所提供的FATFS实例的指针,当第一个实例正在使用时,您不应将其传递给另一个实例。这就是说,我认为它应该被检查,所以这里可能不是问题。
不需要使FATFS对象成为全局对象或外部对象;它只需要在文件系统操作继续时存在。在fsMountSd()中最好将其设为static,例如:
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实例的指针是由库内部保存的。它不需要被“传递”或对其他模块可见。
https://stackoverflow.com/questions/55408237
复制相似问题