概述
Flash 转换层(Flash Translation Layer,FTL)是专为 BT 设计的系统软件层,其目的是使 Flash 更易于作为数据存储介质使用。
NOR Flash 的读/写操作以页为单位,但擦除操作必须以块为单位,且在写入前需先擦除目标块。由于擦除操作与读/写操作的内存范围大小不同,会导致 Flash 存储系统的整体性能显著下降。
FTL 通过维护一个逻辑地址到物理地址的映射表,将上层文件系统的逻辑地址请求转换为 Flash 存储器的物理地址请求,这不仅能够提高 Flash 存储器的读写性能,还能通过磨损均衡策略延长 Flash 存储器的使用寿命。
Flash 存储系统的架构如下图所示:
FTL 算法提供以下核心功能:
逻辑地址到物理地址的映射。
掉电恢复:即使在 FTL 操作过程中发生意外断电,FTL 的数据结构也应保持完整,并确保数据一致性。
磨损均衡:尽可能均匀地分配各存储块的擦写次数。
如下图所示,当向逻辑映射写入数据时,FTL 会生成特定格式的数据包并存储到 Flash 中。
修改逻辑映射数据时,会生成新数据包并追加到物理映射末尾。当物理页接近写满时,触发垃圾回收以回收旧页(随后擦除)。
从逻辑映射读取数据时,FTL 会搜索物理映射以找到包含指定地址的最新数据包。
FTL 工作原理
备注
使用 FTL 时,用户无须关注物理映射,其维护由 FTL 自动完成。
特性
物理映射
物理页大小:4096 字节
物理页数量可配置
物理映射总大小:4096 × 物理页数量
逻辑映射
逻辑映射的最大容量由物理映射大小决定,计算公式为:\([511 \times (\rm physical\_page\_number -1)-1] \times 4\)
FTL 的用法
使用须知
对于典型的 BLE 应用
蓝牙 Host 协议栈默认使用 344 字节 FTL。SDK 默认维护 4 条 BLE 连接信息,每条连接需要 216 字节 FTL,BLE 连接数量可以通过 RTK_BLE_GAP_MAX_LINKS 设置。
对于典型的 BLE Mesh 应用
BLE Mesh 应用需要在以上蓝牙 Host 协议栈和 BLE 连接信息使用的 FTL 基础上,继续计算 Mesh 应用使用的 FTL。
如果是 Mesh device, Mesh 协议栈默认使用 1752 字节 FTL。SDK 默认维护包含 20 个节点的 Mesh 网络信息,网络中每增加一个节点,需要增加一个 RPL 数量(使用 16 字节 FTL),RPL 数量可以通过 bt_mesh_rpl_num 设置。
如果是 Mesh provisioner,Mesh 协议栈默认使用 1280 字节 FTL。SDK 默认 Provisioner 可以给 20 个节点配网,每增加一个可配网节点数量,需要同时增加一个 Device key 数量(使用 20 字节 FTL)和一个 RPL 数量(使用 16 字节 FTL),Device key 数量可以通过 bt_mesh_dev_key_num 设置,RPL 数量可以通过 bt_mesh_rpl_num 设置。
无论是 Mesh device 还是 Mesh Provisioner,Mesh 应用默认使用 3000 字节 FTL。如果根据节点数量计算出的 FTL 大于 3000 字节,需要额外通过 bt_mesh_flash_size 设置 Mesh 应用使用的 FTL 大小。
示例
下表列出了三种典型的 BLE 应用场景和所需的 FTL 大小,请根据推荐合理配置 FTL 物理地址。
场景 |
计算 |
FTL 大小 |
---|---|---|
3 条 BLE 连接, 不使用 Mesh |
344 + 216 * 3 = 992 |
992 字节 |
4 条 BLE 连接, Mesh device(Mesh 网络中包含 50 个节点) |
因为 1752 + 16 * 50 <= 3000, 344 + 216 * 4 + 3000 = 4208 |
4208 字节 |
5 条 BLE 连接, Mesh provisioner(可以给 50 个节点配网) |
因为 1280 + (20 + 16) * 50 > 3000, 344 + 216 * 5 + 1280 + (20 + 16) * 50 = 4504 |
4504 字节 |
配置方法
打开 BT 时,会自动打开 FTL,请参考 BT 应用文档。
FTL 的地址范围在
ameba_flashcfg.c
文件中定义。逻辑映射与物理映射的默认配置如下:
物理地址为:
0x08620000~ 0x08622FFF
逻辑映射大小:4084 字节