支持的 IC
Ameba SoC |
RTL8721Dx |
RTL8726E |
RTL8720E |
RTL8730E |
---|---|---|---|---|
支持状态 |
N |
N |
N |
Y |
概述
NOR Flash 由多个块(Block)组成,每个块包含多个页(Page),而页则由独立的数据单元(Cell)构成。
Flash 的读/写操作以页为单位,但擦除操作必须以块为单位,且在写入前需先擦除目标块。由于擦除操作与读/写操作的内存范围大小不同,会导致 Flash 存储系统的整体性能显著下降。
为此,特定引入一种称为 FTL(Flash Translation Layer) 的系统软件层,其目的是使 Flash 更易于作为数据存储介质使用。
Flash 存储系统的架构如下图所示:
FTL 算法提供以下核心功能:
逻辑地址到物理地址的映射:将文件系统的逻辑地址转换为 Flash 的物理地址。
掉电恢复:即使在 FTL 操作过程中发生意外断电,FTL 的数据结构也应保持完整,并确保数据一致性。
磨损均衡:尽可能均匀地分配各存储块的擦写次数。
如下图所示,当向逻辑映射写入数据时,FTL 会生成特定格式的数据包并存储到 Flash 中。
修改逻辑映射数据时,会生成新数据包并追加到物理映射末尾。当物理页接近写满时,触发垃圾回收以回收旧页(随后擦除)。
从逻辑映射读取数据时,FTL 会搜索物理映射以找到包含指定地址的最新数据包。
FTL 工作原理
使用 FTL 时,用户无需关注物理映射,其维护由 FTL 自动完成。
特性
物理映射:
物理页大小:4096 字节
物理页数量可配置
物理映射总大小:4096 × 物理页数量
逻辑映射: 逻辑映射的最大容量由物理映射大小决定,计算公式为:\([511 \times (\rm physical\_page\_number -1)-1] \times 4\)
自动垃圾回收
异常掉电保护
FTL 的用法
使用说明
使用 FTL 前需了解以下注意事项:
理论上,逻辑映射区域可以扩展到64KB;但受限于实际物理空间,最大可用逻辑映射区域为 \([511 \times (\rm physical\_page\_number -1)-1] \times 4\)。
默认的物理页数量为3,不建议增加,因为FTL默认内部实现会分配一个缓冲区来缓存FTL的内容。
对于典型的BLE应用,每个连接大约需要256字节的FTL内存,SDK默认会维护3个连接的信息。
对于BLE Mesh应用,每个节点大约需要20字节的FTL内存。最大节点数量可以通过
dev_key_num
设置。
下表列出了三种典型的BLE应用场景的推荐设置。请根据实际情况,参考该表设置应用程序的适当偏移量。
场景 |
计算 |
应用起始地址 |
说明 |
|
---|---|---|---|---|
可配置范围 |
推荐值 |
|||
3 个连接
少于 50 个 Mesh 节点
应用占用 1KB FTL 空间
|
总共需要 ((3*256 + 20*50) + 1024) 字节
(< 4084 字节)
|
1768 ~ 3060 |
2500 |
|
5 个连接
应用占用 2KB FTL 空间
|
总共需要 (5*256 + 2048) 字节 (< 4084 字节) |
1280 ~ 2036 |
1600 |
|
5 个连接
少于 60 个 Mesh 节点
应用占用 6KB FTL 空间
|
总共需要 ((5*256 + 20*60) + 6144) 字节 |
|
使用步骤
如果启用了蓝牙,则在
platform_opts_bt.h
文件中定义了CONFIG_BT_EN
之后,CONFIG_FTL_ENABLED
会自动被定义。#if defined(CONFIG_BT) && CONFIG_BT #if (defined(CONFIG_BT_NP) && CONFIG_BT_NP) || (defined(CONFIG_BT_SINGLE_CORE) && CONFIG_BT_SINGLE_CORE) #define CONFIG_FTL_ENABLED 1 #endif #endif
FTL 的地址范围在
ameba_flashcfg.c
文件中定义。Flash_Layout_Nor Flash_Layout_Nor_Linux
备注
逻辑映射与物理映射的默认配置如下:
为物理映射分配了三个页面:
0x08620000~ 0x08622FFF
逻辑映射大小:4084 字节
调用
ftl_load_from_storage()
/ftl_save_to_storage()
函数来读取/写入逻辑映射。