Memory

本章主要介绍 RTL8752H 的内存系统。

Memory Map

RTL8752H 的内存系统是基于 Arm Cortex-M0+ 的内存映射架构设计的,主要由 ROM、RAM、Cache、Flash 和 eFuse 组成。其设计通过将 ARM 地址映射与 Realtek 定义的内存区域进行匹配,如图 RTL8752H 的内存映射 所示。

../../../_images/Memory_Mapping.png

RTL8752H 的内存映射

Realtek 定义的内存区域 详细情况如下。

Realtek 定义的内存区域

内存区域

地址空间

大小

ROM

[0x00000000, 0x00057FFF]

352 KB

Data RAM

[0x00200000, 0x00219FFF]

104 KB

Cache

[0x0021A000, 0x0021BFFF]

8 KB

Buffer RAM

[0x00280000, 0x00283FFF]

16 KB

SPIC Flash (Cacheable)

[0x00800000, 0x017FFFFF]

最大映射空间为 16 MB

SPIC Flash (Non-Cacheable)

[0x01800000, 0x027FFFFF]

最大映射空间为 16 MB

eFuse

/

1 KB

备注

  • RTL8752H 的 Cache 具有专用 RAM,并且这块 RAM 也可以被配置成通用 RAM 使用。详细介绍请参考 Cache

  • Flash 的大小以实际使用的料号为准。

ROM

RTL8752H 的 ROM 地址空间为 [0x00000000, 0x00057FFF],总大小是 352KB。

ROM 中固化了 Bootloader、BT Controller、Flash Driver 和 Power Manager 等程序。其中的一些模块(例如 Flash Driver)会以头文件和 ROM Symbol 的形式开放给开发者。使用 ROM 中的接口可以缩减应用程序的代码大小。

RAM

RTL8752H 的 RAM 分为以下两部分:

RTL8752H RAM

内存区域

地址空间

大小

内存用途

Data RAM

[0x00200000, 0x00219FFF]

104KB

用于存储数据、执行代码和 Heap 分配

Buffer RAM

[0x00280000, 0x00283FFF]

16KB

主要用于 Heap 分配,且 Realtek 蓝牙协议栈默认使用此 Heap

Data RAM

RTL8752H 的 Data RAM 默认被分成 6 块区域,其分布如下:

../../../_images/DATA_RAM_LAYOUT.png

Data RAM 布局

每块 RAM 区域都有特定的用途:

Data RAM 用途

内存区域

内存用途

大小是否可变

ROM Data

存放 ROM 代码中的全局变量和静态变量

Main Stack

用于启动过程和中断服务例程

Patch RAM

存放 Patch 代码的全局变量和静态变量,以及在 RAM 中执行的代码

BT Host RAM

存放 BT Host 代码的全局变量和静态变量,以及在 RAM 中执行的代码

APP RAM

存放 APP 的全局变量和静态变量,以及在 RAM 中执行的代码

Data RAM Heap

供 ROM 代码、Patch 代码和 APP 代码动态分配内存

其中三块大小可变的 RAM 区域可以通过工程目录下 mem_config.h 文件中的宏 UPPERSTACK_GLOBAL_SIZEAPP_GLOBAL_SIZE 来自定义配置大小。

备注

UPPERSTACK_GLOBAL_SIZE 必须根据 BT Host Image 的版本对应设定,因此请注意查看 BT Host 的版本和发布说明。

Buffer RAM

Buffer RAM 的地址空间为 [0x00280000, 0x00283FFF],总大小为 16KB,其布局如下:

../../../_images/BUFFER_RAM_LAYOUT.png

Buffer RAM 布局

两块 RAM 区域有特定的用途:

Buffer RAM 用途

内存区域

内存用途

大小是否可变

ROM Data

存放 ROM 代码中的全局变量和静态变量

Buffer RAM Heap

供 ROM 代码、Patch 代码和 APP 代码动态分配内存(Realtek 蓝牙协议栈默认使用此 Heap)

Cache

RTL8752H 的 Cache 大小为 8KB,对应地址空间为 [0x0021A000, 0x0021C000)。Cache 配合 SPI Flash 控制器(SPIC),能够加速 Flash 的读写访问速度。

RTL8752H 的 Cache 支持配置成 Share Cache RAM 使用,用于存储数据和执行代码。用户可通过工程目录下 mem_config.h 文件中的宏 SHARE_CACHE_RAM_SIZE 来控制 Cache 配置成 RAM 的大小。

Share Cache RAM 的配置方法及其适用场景

SHARE_CACHE_RAM_SIZE

Cache Size

Data RAM Size

适用场景

0

8 KB

0 KB

跑大量的 Flash code

4

4 KB

4 KB

跑部分 Flash code,且对 Flash code 运行效率有要求

8

0 KB

8 KB

基本不需要运行 Flash code,或对 Flash code 的运行效率无要求

备注

SDK 中工程默认将 Macro SHARE_CACHE_RAM_SIZE 配置成 0。

Heap 管理

如上介绍,RTL8752H 默认配置了两块 Heap 区域(Data RAM Heap 和 Buffer RAM Heap) 供开发者动态申请内存使用。

inc/os/os_mem.h 文件中提供的 Heap 管理接口 如下。

Heap 管理接口

API

说明

os_mem_alloc

申请内存

os_mem_zalloc

申请内存,并将其初始化为0

os_mem_aligned_alloc

