This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430FR5994:需要 FATFS 操作指南

Guru**** 2582405 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/830800/msp430fr5994-need-some-guidance-on-fatfs-operation

器件型号:MSP430FR5994

我很难理解结构 FIL 是如何获得指向文件系统(FATFS)的指针的。

在代码示例中、SDCardLib 使用以下命令实例化文件系统:  

FATFS Fatfs; //FatFs 处理当前 FatFs 操作会话

在此之前、 FIL 结构被实例化为

静态 FIL fil;

FIL 保存指向 FATFS 文件系统的* FS 指针。

我知道 f_open()应该填充一个空 fil 对象(它采用一个空 fil 对象和指向路径/文件名的指针),  

如果是,那么 f_open()如何 获取文件系统 fatfs 句柄(在 SdCardLib 中创建),以便它可以将其分配给 fil 中的*FS 指针? 如果 f_open()没有填充 FS 指针,那么如果 SDCardLib 对象(保存 fatfs 句柄)在之后被实例化,FIL 如何知道指针在哪里?

陈氏网站有很多有用的资料,但我没有找到它描述了 FIL 如何与 FATFS 进行互动的地方。

这里的一些指导是最受欢迎的。 谢谢你。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我在 CHAN 网站上找到了一个示例代码、其中显示了我需要一些指导的位置。  fil 对象是如何获得文件系统句柄(*FS)的? 是否在创建 fil 对象时分配了句柄? 如果是,编译器如何 知道要分配给*FS 指针的 fatfs 会话(假设我实例化了多个 FATFS 对象)? 是否由 f_mount ()指派,如果是,f_mount ()如何获得对&fil 的引用?

    谢谢

    /*读取文本文件并显示它*/
    
    FATFS FatFs;//逻辑驱动器的工作区域(文件系统对象)*/
    
    int main (void)
    {
    fil fil; /*文件对象*/
    char line[100];/*线路缓冲器*/
    FRESULT fr; /* FatFs 返回代码*/
    
    
    /*将工作区注册为默认驱动器*/
    f_mount (&FatFs、""、0);
    
    /*打开文本文件*/
    fr = f_open (&fil、"message.txt"、fa_read);
    if (fr) return (int) fr;
    
    /*读取每行并显示它*/
    while (f_gets (line、sizeof line、&fil)){
    printf (line);
    }
    
    /*关闭文件*/
    f_close (&fil);
    
    返回0;
    } 

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我想我找到了我的答案。 文件系统的关联通过 f_mount()完成。 f_mount()采用三个参数,第一个参数是对&fatfs 对象的引用,该对象是保存文件系统工作区的结构。 第二个参数是"0:filename"或"1:filename"形式的路径名称、其中前两个字符(数字后跟冒号)表示逻辑驱动器编号。 缺少数值和冒号意味着逻辑驱动器是默认驱动器("0:")。 f_mount()采用的第三个参数是初始化选项。  

    因此,在 f_mount()之后,逻辑驱动器现在与 fatfs 对象相关联。 在 f_mount ()上面的代码中,第二个参数没有一个逻辑驱动器数字后面跟冒号,因此它默认为0: 同样,f_open ()的第二个参数 也使用默认驱动器0 (它没有一个数字后面跟冒号)。 底线是 f_open()知道 f_mount()安装的逻辑驱动器,现在可以将 fil 中的*FS 指针与&fatfs 相关联。  

    下面是一个显式指定逻辑驱动器的示例("0:"和"1:")。

    /*将驱动器1上的文件"file.bin"复制到驱动器0 */
    
    int main (void)
    {
    FATFS fs0、fs1; 逻辑驱动器的/*工作区(文件系统对象)*/
    fil FSRC、fdst; /*文件对象*/
    字节缓冲区[4096];/*文件复制缓冲区*/
    FRESULT fr; /* FatFs 函数常见结果代码*/
    UINT br,bw; /*文件读/写计数*/
    
    
    /*为每个逻辑驱动器注册工作区*/
    f_mount (&fs0、"0:"、0);
    f_mount (&fs1、"1:"、0);
    
    /*在驱动器1上打开源文件*/
    FR = f_open (&FSRC、"1:file.bin"、fa_read);
    if (fr) return (int) fr;
    
    /*在驱动器0上创建目标文件*/
    fr = f_open (&fdst、"0:file.bin"、fa_write | fa_create_always);
    if (fr) return (int) fr;
    
    /*将源复制到目标*/
    对于(;;){
    fr = f_read (&fSRC、buffer、sizeof buffer、&br);//读取源文件块*/
    如果(fr || br =0)中断;/*错误或 eof */
    fr = f_write (&fdst、buffer、br、&bw); /*将其写入目标文件*/
    如果(fr || bw < br)中断;/*错误或磁盘已满*/
    }
    
    /*关闭打开的文件*/
    F_Close (&FSRC);
    f_close (&fdst);
    
    /*放弃之前取消注册工作区*/
    f_mount (0、"0:"、0);
    f_mount (0、"1:"、0);
    
    返回(int)fr;
    } 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

     您好 James、

    感谢您发帖并与社区分享解决方案。

    谢谢、

    是的