Memory
本文主要介绍RTL87x2G的内存系统以及怎样使用各部分内存。RTL87x2G的内存系统主要由ROM、RAM、Cache、Flash和eFuse构成,如下所示。这种灵活的内存配置机制使得RTL87x2G支持的应用更为广泛。
内存类型 |
分布 |
起始地址 |
结束地址 |
总大小(字节) |
---|---|---|---|---|
ROM |
0x00000000 |
0x0007FFFF |
512K |
|
RAM |
ITCM1 |
0x00100000 |
0x0012FFFF |
192K |
DTCM0 |
0x00130000 |
0x0013FFFF |
64K |
|
DTCM1 |
0x00140000 |
0x0014FFFF |
64K |
|
Data SRAM |
0x00200000 |
0x00203FFF |
16K |
|
Buffer SRAM |
0x00280000 |
0x0028BFFF |
48K |
|
Cache |
I-Cache |
32K |
||
D-Cache |
16K |
|||
Flash |
SPI Flash |
0x04000000 |
0x07FFFFFF |
64M* |
eFuse |
eFuse |
1K |
备注
* 表示映射空间最大是64M,实际以使用Flash大小为准。
ROM
ROM的地址空间为0x0~0x7FFFF,总大小512KB,固化了Bootloader、Flash Driver、Power Manager、Bluetooth Controller及Platform features等程序。RTL87x2G ROM为APP开放了一些模块,如Flash Driver等。RTL87x2G SDK包含这些ROM模块的头文件,用户可以访问内置ROM函数,以减少应用程序代码大小和所需的RAM大小。
RAM
内存空间分布
RAM分三块,分别是TCM,Data SRAM和Buffer SRAM。其中TCM又可以分成三块,分别是地址空间为0x00100000 ~ 0x0012FFFF总大小192KB的ITCM1、地址空间为0x00130000 ~ 0x0013FFFF总大小64KB的DTCM0和地址空间为0x00140000 ~ 0x0014FFFF总大小64KB的DTCM1,三块空间地址连续。
TCM:一种专门设计的内存类型,着重于提供低延迟、高带宽和确定性访问的特性,包含ITCM和DTCM:
ITCM:专门用于存储程序指令的 TCM 类型,使得 CPU 可以极快速地访问和执行其中的代码。
DTCM:一种专门用于存储数据的 TCM 类型,提高这些数据的访问速度。
RTL87x2G的 RAM空间 分为5部分,都可以用来存储数据和执行代码。
分布 |
起始地址 |
地址空间 |
大小 |
---|---|---|---|
ITCM1 |
0x00100000 |
0x00100000~0x0012FFFF |
192KB |
DTCM0 |
0x00130000 |
0x00130000~0x0013FFFF |
64KB |
DTCM1 |
0x00140000 |
0x00140000~0x0014FFFF |
64KB |
Data SRAM |
0x00200000 |
0x00200000~0x00203FFF |
16KB |
Buffer SRAM |
0x00280000 |
0x00280000~0x0028BFFF |
48KB |
对于TrustZone enable和TrustZone disable其内存空间分布会有所不同,具体如下:
TrustZone Disable内存空间分布
备注
TrustZone disable时,不区分secure和non-secure。
TrustZone disable RAM用途如下,每个部分都有固定的排布顺序和特定的用途。
内存类型内存 |
内存用途 |
内存可变 |
---|---|---|
S ROM data |
存放Secure ROM Code中全局变量和静态变量 |
否 |
Main Stack |
启动和中断服务例程中使用该stack |
否 |
Boot Patch RAM |
存放Boot Patch全局变量和静态变量以及在RAM上执行的code |
否 |
System Patch RAM |
存放System Patch全局变量和静态变量以及在RAM上执行的code |
否 |
Stack Patch RAM |
存放Stack Patch全局变量和静态变量以及在RAM上执行的code |
否 |
NS ROM data |
存放Non-Secure ROM Code中全局变量和静态变量 |
否 |
DTCM + ITCM Heap |
供Non-Secure ROM code、System Patch code,Bluetooth Host code和APP code动态申请空间使用 |
是 |
APP RAM |
存放APP中全局变量和静态变量以及在RAM上执行的code |
是 |
Bluetooth Host RAM |
存放Bluetooth Host全局变量和静态变量以及在RAM上执行的code |
是 |
TrustZone Enable内存空间分布
内存类型内存 |
内存用途 |
内存可变 |
---|---|---|
S ROM data |
存放Secure ROM Code中全局变量和静态变量 |
否 |
Secure Main Stack |
Secure启动和中断服务例程中使用该stack |
否 |
Boot Patch RAM |
存放Boot Patch全局变量和静态变量以及在RAM上执行的code |
否 |
System Patch RAM |
存放System Patch全局变量和静态变量以及在RAM上执行的code |
否 |
Stack Patch RAM |
存放Stack Patch全局变量和静态变量以及在RAM上执行的code |
否 |
NS ROM data |
存放Non-Secure ROM Code中全局变量和静态变量 |
否 |
NS Main Stack |
Non-secure启动和中断服务例程中使用该stack |
否 |
Secure Heap |
供Secure ROM code和Secure APP code动态申请空间使用 |
是 |
Secure APP RAM |
存放Secure APP中全局变量和静态变量以及在RAM上执行的code |
是 |
NS DTCM + ITCM Heap |
供Non-Secure ROM code、System Patch code,BT Host stack code和APP code动态申请空间使用 |
是 |
NS APP RAM |
存放NS APP中全局变量和静态变量以及在RAM上执行的code |
是 |
Bluetooth Host RAM |
存放Bluetooth Host全局变量和静态变量以及在RAM上执行的code |
是 |
可调整的RAM区域都是统一通过mem_config.h中不同的宏定义修改。NS_RAM_UPPERSTACK_SIZE必须根据使用的BT Host image的版本对应设定。不同的BT Host image占用不同大小的DTCM,请注意看BT Host发布文件及其说明。根据应用需要调整NS_RAM_UPPERSTACK_SIZE的大小。
内存类型 |
宏 |
---|---|
BT Host stack RAM |
NS_RAM_UPPERSTACK_SIZE |
APP RAM |
NS_RAM_APP_SIZE |
DTCM + ITCM Heap |
NS_RAM_APP_RESERVED_SIZE - NS_RAM_APP_SIZE - NS_RAM_UPPERSTACK_SIZE |
APIs
通过调用API:os_mem_alloc
可从NS DTCM Heap、Data SRAM Heap或者Buffer SRAM Heap上动态申请内存,由参数ram_type指定申请的类型,分别对应RAM_TYPE_DATA_ON、RAM_TYPE_EXT_DATA_SRAM和RAM_TYPE_BUFFER_ON,具体代码如下:
typedef enum
{
RAM_TYPE_DATA_ON, //DTCM Heap
RAM_TYPE_DATA_OFF = RAM_TYPE_DATA_ON,
RAM_TYPE_BUFFER_ON,
RAM_TYPE_BUFFER_OFF = RAM_TYPE_BUFFER_ON,
RAM_TYPE_EXT_DATA_SRAM, //Ext DATA SRAM heap
RAM_TYPE_NUM
} RAM_TYPE;
/**
* @brief Allocate memory dynamically from Data RAM Heap or Buffer RAM heap
* @param ram_type : specify which heap to allocate memory from
* @param size: memory size in bytes to be allocated
* @retval pointer to the allocated memory
*/
#define os_mem_alloc(ram_type, size)
os_mem_alloc_intern(ram_type, size, __func__, __LINE__)
其他动态申请内存的APIs如下。(详细信息参考 os_mem.h
)
API |
说明 |
---|---|
os_mem_zalloc |
申请的内存被初始化为0 |
os_mem_aligned_alloc |
申请的内存按照指定的方式对齐 |
os_mem_free |
释放申请到的内存 |
os_mem_aligned_free |
释放按指定方式对齐申请的内存 |
os_mem_peek |
统计指定RAM类型的未使用的内存大小 |
统计RAM使用情况
根据APP使用RAM的方式,分为静态区和动态区。
统计APP RAM使用的静态区大小
查找Build生成的app.map文件来找到APP RAM中分配的首地址,结束地址以及使用的大小。通过查找加载区 ER_IRAM_NS map,可以确定APP RAM的静态使用情况。
统计动态区剩余大小
通过os_mem_peek函数可以获取指定RAM类型的剩余heap size。
调整APP可使用RAM大小
如果想进一步增加APP可使用RAM的总大小,可通过以下两种方式:
修改MP Tool Config Setting中Stack界面的一些Stack设定,例如蓝牙链路数目,AE和PSD功能等。
关闭log:修改MP Tool Config Setting中Log界面将log改为“log disable”。
Cache
RTL87x2G支持32KB I-Cache和16KB D-Cache。
Cache默认策略:
Flash默认是Cacheable。
Data SRAM和Buffer SRAM默认是Non-Cacheable。
Flash
详见 Flash。
PSRAM
详见 PSRAM。
eFuse
eFuse是一种一次编程的存储体,用来存储重要且固定的信息,例如:UUID,security key以及其它只会配置一次的信息。eFuse中每一bit不能从0改成1,并且也没有擦除的操作,所以更新eFuse要十分小心。Realtek提供MPTool更新eFuse。