申请内存,并按照指定的方式对齐

os_mem_free()

释放申请到的内存

os_mem_aligned_free()

释放按指定方式对齐申请的内存

os_mem_peek()

统计指定RAM类型Heap未使用的大小

在调用申请内存的相关接口时,会根据输入参数 ram_type 有不同的策略。

  • 当 ram_type 是 RAM_TYPE_DATA_ON 时,从 Data RAM Heap 上申请内存。如果 Data RAM Heap 空间不足,会自动从 Buffer RAM Heap 上申请。

  • 当 ram_type 是 RAM_TYPE_BUFFER_ON 时,从 Buffer RAM Heap 上申请内存。如果 Buffer RAM Heap 空间不足,则会报出空间不足的错误。

应用程序的 RAM 使用情况

应用程序的 RAM 使用量主要包括两部分:

  • 编译后静态 RAM 的使用量

  • 运行起来后从 Heap 上动态申请的内存使用量

本小节将介绍这两者的统计方法以及蓝牙应用的 RAM 使用量使用情况。

静态 RAM 使用量统计方法

APP 在编译之后,可通过查询编译生成的 MAP 文件获取静态 RAM 的使用量。

静态 RAM 中占用 Data RAM 的大小可以通过在 MAP 文件中检索 RAM_DATA_ON 关键字获取。Data RAM(静态)使用量统计数据 是 Keil 编译后的 MAP 文件中 RAM_DATA_ON 区域的截图,能够看到 RAM_DATA_ON 区域的执行区域首地址、加载区域首地址和实际使用的大小。

../../../_images/APP_DATA_RAM_USAGE.png

Data RAM(静态)使用量统计数据

如果 APP 配置了 Share Cache RAM ,那么静态 RAM 中占 Share Cache RAM 的大小可以通过在 MAP 文件中检索 CACHE_DATA_ON 关键字获取。Share Cache RAM 使用量统计数据 是 Keil 编译后的 MAP 文件截图,能够看到 CACHE_DATA_ON 区域的执行区域首地址、加载区域首地址和实际使用的大小。

../../../_images/SHARE_CACHE_RAM_USAGE.png

Share Cache RAM 使用量统计数据

Heap 使用量统计方法

通过调用 os_mem_peek() 可以获取指定 RAM 类型 Heap 的可申请大小。

RAM使用量的统计数据

对于一个蓝牙应用,Realtek 原生的平台和蓝牙协议栈代码在运行时会占用一部分的 RAM 资源。故本小节将统计蓝牙应用中 Realtek 已使用的 RAM 大小,并计算出留给 APP 开发者实际可用的 RAM 大小。

如果按照 MP ToolConfig Set -‣ Stack 的默认蓝牙设定:

  • LE Master Link Num: 2

  • LE Slave Link Num: 2

  • Support LE AE ADV: Enable

  • PSD Enable: Enable

RAM使用量的统计数据结果如下:

蓝牙应用的 RAM 使用量统计(默认设定)

内存区域

总大小

Realtek 的使用量

APP 可使用的 RAM 大小

Data RAM Heap + APP RAM

68 KB

28 KB

40 KB

Buffer RAM Heap

14.5 KB

13 KB

1.5 KB

备注

  • Realtek 的使用量 主要统计了蓝牙应用的 Heap 使用量,不包括静态 RAM 使用量。

  • 以上统计默认分配了 2KB 给 BT Host RAM,因此 Data RAM Heap + APP RAM 的总大小是 68KB。

  • Patch 的更新可能会导致 Realtek 的使用量发生变化,因此 APP 可使用的 RAM 大小以实际情况为准。

RAM 使用量优化

如果想进一步增加 APP 可使用的 RAM 大小,有以下两种方法可供参考。

方法一:更改蓝牙设定

通过在 MP ToolConfig Set -‣ Stack 界面下修改蓝牙相关设定,例如蓝牙链路数目、AE 和 PSD 功能等,可以达到增加 APP 可使用 RAM 大小的目的。

../../../_images/MPTool_Stack_Config_Setting.png

通过 MP Tool 修改蓝牙相关设定

如果将蓝牙的默认设定做如下更改:

  • LE Master Link Num: 2->0

  • LE Slave Link Num: 2->0

  • Support LE AE ADV: Enable->Disable

  • PSD Enable: Enable->Disable

那么 RAM 使用量统计数据将变更为:

蓝牙应用的 RAM 使用量统计(更改蓝牙设定后)

内存区域

总大小

Realtek 的使用量

APP 可使用的 RAM 大小

Data RAM Heap + APP RAM

68 KB

22 KB

46 KB

Buffer RAM Heap

14.5 KB

10.7 KB

3.8 KB

方式二:关闭 LOG 系统

通过在 MP ToolConfig Set -‣ Log 界面下的 LOG Config 的勾选删去,可以额外空出 1.5KB 大小的 RAM 供 APP 使用。

Flash

详见 Flash

eFuse

  • eFuse 是一种一次编程的存储体,用来存储重要且固定的信息,例如:UUID、密钥以和其它只会配置一次的信息。

  • eFuse 中的每一个 bit 位只能从 1 改写为 0,不能从 0 改写为 1,因此更新 eFuse 时要十分小心。

  • 在烧录 eFuse 时,请注意必须接上 2.5V(±10%)的电源。

  • Realtek 提供 MP Tool 来更新 eFuse。