我正在尝试使用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,以便继续前进。我希望这一点足够详细,因为我最后一次在这里提出这个问题的尝试很快(并且可以理解)被否决了!
答案 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实例的指针由库内部保存。它不需要“传递”或对其他模块可见。