支持的 IC

Ameba SoC

RTL8721Dx

RTL8726E

RTL8720E

RTL8730E

支持状态

N

N

N

Y

概述

NOR Flash 由多个块(Block)组成,每个块包含多个页(Page),而页则由独立的数据单元(Cell)构成。

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

为此,特定引入一种称为 FTL(Flash Translation Layer) 的系统软件层,其目的是使 Flash 更易于作为数据存储介质使用。

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

../../_images/architecture_of_flash_memory_system.svg

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

  • 逻辑地址到物理地址的映射:将文件系统的逻辑地址转换为 Flash 的物理地址。

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

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

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

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

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

../../_images/ftl_overview.svg

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

  • 建议预留部分内存供系统扩展

  • 推荐值已为系统和应用预留缓冲空间

  • 这两种场景下,3个物理页即可满足需求

5 个连接
应用占用 2KB FTL 空间

总共需要 (5*256 + 2048) 字节 (< 4084 字节)

1280 ~ 2036

1600

5 个连接
少于 60 个 Mesh 节点
应用占用 6KB FTL 空间

总共需要 ((5*256 + 20*60) + 6144) 字节

  • 不建议在 FTL 中存储过多信息

  • 建议采用其他方案(如DCT)替代

使用步骤

  1. 如果启用了蓝牙,则在 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
    
  2. FTL 的地址范围在 ameba_flashcfg.c 文件中定义。

    Flash_Layout_Nor
    Flash_Layout_Nor_Linux
    

    备注

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

    • 为物理映射分配了三个页面: 0x08620000~ 0x08622FFF

    • 逻辑映射大小:4084 字节

  3. 调用 ftl_load_from_storage()/ ftl_save_to_storage() 函数来读取/写入逻辑映射。