SRAM + PSRAM
- SRAM_S0 速度较快但是容量较小,提供给软件系统使用。
- PSRAM 速度略慢但是容量较大,提供给多媒体外设模块 DE/GE/VE 作为缓存使用
- 外设模块的 DMA 直接存取内存。
内存布局和使用策略
为了减少总线冲突,DE/GE/VE 硬件上已被限制不能访问 SRAM_S0 区域的内存。
软件会使用以下策略来分配 Hardware Memory 资源:
-
将 SRAM 的
SRAM_S0 Region
区域提供给系统软件使用。 -
将 PSRAM 分成两个区域:
PSRAM Software Region
:在 SRAM 不够系统软件用的情况下补充划分一部分 PSRAM 给软件使用。PSRAM CMA Region
:专供多媒体模块 MPP 使用
上述区域划分可将 MPP 的动态内存池 (heap_cma) 和系统动态内存池 (heap_sys) 分离,避免 MPP 的内存池碎片化。MPP 的内存分配基本是大块内存,而系统各模块的内存分配是各种尺寸大小都有,如果共享一个内存池容易造成 MPP 大块内存分配失败。
-
将每个
Region
进一步划分成以下子区域:- 静态分配
Static
:编译链接后可确认地址。 - 动态分配
Heap
:Heap 内存池运行时确定地址。
- 静态分配
-
SRAM_S0 SW Static
:系统静态分配区域。默认存放
.text
,.rodata
,.data
和.bss
参数,即普通的函数定义和全局变量定义。 -
SRAM_S0 SW Heap
:系统动态分配区域,即heap_sys
内存池。通过以下函数可以从该内存池分配内存。malloc(size); aicos_malloc(MEM_DEFAULT, size); // MEM_DEFAULT = 0
-
PSRAM SW Static
:系统静态分配区域,属于可选区域,通常情况下没有配置。通过加上PSRAM_SW_DATA_DEFINE
宏声明可以将函数定义和全局变量定义链接到本区域:// 函数定义: void PSRAM_SW_DATA_DEFINE test_func(void); // 全局变量定义: PSRAM_SW_DATA_DEFINE int a = 1;
-
PSRAM SW Heap
:系统动态分配区域,即heap_psram_sw
内存池,属于可选区域,通常情况下没有配置。通过以下函数可以从该内存池分配内存。aicos_malloc(MEM_PSRAM_SW, size);
-
PSRAM CMA Static
:CMA 静态分配区域。- 在 SRAM_S0 空间不够用时,通过
menuconfig
配置菜单将.text .rodata .data .bss
放置到 PSRAM 中,可以链接到本区域。 - 通过加上
CMA_DATA_DEFINE
宏声明,可以将函数定义和全局变量定义链接到本区域。
// 函数定义: void CMA_DATA_DEFINE test_func(void); // CMA_DATA_DEFINE = PSRAM_CMA_DATA_DEFINE // 全局变量定义: CMA_DATA_DEFINE int a = 1;
- 在 SRAM_S0 空间不够用时,通过
-
PSRAM CMA Heap
:CMA 动态分配区域,即heap_cma
内存池。通过以下函数可以从该内存池分配内存。aicos_malloc(MEM_CMA, size); // MEM_CMA = MEM_PSRAM_CMA
参数配置
通过 scons --menuconfig
命令进入 menuconfig 配置界面,可以配置 Meomry 相关参数:
-
SRAM_S0 总大小
Board options ---> Mem Options ---> SRAM parameter ---> (0x100000) SRAM Total Size // 配置 SRAM 总大小为 1M SRAM_S1 Size (0K) // 配置 SRAM_S1 大小为 0,即所有空间分配给 SRAM_S0
-
PSRAM 总大小
Board options ---> Mem Options ---> PSRAM parameter ---> (0x800000) PSRAM size // 配置 PSRAM 总大小为 8M
-
PSRAM CMA 区域大小
Board options ---> Mem Options ---> PSRAM parameter ---> (0x0) Software size in PSRAM // 配置 PSRAM 开头 Software 区域大小为 0,剩余结尾 CMA 区域大小即为 8M
-
.text.rodata.data.bss
区域可选择配置到 SRAM_S0/PSRAM 当中Board options ---> Mem Options ---> ELF Sections memory locatio ---> Section .text (SRAM_S0) ---> Section .rodata (SRAM_S0) ---> Section .data (SRAM_S0) ---> Section .bss (PSRAM) ---> ( ) SRAM_S0 (X) PSRAM // 在 SRAM 空间不足的情况下,选择把几部分数据存放到 PSRAM 当中
调试命令
scons --list-mem
命令来查看当前工程的 Memory
layout:$ scons --list-mem
scons: Reading SConscript files ...
output/d13x_demo88-nor_rt-thread_helloworld/images/d13x.elf Memory layout:
Region Start End Length
sram_s0 0x30040000 - 0x30140000 0x00100000
└─ sram_s0_static 0x30040000 - 0x300ec1f8 0x000ac1f8
└─ .text 0x30040000 - 0x300ca3c0 0x0008a3c0
└─ .rodata 0x300ca430 - 0x300ea7b0 0x00020380
└─ .data 0x300ea7c0 - 0x300ec1f8 0x00001a38
└─ sram_s0_heap 0x300ec1f8 - 0x30140000 0x00053e08
└─ .heap_sys 0x300ec1f8 - 0x30140000 0x00053e08
psram 0x40000000 - 0x40800000 0x00800000
└─ psram_cma 0x40000000 - 0x40800000 0x00800000
└─ psram_cma_static 0x40000000 - 0x40010348 0x00010348
└─ .bss 0x40000000 - 0x40010348 0x00010348
└─ psram_cma_heap 0x40010348 - 0x40800000 0x007efcb8
└─ .heap_cma 0x40010348 - 0x40800000 0x007efcb8
free
命令来查看 heap_sys
和
heap_cma
内存池的运行情况:$ scons --list-mem
scons: Reading SConscript files ...
output/d13x_demo88-nor_rt-thread_helloworld/images/d13x.elf Memory layout:
Region Start End Length
sram_s0 0x30040000 - 0x30140000 0x00100000
└─ sram_s0_static 0x30040000 - 0x300ec1f8 0x000ac1f8
└─ .text 0x30040000 - 0x300ca3c0 0x0008a3c0
└─ .rodata 0x300ca430 - 0x300ea7b0 0x00020380
└─ .data 0x300ea7c0 - 0x300ec1f8 0x00001a38
└─ sram_s0_heap 0x300ec1f8 - 0x30140000 0x00053e08
└─ .heap_sys 0x300ec1f8 - 0x30140000 0x00053e08
psram 0x40000000 - 0x40800000 0x00800000
└─ psram_cma 0x40000000 - 0x40800000 0x00800000
└─ psram_cma_static 0x40000000 - 0x40010348 0x00010348
└─ .bss 0x40000000 - 0x40010348 0x00010348
└─ psram_cma_heap 0x40010348 - 0x40800000 0x007efcb8
└─ .heap_cma 0x40010348 - 0x40800000 0x007efcb8