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