LSFS 文件系统操作示例

功能说明

演示 LSFS (LiSa File System) 文件系统的基本操作,包括挂载 SD 卡、文件读写、目录遍历等核心功能。

LSFS 是 ARCS SDK 提供的轻量级文件系统抽象层,支持多种文件系统类型(FatFS 等)和存储介质(SD 卡、Flash、RAM Disk)。本示例展示如何在 SD 卡上使用 FatFS 文件系统进行基本的文件操作。

硬件连接

  • SDMMC0 接口:连接 SD 卡模块

    • 具体引脚定义参见板级配置文件

示例步骤

  1. 初始化 SD 卡和磁盘子系统

  2. 初始化 LSFS 框架

  3. 挂载 SD 卡文件系统(挂载失败时自动格式化)

  4. 写入测试文件(/SD:/sdmmc.txt

  5. 读取文件内容并验证

  6. 遍历根目录,列出所有文件和目录

  7. 卸载文件系统

编译

重要提示:在编译前,请先确认您使用的开发板型号。SDK 目前支持以下开发板:

  • arcs_evb - ARCS EVB 评估板

  • arcs_mini - ARCS Mini 开发板

根据您的开发板型号,选择对应的编译命令:

在示例目录下执行编译:

# 使用 arcs_evb 开发板
./build.sh -C -DBOARD=arcs_evb

# 或使用 arcs_mini 开发板
./build.sh -C -DBOARD=arcs_mini

Note

如果在 SDK 根目录执行,需要指定示例路径:

# 使用 arcs_evb 开发板
./build.sh -C -S samples/<示例路径> -DBOARD=arcs_evb

# 或使用 arcs_mini 开发板
./build.sh -C -S samples/<示例路径> -DBOARD=arcs_mini

Note

确保已安装对应的工具链。

烧录

编译完成后,使用 SDK tools 目录下的 cskburn 工具烧录固件:

./tools/burn/cskburn -s /dev/ttyUSB0 -b 3000000 0x0 build/arcs.bin -C arcs

Note

烧录参数说明

  • -s /dev/ttyUSB0:串口设备路径,需要根据实际情况修改 - Linux 系统:通常是 /dev/ttyUSB0/dev/ttyACM0 - 可通过 ls /dev/tty* 命令查看可用串口设备 - 不同开发板或 USB 转串口芯片可能使用不同的设备名

  • -b 3000000:烧录波特率(3Mbps)

  • 0x0:烧录起始地址

  • build/arcs.bin:编译生成的固件路径

  • -C arcs:芯片类型

注意事项

  • 确保开发板已正确连接到电脑

  • 如果无法识别串口设备,请检查 USB 连接线是否正常,或尝试其他 USB 端口

预期输出

终端输出:

=== LSFS Sample ===

Mounted /SD: successfully

Write 12 bytes to /SD:/test.txt
Read 12 bytes: Hello, LSFS!

Listing directory: /SD:/
          12  test.txt

Unmounted /SD:

核心 API

API

说明

lisa_sdmmc_probe()

初始化 SD 卡设备

disk_init()

初始化磁盘子系统

lsfs_init()

初始化 LSFS 框架

lsfs_mount()

挂载文件系统到指定挂载点

lsfs_mkfs()

格式化文件系统

lsfs_open()

打开或创建文件

lsfs_write()

写入数据到文件

lsfs_read()

从文件读取数据

lsfs_close()

关闭文件

lsfs_opendir()

打开目录

lsfs_readdir()

读取目录项

lsfs_closedir()

关闭目录

lsfs_unmount()

卸载文件系统

文件操作说明

打开模式标志

LSFS_O_READ      // 只读模式
LSFS_O_WRITE     // 只写模式
LSFS_O_RDWR      // 读写模式
LSFS_O_CREATE    // 文件不存在则创建
LSFS_O_APPEND    // 追加模式
LSFS_O_TRUNC     // 打开时清空文件

错误处理

  • 挂载失败处理:示例中实现了自动格式化机制,当挂载失败时尝试格式化后重新挂载

  • 返回值规则

    • 成功:返回 0 或正数(read/write 返回字节数)

    • 失败:返回负的 errno 值(如 -EINVAL, -ENOENT

关键代码

挂载点定义

#define SDMMC_DEVICE      "SD:"
#define SDMMC_MOUNT_POINT "/SD:"

static struct lsfs_mount_t sdmmc_lsfs_mnt = {
    .type = LSFS_FATFS,           // 使用 FatFS 文件系统
    .mnt_point = "/SD:",          // 挂载点路径
    .fs_data = NULL,              // 文件系统私有数据
};

挂载流程(含自动格式化)

int ret = lsfs_mount(&sdmmc_lsfs_mnt);
if (ret != 0) {
    // 挂载失败,尝试格式化
    ret = lsfs_mkfs(LSFS_FATFS, "SD:", NULL, 0);
    if (ret == 0) {
        ret = lsfs_mount(&sdmmc_lsfs_mnt);  // 重新挂载
    }
}

文件读写操作

struct lsfs_file_t file;

// 初始化文件对象
lsfs_file_t_init(&file);

// 写入文件
lsfs_open(&file, "/SD:/sdmmc.txt", LSFS_O_CREATE | LSFS_O_TRUNC | LSFS_O_WRITE);
lsfs_write(&file, data, strlen(data));
lsfs_close(&file);

// 读取文件
lsfs_file_t_init(&file);
lsfs_open(&file, "/SD:/sdmmc.txt", LSFS_O_READ);
lsfs_read(&file, buffer, sizeof(buffer) - 1);
lsfs_close(&file);

目录遍历

struct lsfs_dir_t dir;
struct lsfs_dirent entry;

lsfs_dir_t_init(&dir);
lsfs_opendir(&dir, "/SD:/");

while (1) {
    ret = lsfs_readdir(&dir, &entry);
    if (ret != 0 || entry.name[0] == 0)
        break;  // 遍历结束

    if (entry.type == LSFS_DIR_ENTRY_DIR) {
        // 目录
    } else {
        // 文件
        printf("%10lu %s\n", entry.size, entry.name);
    }
}
lsfs_closedir(&dir);

配置说明

必需的配置项(prj.conf)

CONFIG_FILE_SYSTEM=y          # 使能文件系统支持
CONFIG_FATFS_FILESYSTEM=y     # 使能 FatFS 文件系统
CONFIG_DISK_DRIVER=y          # 使能磁盘驱动
CONFIG_DISK_DRIVER_SDMMC=y    # 使能 SD/MMC 磁盘驱动
CONFIG_LSFS=y                 # 使能 LSFS 抽象层
CONFIG_LSFS_FAT=y             # 使能 LSFS 的 FatFS 支持

注意事项

  1. 初始化顺序:必须按照以下顺序初始化

    • 先调用 lisa_sdmmc_probe() 初始化 SD 卡设备

    • 再调用 disk_init() 初始化磁盘子系统

    • 然后调用 lsfs_init() 初始化 LSFS 框架

    • 最后调用 lsfs_mount() 挂载文件系统

  2. 文件对象初始化:每次使用前必须调用 lsfs_file_t_init()lsfs_dir_t_init() 初始化对象

  3. 挂载点命名规则

    • 必须以 / 开头

    • 通常以 : 结尾(如 /SD:

    • 完整文件路径格式:/SD:/dir/file.txt

  4. 及时关闭文件:使用完文件或目录后立即调用 lsfs_close()lsfs_closedir() 释放资源

  5. 线程安全:LSFS API 是线程安全的,但同一个文件对象不应在多线程间共享

扩展功能

LSFS 支持更多高级功能,详见组件文档 modules/fs/README.md

  • 多存储介质:同时挂载 RAM Disk、Flash Disk、SD Card

  • POSIX 兼容接口:通过 LVFS 层使用标准 POSIX API(open, read, write 等)

  • 目录操作:创建目录(lsfs_mkdir)、删除(lsfs_unlink)、重命名(lsfs_rename

  • 文件定位lsfs_seek, lsfs_tell, lsfs_truncate

  • 文件系统信息:查询文件信息(lsfs_stat)和磁盘空间(lsfs_statvfs

  • 系统掉电保护:LSFS 冻结功能(lsfs_freeze_freeze