项目介绍
概述
本示例展示如何在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)
测试目的:验证文件的创建、写入、读取和状态查询功能
操作步骤:
- 创建文件
/test_file.txt(使用O_RDWR | O_CREAT | O_TRUNC标志) - 写入字符串 "Hello LittleFS on WS63!"(23字节)
- 关闭文件
- 重新打开文件(只读模式
O_RDONLY) - 读取文件内容到缓冲区
- 关闭文件
- 使用
fs_adapt_stat()获取文件大小信息
验证点:
- 文件创建成功
- 写入的字节数正确(23字节)
- 读取的内容与写入的内容一致
- 文件大小为 23 字节
测试 2:目录操作 (littlefs_directory_test)
测试目的:验证目录创建和在目录中创建文件的功能
操作步骤:
- 创建目录
/test_dir - 在目录中创建文件
/test_dir/data.bin - 写入字符串 "File in directory"(17字节)
- 关闭文件
验证点:
- 目录创建成功
- 可以在目录中创建文件
- 文件路径包含目录结构
测试 3:文件指针操作 (littlefs_seek_test)
测试目的:验证文件指针的定位和移动功能
操作步骤:
- 创建文件
/seek_test.txt - 写入字符串 "0123456789ABCDEFGHIJ"(20字节)
- 测试 SEEK_SET(从开头定位):
- 移动到文件开头(offset=0)
- 读取 5 字节,应得到 "01234"
- 测试 SEEK_SET(从指定位置定位):
- 移动到偏移 10 的位置
- 读取 5 字节,应得到 "ABCDE"
- 测试 SEEK_END(从末尾定位):
- 从文件末尾向前移动 5 字节(offset=-5)
- 读取 5 字节,应得到 "FGHIJ"
- 关闭文件
验证点:
- SEEK_SET 可以定位到文件开头
- SEEK_SET 可以定位到文件中间任意位置
- SEEK_END 可以从文件末尾反向定位
- 读取的内容与预期位置的内容一致
测试 4:追加操作 (littlefs_append_test)
测试目的:验证文件追加写入功能
操作步骤:
- 创建文件
/append_test.txt - 写入初始数据 "Line 1\n"(7字节)
- 关闭文件
- 以追加模式重新打开文件(
O_RDWR | O_APPEND) - 追加写入 "Line 2\n"(7字节)
- 关闭文件
- 重新打开文件并读取完整内容
- 关闭文件
验证点:
- 追加模式不会覆盖原有内容
- 新数据被添加到文件末尾
- 读取的完整内容为 "Line 1\nLine 2\n"(14字节)
测试 5:二进制数据操作 (littlefs_binary_test)
测试目的:验证二进制数据的读写功能
操作步骤:
- 创建文件
/binary_test.bin - 准备二进制数据:字节数组 [0x00, 0x01, 0x02, ..., 0x0F](16字节)
- 写入二进制数据
- 关闭文件
- 重新打开文件
- 读取二进制数据到新缓冲区
- 逐字节比较写入和读取的数据
- 关闭文件
验证点:
- 二进制数据可以正确写入
- 读取的二进制数据与写入的完全一致
- 每个字节的值都匹配(0x00 到 0x0F)
测试 6:删除操作 (littlefs_delete_test)
测试目的:验证文件删除功能
操作步骤:
- 创建文件
/delete_test.txt - 写入字符串 "This file will be deleted"(25字节)
- 关闭文件
- 使用
fs_adapt_stat()验证文件存在,大小为 25 字节 - 使用
fs_adapt_delete()删除文件 - 再次使用
fs_adapt_stat()验证文件不存在(返回错误)
验证点:
- 文件创建后可以查询到
- 删除操作返回成功
- 删除后文件不存在(stat 返回 -2 错误码,表示文件不存在)
注意:日志中的 LFS [E]:lfs_stat failed, ret = -2 是正常现象,表示文件已被成功删除。
测试 7:启动计数器 (littlefs_boot_count_test)
测试目的:验证持久化存储功能(数据在重启后保留)
操作步骤:
- 打开或创建文件
/boot_count.dat(O_RDWR | O_CREAT) - 读取当前启动次数(uint32_t 类型,4字节)
- 如果是首次运行,读取失败,初始化为 0
- 如果不是首次,读取到上次保存的值
- 将启动次数加 1
- 移动文件指针到开头(
SEEK_SET) - 写入新的启动次数
- 关闭文件(数据持久化到 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 用于演示持久化存储。
相关文档
- LittleFS官方文档:https://docs.hisilicon.com/repos/fbb_ws63/zh-CN/master/software/%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%20%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/index.html
- WS63 Flash分区配置
- WS63 SFC驱动文档
作者: GaoXiaolong
日期: 2025.12.12
评论
0 条评论还没有评论,来说两句。
