【RT-Thread学习】二:添加基于tf卡的文件系统

潘多拉IoT Board物联网开发板上具有一个使用SPI1驱动的tf卡,原理图如下图所示:

【RT-Thread学习】二:添加基于tf卡的文件系统_第1张图片

 开发板提供的RT-Thread开发包已经包含了BSP驱动,我们只需要使用env工具将所需的驱动添加进来即可使用;env工具的获取和使用方法可参考官方文档https://www.rt-thread.org/document/site/programming-manual/env/env/,这里不作过多介绍,可将env工具添加到右键菜单中方便使用。

添加tf卡驱动和文件系统的操作方法如下:

1.在工程目录下打开 env 工具,输入menuconfig命令配置工程

2.首先在Hardware Drivers Config → Onboard Peripheral Drivers下使能Enable TF_CARD,这个选项会添加BSP_USING_TF_CARD宏定义,同时也会自动打开 RT-Thread Components → Device Drivers中的Using SPI Bus/Device device drivers选项和Using SD/TF card driver with spi选项,添加BSP_USING_SPI1和RT_USING_SPI_MSD两个宏定义;还会打开 RT-Thread Components → Device virtual file system中的Using device virtual file system选项,添加RT_USING_DFS_DEVFS宏定义,如图所示:

【RT-Thread学习】二:添加基于tf卡的文件系统_第2张图片

 【RT-Thread学习】二:添加基于tf卡的文件系统_第3张图片

 【RT-Thread学习】二:添加基于tf卡的文件系统_第4张图片

3. 在上一步完成打开了RT-Thread的虚拟文件系统VFS,我们使用的TF卡一般是FAT32格式的,所以还需配置VFS使能并配置fatfs文件系统,首先在RT-Thread Components → Device virtual file system中打开Enable elm-chan fatfs选项,打开后会出现fatfs的配置选项elm-chan's FatFs, Generic FAT Filesystem Module  --->,进入后可对fatfs进行配置,这里我们打开长文件名支持并选择3LFN缓存在堆上动态分配,并使能可重入支持,详细配置如图:

【RT-Thread学习】二:添加基于tf卡的文件系统_第5张图片

4.接下来为了实现文件系统的自动挂载,我们可以打开RT-Thread Components → Device virtual file system中的Using mount table for file system选项,这样可以在应用程序源文件中添加文件系统自动挂载表即可实现tf卡文件系统的开机自动挂载,这里将sd0设备挂载到“/”,文件系统为elm-FAT 文件系统,则自动挂载表如下:

#include "dfs_fs.h"
#include "dfs_posix.h"
/* 文件系统自动挂载表 */
const struct dfs_mount_tbl mount_table[]=
{
  {"sd0","/","elm",0,0},
  {0}
};

当不使用自动挂载功能时应用程序需要开机调用dfs_mount函数挂载sd卡文件系统,这里调用参数为:

/* 挂载TF 卡中的文件系统, 参数elm 表示挂载的文件系统类型为elm-fat 文件系统*/
if (dfs_mount("sd0", "/", "elm", 0, 0) == 0)
{
    rt_kprintf("Filesystem initialized!\n");
}
else
{
    rt_kprintf("Failed to initialize filesystem!\n");
}

有关RT-Thread虚拟文件系统的详细介绍可以参考官方文档https://www.rt-thread.org/document/site/programming-manual/filesystem/filesystem/

5.以上配置完成了所需宏定义的配置(在rtconfig.h中),然后退出并保存menuconfig配置,输入scons --target=mdk4/mdk5/iar 命令根据所选用的编译器重新生成工程,完成后打开工程文件编译下载到开发板中,在msh中查看帮助可以看到增加了ls,cp,mv,mkdir等自带的文件管理命令,如图所示,可以创建、删除、读写文件进行测试。

                【RT-Thread学习】二:添加基于tf卡的文件系统_第6张图片

这里添加一个文件写入线程测试文件的写入,使用posix文件操作函数:

const char file_rw_name[]="file_rw_test.txt";
/* 文件写线程 */
static void file_w_thread(void *arg)
{
  int fd=0,length=0;
  
  static char buffer[1024];
  char a='a';
  
  while(1)
  {
    fd=open(file_rw_name,O_WRONLY|O_CREAT|O_APPEND,0666);  //以追加创建方式打开文件
    if(fd<0)
    {
      rt_kprintf("file_w:open file \"%s\" failed!\n",file_rw_name);
    }
    else
    {
      memset(buffer, a, sizeof(buffer));
      a++;
      if(a>'z')
      {
        a='a';
      }
      length = write(fd, buffer, sizeof(buffer));
      if(length<0)
      {
        rt_kprintf("write error:%d", rt_get_errno());
      }

      close(fd);  //关闭文件
    }
  
    rt_thread_mdelay(1000);
  }
}

然后可以通过cat命令查看文件内容是否写入正确。

你可能感兴趣的:(RT-Thread)