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

RTL8752H 的内存映射
Realtek 定义的内存区域 详细情况如下。
内存区域 |
地址空间 |
大小 |
---|---|---|
[0x00000000, 0x00057FFF] |
352 KB |
|
[0x00200000, 0x00219FFF] |
104 KB |
|
[0x0021A000, 0x0021BFFF] |
8 KB |
|
[0x00280000, 0x00283FFF] |
16 KB |
|
SPIC Flash (Cacheable) |
[0x00800000, 0x017FFFFF] |
最大映射空间为 16 MB |
SPIC Flash (Non-Cacheable) |
[0x01800000, 0x027FFFFF] |
最大映射空间为 16 MB |
/ |
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 分为以下两部分:
内存区域 |
地址空间 |
大小 |
内存用途 |
---|---|---|---|
[0x00200000, 0x00219FFF] |
104KB |
用于存储数据、执行代码和 Heap 分配 |
|
[0x00280000, 0x00283FFF] |
16KB |
主要用于 Heap 分配,且 Realtek 蓝牙协议栈默认使用此 Heap |
Data RAM
RTL8752H 的 Data RAM 默认被分成 6 块区域,其分布如下:

Data RAM 布局
每块 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_SIZE
和 APP_GLOBAL_SIZE
来自定义配置大小。
备注
宏 UPPERSTACK_GLOBAL_SIZE
必须根据 BT Host Image 的版本对应设定,因此请注意查看 BT Host 的版本和发布说明。
Buffer RAM
Buffer RAM 的地址空间为 [0x00280000, 0x00283FFF],总大小为 16KB,其布局如下:

Buffer RAM 布局
两块 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 的大小。
宏 |
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 管理接口 如下。
API |
说明 |
---|---|
|
申请内存 |
|
申请内存,并将其初始化为0 |
|
申请内存,并按照指定的方式对齐 |
释放申请到的内存 |
|
释放按指定方式对齐申请的内存 |
|
统计指定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 区域的执行区域首地址、加载区域首地址和实际使用的大小。

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

Share Cache RAM 使用量统计数据
Heap 使用量统计方法
通过调用 os_mem_peek()
可以获取指定 RAM 类型 Heap 的可申请大小。
RAM使用量的统计数据
对于一个蓝牙应用,Realtek 原生的平台和蓝牙协议栈代码在运行时会占用一部分的 RAM 资源。故本小节将统计蓝牙应用中 Realtek 已使用的 RAM 大小,并计算出留给 APP 开发者实际可用的 RAM 大小。
如果按照 MP Tool 中 的默认蓝牙设定:
LE Master Link Num: 2
LE Slave Link Num: 2
Support LE AE ADV: Enable
PSD Enable: Enable
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 Tool 中 界面下修改蓝牙相关设定,例如蓝牙链路数目、AE 和 PSD 功能等,可以达到增加 APP 可使用 RAM 大小的目的。

通过 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 使用量统计数据将变更为:
内存区域 |
总大小 |
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 Tool 中 界面下的 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。