|
xt-sdk 文档 v1.0.3
xt-sdk 嵌入式 SDK API 参考
|
版本:0.1 | 日期:2026-06-16 | 路径:components/xt_core/components/xt_vfs.h/.c
子文档:
xt_vfs 是一个面向嵌入式系统的虚拟文件系统框架,支持多后端挂载、两级线程安全锁、三种内存模式。在 xt_fs 基础上重构——从单后端全局函数升级为多后端可插拔架构。
| 特性 | xt_fs | xt_vfs |
|---|---|---|
| 后端模型 | 单后端,平台层硬对接 | 多后端,ops 接口可插拔 |
| API 数量 | 28 个 | 35 个 |
| 线程安全 | 平台层自管 | Core 内置两级锁,宏可关 |
| 内存策略 | 平台层 malloc | 动态/外部/静态三模式 |
| 句柄安全 | 整数 fd | generation 编码防悬空 |
| 路径路由 | 直通 | 挂载点最长前缀匹配 + 相对路径解析 |
| 目录可裁剪 | 否 | XT_VFS_ENABLE_DIR 宏 |
| 依赖 | 用途 |
|---|---|
| xt_list.h | 双向循环链表:空闲链表 + 挂载表 |
| CMSIS-OS2(可选) | mutex 锁 + 线程 ID |
| xt_malloc.h(可选) | 堆内存分配 |
| xt_log.h | XT_ASSERT_MSG 断言 |
文件系统通过 prefix(如 /flash、/sd)挂载到 VFS。路径操作时 Core 按**最长前缀匹配**找到对应后端,将剩余子路径传给后端。
**嵌套挂载**:/c 用 native,/c/mnt/ram 用 ramfs。/c/mnt/ram/file.txt 匹配 /c/mnt/ram(最长前缀优先)。
文件句柄 xt_vfs_fd_t 编码为 (generation << 16) | (table_index)。每次分配 generation++(从 1 开始),close 后旧 fd 因 generation 不匹配被拒绝。XT_VFS_INVALID_FD 固定为 (xt_vfs_fd_t)(-1)。
目录句柄 xt_vfs_dir_t 为 opaque 指针,内部通过 dd_vfs_idx + dd_rsv 编码 generation。
| 锁 | 保护 | 持有时机 |
|---|---|---|
| VFS 全局锁 | 挂载表、句柄表、线程上下文表 | 查表/分配/释放时短暂持有 |
| 后端锁(每挂载点独立) | 该后端所有 I/O 操作 | ops 调用期间持有 |
锁顺序永远是先全局锁→再后端锁,不允许反向。
xt_vfs_errno() 通过 osThreadGetId() 查 thread_table 返回当前线程的错误码。裸机模式(XT_VFS_ENABLE_THREAD_SAFE=0)固定用槽 0。
#if XT_VFS_ENABLE_CWD 启用。xt_vfs_chdir 设置当前线程工作目录,后续操作可用相对路径(不以 / 开头)。支持 . 和 .. 规范化。
| 层级 | 函数 | 标注 |
|---|---|---|
| **最小子集**(必须实现) | mount, unmount, open, close, read, write, seek, tell, fsync | @note 最小对接子集,所有后端必须实现 |
| 常用推荐 | remove, rename, stat, fstat, statfs | @note 常用推荐接口 |
| 可选 | truncate, ftruncate, access, utime, sync_all, mkdir, rmdir, opendir, closedir, readdir, telldir, seekdir | @note 可选接口,置 NULL 则返回 XT_VFS_ERR_NOSYS |
**ops 都是 const**:
以下为函数签名大纲,完整的参数说明、返回值、注意事项请查看 xt_vfs(虚拟文件系统) 。
| 函数签名 | 说明 |
|---|---|
| xt_vfs_err_t xt_vfs_init(const xt_vfs_config_t *config) | 初始化 VFS 实例 |
| xt_vfs_err_t xt_vfs_deinit(void) | 销毁 VFS 实例 |
| 函数签名 | 说明 |
|---|---|
| xt_vfs_err_t xt_vfs_mount(const char *path, const xt_vfs_ops_t *ops, void *ctx) | 挂载后端文件系统 |
| xt_vfs_err_t xt_vfs_unmount(const char *path) | 卸载后端文件系统 |
| 函数签名 | 说明 |
|---|---|
| xt_vfs_err_t xt_vfs_mkdir(const char *path) | 创建目录 |
| xt_vfs_err_t xt_vfs_rmdir(const char *path) | 删除空目录 |
| xt_vfs_dir_t *xt_vfs_opendir(const char *path) | 打开目录 |
| xt_vfs_err_t xt_vfs_closedir(xt_vfs_dir_t *dir) | 关闭目录 |
| xt_vfs_dirent_t *xt_vfs_readdir(xt_vfs_dir_t *dir) | 读取目录项 |
| xt_vfs_err_t xt_vfs_rewinddir(xt_vfs_dir_t *dir) | 重置目录读取位置 |
| xt_vfs_off_t xt_vfs_telldir(xt_vfs_dir_t *dir) | 获取目录读取位置 |
| xt_vfs_err_t xt_vfs_seekdir(xt_vfs_dir_t *dir, xt_vfs_off_t loc) | 设置目录读取位置 |
| 函数签名 | 说明 |
|---|---|
| xt_vfs_err_t xt_vfs_chdir(const char *path) | 切换当前工作目录 |
| char *xt_vfs_getcwd(char *buf, xt_vfs_size_t size) | 获取当前工作目录 |
| 函数签名 | 说明 |
|---|---|
| xt_vfs_err_t xt_vfs_errno(void) | 获取当前线程的最后一个错误码 |
| const char *xt_vfs_strerror(xt_vfs_err_t err) | 获取错误码对应的字符串描述 |
| bool xt_vfs_is_active(void) | 检查 VFS 实例是否已激活 |
所有宏在 xt_vfs_port.h 中定义,采用 #if !defined() 模式,xmake 可覆盖。
| 宏 | 默认值 | 说明 |
|---|---|---|
| XT_VFS_ENABLE_THREAD_SAFE | 1 | 线程安全(CMSIS-OS2 mutex) |
| XT_VFS_USE_HEAP | 1 | 堆内存(xt_malloc) |
| XT_VFS_ENABLE_CWD | 0 | 相对路径(chdir/getcwd) |
| XT_VFS_ENABLE_DIR | 1 | 目录操作 |
| XT_VFS_ENABLE_STATIC_TEST | 0 | 静态测试模式 |
| XT_VFS_PATH_MAX | 128 | 最大路径长度 |
| XT_VFS_FILENAME_MAX | 64 | 最大文件名长度 |
| XT_VFS_MOUNT_PREFIX_MAX | 16 | 挂载前缀最大长度 |
| XT_VFS_MAX_MOUNTS | 4 | 最大挂载点数(静态模式) |
| XT_VFS_MAX_FILES | 8 | 最大打开文件数(静态模式) |
| XT_VFS_MAX_DIRS | 4 | 最大打开目录数(静态模式) |
| XT_VFS_MAX_THREADS | 8 | 最大线程上下文槽数 |
xmake 传递示例 (xt_core/xmake.lua):
裸机最小配置 (无堆+无锁+无目录):
RAM 占用约 900 字节(静态数组全在 BSS 段)。
只需实现 9 个最小子集函数,其余置 NULL:
| 反模式 | 问题 | 正确做法 |
|---|---|---|
| 回调中操作同一挂载点 | mount 锁非递归,回调中调 open 同 mount 点死锁 | 回调仅做轻量操作,不调 VFS API |
| 对 static 定时器调 delete | 释放栈/全局内存 | ng 静态对象不调 delete |
| close 后用旧 fd | generation 校验拒绝 | close 后置 XT_VFS_INVALID_FD |
| 挂载点不以 / 开头 | 路由失败 | prefix 必须以 / 开头 |
| rename 跨后端 | 返回错误 | rename 仅在同挂载点内使用 |
| 主循环中忘记调 fsync | 数据丢失风险 | 写操作后及时 fsync |
| 静态模式 max_* > 实际数组大小 | 越界 HardFault | init 时校验通过才返回 OK |
实现这 9 个函数即可让文件系统后端工作:
**关键约定**:
测试套件位于 tests/xt_vfs/。
多配置自动化测试: