概述

  • Flash 转换层(Flash Translation Layer,FTL)是专为 BT 设计的系统软件层,其目的是使 Flash 更易于作为数据存储介质使用。

  • NOR Flash 的读/写操作以页为单位,但擦除操作必须以块为单位,且在写入前需先擦除目标块。由于擦除操作与读/写操作的内存范围大小不同,会导致 Flash 存储系统的整体性能显著下降。

  • FTL 通过维护一个逻辑地址到物理地址的映射表,将上层文件系统的逻辑地址请求转换为 Flash 存储器的物理地址请求,这不仅能够提高 Flash 存储器的读写性能,还能通过磨损均衡策略延长 Flash 存储器的使用寿命。

Flash 存储系统的架构如下图所示:

../../rst_rtos/0_ftl/figures/architecture_of_flash_memory_system.svg

FTL 算法提供以下核心功能:

  • 逻辑地址到物理地址的映射。

  • 掉电恢复:即使在 FTL 操作过程中发生意外断电,FTL 的数据结构也应保持完整,并确保数据一致性。

  • 磨损均衡:尽可能均匀地分配各存储块的擦写次数。

如下图所示,当向逻辑映射写入数据时,FTL 会生成特定格式的数据包并存储到 Flash 中。

  • 修改逻辑映射数据时,会生成新数据包并追加到物理映射末尾。当物理页接近写满时,触发垃圾回收以回收旧页(随后擦除)。

  • 从逻辑映射读取数据时,FTL 会搜索物理映射以找到包含指定地址的最新数据包。

../../rst_rtos/0_ftl/figures/ftl_overview.svg

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 字节

配置方法

  1. 打开 BT 时,会自动打开 FTL,请参考 BT 应用文档。

  2. FTL 的地址范围在 ameba_flashcfg.c 文件中定义。

    逻辑映射与物理映射的默认配置如下:

    • 物理地址为:0x08620000~ 0x08622FFF

    • 逻辑映射大小:4084 字节