返回造物工坊

工具

LittleFS Test

LittleFS 文件系统自动化测试:7 个测试用例覆盖掉电安全、磨损均衡等特性。

海海星社区Apache-2.0

项目介绍

概述

本示例展示如何在WS63开发板上使用LittleFS文件系统。LittleFS是一个专为嵌入式系统设计的轻量级文件系统,具有掉电安全、磨损均衡等特性。

本demo通过 7 个自动化测试用例 全面验证 LittleFS 文件系统的各项功能。

食用方法1.

如果不想自己操作这么多步骤,可以从GitCode上拉取我修改好的SDK。

GitCode仓库链接:https://gitcode.com/hinearlink/fbb_ws63

食用方法2.

你可以更直接,下载我编译好的固件直接烧录使用。

站内固件链接:https://hinearlink.com/firmware/littlefs-test

食用方法3.

  • 将little_lfs.patch复制到fbb_ws63根目录,执行git apply little_lfs.patch
  • 把littlefs_test和littlefs_shell两个sample复制到fbb_ws63\src\application\samples\peripheral
  • 编译、烧录

食用方法4.

按照下方【SDK 配置说明】自己动手操作。


SDK 配置说明

重要提示

如果你的 SDK 是全新的或者从未配置过 LittleFS,需要进行以下配置才能正常编译和运行本 demo。

步骤 0:复制 Demo 代码到 SDK

将 littlefs_test 文件夹复制到 SDK 的 application/samples/peripheral/ 目录下:

application/samples/peripheral/
├── littlefs_test/           <-- 复制到这里
│   ├── littlefs_test.c
│   ├── CMakeLists.txt
│   ├── Kconfig
│   └── README.md
├── gpio/
├── i2c/
├── ...

注意:确保 littlefs_test 文件夹包含以下文件:

  • CMakeLists.txt - 编译配置
  • Kconfig - menuconfig 配置选项
  • littlefs_test.c - 测试源代码

步骤 1:添加案例配置文件

需要在 application/samples/peripheral/ 目录下的 Kconfig 和 CMakeLists.txt 中注册本 Demo。

1.1 修改 Kconfig

编辑 application/samples/peripheral/Kconfig,在文件末尾(最后一个 endif 之前)添加:

config SAMPLE_SUPPORT_LITTLEFS_TEST
    bool
    prompt "Support LittleFS Test Demo (Automatic Test)."
    default n
    depends on ENABLE_PERIPHERAL_SAMPLE
    select MIDDLEWARE_SUPPORT_LFS
    help
        This option means support LittleFS Test Demo.
        This demo runs 7 automatic test cases to verify LittleFS functionality.

1.2 修改 CMakeLists.txt

编辑 application/samples/peripheral/CMakeLists.txt,在 set(SOURCES "${SOURCES}" PARENT_SCOPE) 之前添加:

if(DEFINED CONFIG_SAMPLE_SUPPORT_LITTLEFS_TEST)
    add_subdirectory_if_exist(littlefs_test)
endif()

注意:文件末尾如有 set(PUBLIC_HEADER "${PUBLIC_HEADER}" PARENT_SCOPE) 则忽略,如果没有则添加。

步骤 2:注册 LittleFS 组件到编译系统

编辑 build/config/target_config/ws63/config.py,在 ws63-liteos-app 的 ram_component 列表中添加 LittleFS 相关组件:

找到 'ws63-liteos-app' 配置段,在 'ram_component' 列表中添加:

'ram_component': [
    # ... 其他组件 ...
    "mqtt",
    "little_fs",              # 添加这一行:LittleFS 源码库
    "littlefs_adapt_ws63"     # 添加这一行:LittleFS 适配层
],

说明:

  • "little_fs" - LittleFS 源码库组件,提供文件系统核心功能
  • "littlefs_adapt_ws63" - WS63 平台适配层,提供 Flash 读写接口

为什么需要这一步?

  • 如果只添加 littlefs_adapt_ws63 而不添加 little_fs,会出现链接错误:undefined reference to 'lfs_mount' 等
  • 这两个组件必须同时添加才能正常工作

步骤 3:关闭系统周期打印(推荐)

系统默认会周期性打印内存信息,会干扰测试输出的观察。建议注释掉 application/ws63/ws63_liteos_application/main.c 第 256-258 行:

// 注释以下三行以关闭周期性系统信息打印
//PRINT("[SYS INFO] mem: used:%u, free:%u; log: drop/all[%u/%u], at_recv %u.\r\n", status.uwTotalUsedSize,
//    status.uwTotalFreeSize, log_get_missed_messages_count(), log_get_all_messages_count(),
//    at_uart_get_rcv_cnt());

步骤 4:在 menuconfig 中启用 LittleFS 文件系统

使用 menuconfig 配置:

python build.py ws63-liteos-app menuconfig

配置路径:

