外观
文件系统注册操作示例
2026-07-07
本文介绍 RT-Thread DFS 框架中文件系统注册相关的系统接口,包括文件系统类型注册、挂载与卸载,帮助开发者快速掌握文件系统注册流程。
DFS 与 TMPFS 文件系统
DFS (Device File System) 是 RT-Thread 提供的虚拟文件系统框架,支持在同一设备上挂载多种不同类型的文件系统。TMPFS (Temporary File System) 是一种基于内存的简易文件系统,所有文件数据存储在 RAM 中,断电后数据丢失,适用于临时存储与读写测试场景。
在 RT-Thread 系统中,任何文件系统需先通过 dfs_register() 注册到 DFS 框架,随后调用 dfs_mount() 挂载到指定路径后方可使用。
API 说明
注册文件系统类型
int dfs_register(const struct dfs_filesystem_ops *ops);功能说明:
将文件系统操作集合注册到 DFS 框架中,注册后系统可识别该文件系统类型
参数说明:
ops:文件系统操作集合指针
操作集合包含以下接口:
mount:挂载文件系统unmount:卸载文件系统mkfs:格式化文件系统statfs:获取文件系统统计信息unlink:删除文件stat:获取文件状态rename:重命名文件
查找已挂载文件系统
struct dfs_filesystem *dfs_filesystem_lookup(const char *path);功能说明:
根据路径查找已挂载的文件系统
参数说明:
- path:文件系统挂载路径
挂载文件系统
int dfs_mount(const char *device_name,
const char *path,
const char *filesystemtype,
unsigned long rwflag,
const void *data);功能说明:
将指定类型的文件系统挂载到目标路径,挂载后可通过 POSIX 接口访问该路径下的文件
参数说明:
- device_name:块设备名称
- path:文件系统挂载路径
- filesystemtype:文件系统类型名
- rwflag:读写标志
- data:文件系统私有数据
卸载文件系统
int dfs_unmount(const char *specialfile);功能说明:
卸载指定路径下的文件系统,释放相关资源
参数说明:
- specialfile:已挂载的文件系统路径或设备名
格式化文件系统
int dfs_mkfs(const char *fs_name, const char *device_name);功能说明:
在指定设备上格式化创建文件系统
参数说明:
- fs_name:文件系统名称
- device_name:设备名称
核心示例代码
#define MOUNT_PATH "/data/tmpfs"
#define SUB_DIR MOUNT_PATH "/subdir"
#define TEST_FILE SUB_DIR "/test.txt"
#define TEST_DATA "Hello RT-Thread TMPFS!"
int tmpfs_register_example(void)
{
rt_err_t ret = RT_EOK;
int fd;
ssize_t write_size;
ssize_t read_size;
char buf[64];
if (dfs_tmpfs_init() != 0)
{
LOG_E("tmpfs register failed");
ret = -RT_ERROR;
goto __exit;
}
LOG_I("tmpfs filesystem registered");
mkdir(MOUNT_PATH, 0);
if (dfs_mount(RT_NULL, MOUNT_PATH, "user_tmp", 0, RT_NULL) != 0)
{
LOG_E("tmpfs mount failed");
ret = -RT_ERROR;
goto __exit;
}
LOG_I("tmpfs mounted at %s", MOUNT_PATH);
mkdir(SUB_DIR, 0);
fd = open(TEST_FILE, O_RDWR | O_CREAT | O_TRUNC, 0);
if (fd < 0)
{
LOG_E("open file failed");
ret = -RT_ERROR;
goto __exit;
}
write_size = write(fd, TEST_DATA, strlen(TEST_DATA));
if (write_size < 0)
{
LOG_E("write file failed");
close(fd);
ret = -RT_ERROR;
goto __exit;
}
lseek(fd, 0, SEEK_SET);
read_size = read(fd, buf, sizeof(buf) - 1);
if (read_size < 0)
{
LOG_E("read file failed");
close(fd);
ret = -RT_ERROR;
goto __exit;
}
buf[read_size] = '\0';
LOG_I("write %d bytes, read back: %s", write_size, buf);
close(fd);
__exit:
unlink(TEST_FILE);
LOG_I("cleanup: unlink %s", TEST_FILE);
unlink(SUB_DIR);
LOG_I("cleanup: unlink %s", SUB_DIR);
if (dfs_unmount(MOUNT_PATH) == 0)
LOG_I("cleanup: unmount %s OK", MOUNT_PATH);
else
LOG_I("cleanup: unmount %s skipped (not mounted)", MOUNT_PATH);
unlink(MOUNT_PATH);
return ret;
}
MSH_CMD_EXPORT(tmpfs_register_example, tmpfs register and rw example);运行示例
操作步骤
- 将程序下载到开发板
- 打开串口终端连接开发板
- 输入
tmpfs_register_example命令
预期结果
rtt 终端
msh />tmpfs_register_example
[I/example.tmpfs] tmpfs filesystem registered
[I/example.tmpfs] tmpfs mounted at /data/tmpfs
[I/example.tmpfs] write 22 bytes, read back: Hello RT-Thread TMPFS!
[I/example.tmpfs] cleanup: unlink /data/tmpfs/subdir/test.txt
[I/example.tmpfs] cleanup: unlink /data/tmpfs/subdir
[I/example.tmpfs] cleanup: unmount /data/tmpfs OK