LittleFS是一个小型的Flash文件系统,它结合日志结构(log-structured)文件系统和COW(copy-on-write)文件系统的思想,以日志结构存储元数据,以COW结构存储数据。这种特殊的存储方式,使LittleFS具有强大的掉电恢复能力(power-loss resilience)。分配COW数据块时LittleFS采用了名为统计损耗均衡的动态损耗均衡算法,使Flash设备的寿命得到有效保障。同时LittleFS针对资源紧缺的小型设备进行设计,具有极其有限的ROM和RAM占用,并且所有RAM的使用都通过一个可配置的固定大小缓冲区进行分配,不会随文件系统的扩大占据更多的系统资源。当在一个资源非常紧缺的小型设备上,寻找一个具有掉电恢复能力并支持损耗均衡的Flash文件系统时,LittleFS是一个比较好的选择。
LittleFS移植过程
本文基于OpenHarmony3.1
release做LittleFS移植,小凌派-
RK2206开发板内部Flash有8MB大小,其中4~8MB区间为空闲区域。我将4M~5M作为LittleFS文件系统的/data目录挂载硬件设备。具体移植过程主要如下所示:
1、hcs配置
1.1、hdf.hcs
创建/device/soc/rockchip/rk2206/hcs_config/hdf.hcs文件,具体如下:
#include "device_info/device_info.hcs"
#include "fs/fs_config.hcs"
#include "gpio/gpio_config.hcs"
#include "i2c/i2c_config.hcs"
#include "spi/spi_config.hcs"
root {
module = "rockchip,rk2206_chip";
}
如上所述,我将在device_info/device_info.hcs添加LittleFS设备,并在fs/fs_config.hcs添加LittleFS具体信息。
1.2、BUILD.gn
新建//device/soc/rockchip/rk2206/hdf_config/BUILD.gn,具体代码如下所示:
import("//drivers/adapter/khdf/
LiteOS_m/hdf.gni")
module_switch = defined(LOSCFG_DRIVERS_HDF)
module_name = get_path_info(rebase_path("."), "name")
hdf_driver(module_name) {
hcs_sources = [ "hdf.hcs" ]
}
上述代码将在编译OpenHarmony3.1Rlease时,将编译hdf.hcs。
1.3、device_info.hcs
创建/device/soc/rockchip/rk2206/hcs_config/device_info/device_info.hcs文件,在文件中添加LittleFS设备,具体代码如下所示:
device_fs :: device {
device0 :: deviceNode {
policy = 0;
priority = 5;
permission = 0777;
moduleName = "HDF_PLATFORM_FS_LITTLEFS";
serviceName = "littlefs_config";
deviceMatchAttr = "rockchip_rk2206_fs_littlefs";
}
}
上述代码表示建设一个设备驱动,该驱动的模块名称(即moduleName)为“HDF_PLATFORM_FS_LITTLEFS”,OpenH
AMRony系统依据该名称匹配驱动程序;设备匹配信息(即deviceMatchAttr)添加小凌派开发板Flash特殊信息(比如:分区信息,挂载目录名、起始地址、结束地址等)。
1.4、fs_config.hcs
新建//device/soc/rockchip/rk2206/hdf_config/fs/fs_config.hcs文件,该文件主要写清楚设备挂载信息,具体如下:
root {
platform {
fs_config {
template fs_controller {
match_attr = "";
mount_points = [];
block_size = [];
block_start = [];
block_count = [];
}
fs_littefs :: fs_controller {
match_attr = "rockchip_rk2206_fs_littlefs";
mount_points = ["/data"];
block_size = [4096];
block_start = [1024];
block_count = [256];
}
}
}
}
......
更多详细内容请下载附件查看