Middleware Configuration
  └─> File System Configuration
      └─> [*] Support LITTLE_FS

说明:这一步启用 LittleFS 文件系统的核心功能,是运行本 Demo 的前提条件。

步骤 5:启用 Demo

继续在 menuconfig 中配置:

配置路径:

Application Configuration
  └─> Peripheral Sample Configuration
      └─> [*] Support LittleFS Test Demo (Automatic Test).

步骤 6:编译

python build.py ws63-liteos-app

常见编译错误及解决方法

错误 1:fatal error: lfs.h: No such file or directory

原因:LittleFS 源码库组件未添加到编译系统

解决:检查 build/config/target_config/ws63/config.py,确保 "little_fs" 已添加到 ram_component 列表

错误 2:undefined reference to 'lfs_mount' 等链接错误

原因:只添加了 littlefs_adapt_ws63 适配层,但没有添加 little_fs 源码库

解决:在 build/config/target_config/ws63/config.py 的 ram_component 列表中同时添加:

"little_fs",
"littlefs_adapt_ws63"

Demo 测试内容

测试 1:基础文件操作 (littlefs_basic_test)

测试目的:验证文件的创建、写入、读取和状态查询功能

操作步骤:

  1. 创建文件 /test_file.txt(使用 O_RDWR | O_CREAT | O_TRUNC 标志)
  2. 写入字符串 "Hello LittleFS on WS63!"(23字节)
  3. 关闭文件
  4. 重新打开文件(只读模式 O_RDONLY)
  5. 读取文件内容到缓冲区
  6. 关闭文件
  7. 使用 fs_adapt_stat() 获取文件大小信息

验证点:

  • 文件创建成功
  • 写入的字节数正确(23字节)
  • 读取的内容与写入的内容一致
  • 文件大小为 23 字节

测试 2:目录操作 (littlefs_directory_test)

测试目的:验证目录创建和在目录中创建文件的功能

操作步骤:

  1. 创建目录 /test_dir
  2. 在目录中创建文件 /test_dir/data.bin
  3. 写入字符串 "File in directory"(17字节)
  4. 关闭文件

验证点:

  • 目录创建成功
  • 可以在目录中创建文件
  • 文件路径包含目录结构

测试 3:文件指针操作 (littlefs_seek_test)

测试目的:验证文件指针的定位和移动功能

操作步骤:

  1. 创建文件 /seek_test.txt
  2. 写入字符串 "0123456789ABCDEFGHIJ"(20字节)
  3. 测试 SEEK_SET(从开头定位):
    • 移动到文件开头(offset=0)
    • 读取 5 字节,应得到 "01234"
  4. 测试 SEEK_SET(从指定位置定位):
    • 移动到偏移 10 的位置
    • 读取 5 字节,应得到 "ABCDE"
  5. 测试 SEEK_END(从末尾定位):
    • 从文件末尾向前移动 5 字节(offset=-5)
    • 读取 5 字节,应得到 "FGHIJ"
  6. 关闭文件

验证点:

  • SEEK_SET 可以定位到文件开头
  • SEEK_SET 可以定位到文件中间任意位置
  • SEEK_END 可以从文件末尾反向定位
  • 读取的内容与预期位置的内容一致

测试 4:追加操作 (littlefs_append_test)

测试目的:验证文件追加写入功能

操作步骤:

  1. 创建文件 /append_test.txt
  2. 写入初始数据 "Line 1\n"(7字节)
  3. 关闭文件
  4. 以追加模式重新打开文件(O_RDWR | O_APPEND)
  5. 追加写入 "Line 2\n"(7字节)
  6. 关闭文件
  7. 重新打开文件并读取完整内容
  8. 关闭文件

验证点:

  • 追加模式不会覆盖原有内容
  • 新数据被添加到文件末尾
  • 读取的完整内容为 "Line 1\nLine 2\n"(14字节)

测试 5:二进制数据操作 (littlefs_binary_test)

测试目的:验证二进制数据的读写功能

操作步骤:

  1. 创建文件 /binary_test.bin
  2. 准备二进制数据:字节数组 [0x00, 0x01, 0x02, ..., 0x0F](16字节)
  3. 写入二进制数据
  4. 关闭文件
  5. 重新打开文件
  6. 读取二进制数据到新缓冲区
  7. 逐字节比较写入和读取的数据
  8. 关闭文件

验证点:

  • 二进制数据可以正确写入
  • 读取的二进制数据与写入的完全一致
  • 每个字节的值都匹配(0x00 到 0x0F)

测试 6:删除操作 (littlefs_delete_test)

测试目的:验证文件删除功能

操作步骤:

  1. 创建文件 /delete_test.txt
  2. 写入字符串 "This file will be deleted"(25字节)
  3. 关闭文件
  4. 使用 fs_adapt_stat() 验证文件存在,大小为 25 字节
  5. 使用 fs_adapt_delete() 删除文件
  6. 再次使用 fs_adapt_stat() 验证文件不存在(返回错误)

