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、BT Controller stack及Platform features等程序。RTL87x2G ROM为APP开放了一些模块,如flash driver等。RTL87x2G SDK包含这些ROM模块的头文件,用户可以访问内置ROM函数,以减少应用程序代码大小和所需的RAM大小。

RAM

内存空间分布

RTL87x2G的RAM空间分为5部分,都可以用来存储数据和执行代码。

RAM空间分布

分布

起始地址

地址空间

大小

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

64KB

RAM分三块,分别是TCM,Data RAM和Buffer RAM。其中TCM又可以分成三块,分别是地址空间为0x00100000 ~ 0x0012FFFF总大小192KB的ITCM1、地址空间为0x00130000 ~ 0x0013FFFF总大小64KB的DTCM0和地址空间为0x00140000 ~ 0x0014FFFF总大小64KB的DTCM1,三块空间地址连续。对于TrustZone enable和TrustZone disable其内存空间分布会有所不同,具体如下。

  • TCM:一种专门设计的内存类型,着重于提供低延迟、高带宽和确定性访问的特性。

  • ITCM:专门用于存储程序指令的 TCM 类型,使得 CPU 可以极快速地访问和执行其中的代码。

  • DTCM:一种专门用于存储数据的 TCM 类型,提高这些数据的访问速度。

TrustZone disable内存空间分布

../../../../_images/TrustZone_disable_RAM_layout.png

TrustZone disable RAM布局

备注

TrustZone disable时,不区分secure和non-secure。

TrustZone disable RAM用途如下,每个部分都有固定的排布顺序和特定的用途。

TrustZone disable RAM用途

内存类型内存

内存用途

内存可变

S ROM data

存放Secure ROM Code中全局变量和静态变量

Main Stack

启动和中断服务例程中使用该stack

Boot PatchRAM

存放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,BT Host stack code和APP code动态申请空间使用

APP RAM

存放APP中全局变量和静态变量以及在RAM上执行的code

BT Host stack RAM

存放BT Host stack全局变量和静态变量以及在RAM上执行的code

TrustZone enable内存空间分布

../../../../_images/TrustZone_enable_RAM_layout.png

TrustZone enable RAM布局

TrustZone enable RAM用途

内存类型内存

内存用途

内存可变

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

BT Host stack RAM

存放BT Host stack全局变量和静态变量以及在RAM上执行的code

RAM中大小可调整的部分都是统一通过mem_config.h中不同的宏定义修改。NS_RAM_UPPERSTACK_SIZE必须根据使用的BT Host image的版本对应设定。不同的BT Host image占用不同大小的DTCM,请注意看BT Host发布文件及其说明。根据应用需要调整NS_RAM_UPPERSTACK_SIZE的大小。

调整RAM

内存类型

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上动态申请内存,由参数ramType指定申请的类型,分别对应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

os_mem_zalloc:

申请的内存被初始化为0。

os_mem_aligned_alloc:

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

os_mem_free:

释放从data ram heap或者buffer ram heap上申请到的内存。

os_mem_aligned_free:

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

s_mem_peek:

统计指定RAM类型的未使用的内存大小。

访问效率

待后续版本更新。

统计RAM使用情况

根据app使用ram的方式,分为静态区和动态区。

统计Data RAM使用的静态区大小

查找Build生成的app.map文件来找到Data RAM中分配的首地址,结束地址以及使用的大小。通过查找加载区 ER_IRAM_NS map,可以确定APP DTCM的静态使用情况。

../../../../_images/ER_IRAM_NS_Map.png

ER_IRAM_NS map

统计动态区剩余大小

通过os_mem_peek函数可以获取指定RAM类型的剩余heap size。

调整APP可使用RAM的总大小

待后续版本更新。

Cache

RTL87x2G支持32KB I-Cache和16KB D-Cache。

Cache默认策略:

  • Flash默认是Cacheable。

  • Data ram和Buffer ram默认是Non-Cacheable。

Flash

详见 Flash

PSRAM

详见 PSRAM

eFuse

eFuse是一次编程的存储体,用来存储重要且固定的信息,例如:UUID,security key以及其它只会配置一次的信息。eFuse中每个bit不能从0改成1,并且也没有擦除的操作,所以更新eFuse要十分小心。Realtek提供MPTool更新eFuse。