验证点:

  • 文件创建后可以查询到
  • 删除操作返回成功
  • 删除后文件不存在(stat 返回 -2 错误码,表示文件不存在)

注意:日志中的 LFS [E]:lfs_stat failed, ret = -2 是正常现象,表示文件已被成功删除。


测试 7:启动计数器 (littlefs_boot_count_test)

测试目的:验证持久化存储功能(数据在重启后保留)

操作步骤:

  1. 打开或创建文件 /boot_count.dat(O_RDWR | O_CREAT)
  2. 读取当前启动次数(uint32_t 类型,4字节)
    • 如果是首次运行,读取失败,初始化为 0
    • 如果不是首次,读取到上次保存的值
  3. 将启动次数加 1
  4. 移动文件指针到开头(SEEK_SET)
  5. 写入新的启动次数
  6. 关闭文件(数据持久化到 Flash)

验证点:

  • 首次运行时启动次数为 0
  • 每次运行启动次数递增 1
  • 重启后数据保留(下次运行会读取到上次的值+1)
  • 演示了 LittleFS 的掉电安全特性

测试执行流程

Demo 启动后按以下顺序执行:

1. 挂载 LittleFS 文件系统
2. 执行测试 1:基础文件操作
3. 等待 2 秒
4. 执行测试 2:目录操作
5. 等待 2 秒
6. 执行测试 3:文件指针操作
7. 等待 2 秒
8. 执行测试 4:追加操作
9. 等待 2 秒
10. 执行测试 5:二进制数据操作
11. 等待 2 秒
12. 执行测试 6:删除操作
13. 等待 2 秒
14. 执行测试 7:启动计数器
15. 清理测试文件(保留 boot_count.dat)
16. 卸载 LittleFS 文件系统

每个测试之间有 2 秒间隔,方便观察串口输出。

清理说明:

  • 测试完成后会自动删除所有测试文件和目录
  • 保留 /boot_count.dat 文件,用于演示持久化存储功能
  • 下次运行时,启动计数器会继续递增,证明数据在重启后保留

运行效果

编译烧录后,串口输出如下:

========================================
  LittleFS File System Test for WS63
========================================

[Init] Mounting LittleFS...
[Init] LittleFS mounted successfully

========================================
LittleFS Basic Test
========================================

[Test 1] Create and write file
[Write] 23 bytes: Hello LittleFS on WS63!

[Test 2] Read file
[Read] 23 bytes: Hello LittleFS on WS63!

[Test 3] Get file info
[Stat] File size: 23 bytes

========================================
LittleFS Directory Test
========================================

[Test 1] Create directory
[Mkdir] Directory created: /test_dir

[Test 2] Create file in directory
[Write] 17 bytes to /test_dir/data.bin

========================================
LittleFS Seek Test
========================================

[Test 1] Write data
[Write] 20 bytes: 0123456789ABCDEFGHIJ

[Test 2] Seek to start and read
[Read] 5 bytes from start: 01234

[Test 3] Seek to middle and read
[Read] 5 bytes from offset 10: ABCDE

[Test 4] Seek from end and read
[Read] 5 bytes from end: FGHIJ

========================================
LittleFS Append Test
========================================

[Test 1] Create file with initial data
[Write] 7 bytes: Line 1

[Test 2] Append data
[Append] 7 bytes: Line 2

[Test 3] Read complete file
[Read] 14 bytes:
Line 1
Line 2

========================================
LittleFS Binary Data Test
========================================

[Test 1] Write binary data
[Write] 16 bytes of binary data

[Test 2] Read binary data
[Read] 16 bytes: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 

[Test 3] Verify data
[Verify] Data MATCH

========================================
LittleFS Delete Test
========================================

[Test 1] Create file
[Create] File created: /delete_test.txt

[Test 2] Verify file exists
[Stat] File exists, size: 25 bytes

[Test 3] Delete file
[Delete] File deleted successfully

[Test 4] Verify file deleted
[Stat] File does not exist (deleted successfully)

========================================
LittleFS Boot Count Test
========================================

[Test 1] Read boot count
[Read] Current boot count: 0

[Test 2] Update boot count
[Update] New boot count: 1

[Test 3] Write boot count
[Write] Boot count saved successfully

========================================
  All LittleFS Tests Completed!
========================================

[Cleanup] Removing test files...
[Cleanup] Test files removed (boot_count.dat kept for persistence demo)
[Cleanup] Unmounting LittleFS...
[Cleanup] LittleFS unmounted

注意:测试完成后会自动清理测试文件,只保留 boot_count.dat 用于演示持久化存储。


相关文档


作者: GaoXiaolong

邮箱: gaoxiaolon@gmail.com

日期: 2025.12.12

评论

0 条评论

还没有评论,来说两句。