D12x 内存使用指南
19 Nov 2024
Read time: 3 minute(s)
D12x 硬件上使用 PSRAM 作为 Memory 主要存储单元,其典型大小为 8M/ 16M。
内存布局和使用策略
如图所示,软件会使用以下策略来分配 PSRAM Memory 资源,确保关键模块如 MPP 能够高效地获取所需内存,同时也为系统的其他部分提供足够的资源:
- 将 PSRAM
分成以下两个主要区域:
PSRAM CMA Region
:专供多媒体模块 MPP 使用。PSRAM Software Region
:供系统其他模块使用。
上述区域划分可将 MPP 的动态内存池 (heap_cma) 和系统动态内存池 (heap_sys) 分离,避免 MPP 的内存池碎片化。MPP 的内存分配基本是大块内存,而系统各模块的内存分配是各种尺寸大小都有,如果共享一个内存池容易造成 MPP 大块内存分配失败。
-
将每个
Region
进一步划分成以下子区域:- 静态分配
Static
:编译链接后可确认地址。 - 动态分配
Heap
:Heap 内存池运行时确定地址。
- 静态分配
最终 PSRAM 空间会被软件划分成四块区域:
-
PSRAM SW Static
:系统静态分配区域。默认存放
.text .rodata .data .bss
参数,即普通的函数定义和全局变量定义。 -
PSRAM SW Heap
:系统动态分配区域,即heap_sys
内存池。通过以下函数可以从该内存池分配内存。malloc(size); aicos_malloc(MEM_DEFAULT, size); // MEM_DEFAULT = 0
-
PSRAM CMA Static
:CMA 静态分配区域,属于可选区域,通常情况下没有配置。通过加上CMA_DATA_DEFINE
宏声明可以将函数定义和全局变量定义链接到此区域:// 函数定义: void CMA_DATA_DEFINE test_func(void); // CMA_DATA_DEFINE = PSRAM_CMA_DATA_DEFINE // 全局变量定义: CMA_DATA_DEFINE int a = 1;
-
PSRAM CMA Heap
:CMA 动态分配区域,即heap_cma
内存池。可以通过以下函数从该内存池分配内存。aicos_malloc(MEM_CMA, size); // MEM_CMA = MEM_PSRAM_CMA
参数配置
通过 scons --menuconfig
命令进入 menuconfig 配置界面,配置下列 Meomry 相关参数:
-
PSRAM 总大小
Board options ---> Mem Options ---> PSRAM parameter ---> (0x800000) PSRAM size // 配置 PSRAM 总大小为 8M
-
CMA 区域大小
Board options ---> Mem Options ---> PSRAM parameter ---> (0x200000) Software size in PSRAM // 配置 PSRAM 开头 Software 区域大小为 2M,剩余结尾 CMA 区域大小即为 6M
调试命令
在工程编译时,可以通过
scons
--list-mem
命令来查看当前工程的 Memory
layout:$ scons --list-mem
scons: Reading SConscript files ...
output/d12x_demo68-nor_rt-thread_helloworld/images/d12x.elf Memory layout:
Region Start End Length
psram 0x40000000 - 0x41000000 0x01000000
└─ psram_sw 0x40000000 - 0x40200000 0x00200000
└─ psram_sw_static 0x40000000 - 0x400e7ae8 0x000e7ae8
└─ .text 0x40000000 - 0x400a6640 0x000a6640
└─ .rodata 0x400a66b0 - 0x400d6fa8 0x000308f8
└─ .bss 0x400d8c00 - 0x400e7ae8 0x0000eee8
└─ psram_sw_heap 0x400e7ae8 - 0x40200000 0x00118518
└─ .heap_sys 0x400e7ae8 - 0x40200000 0x00118518
└─ psram_cma 0x40200000 - 0x41000000 0x00e00000
└─ psram_cma_heap 0x40200000 - 0x41000000 0x00e00000
└─ .heap_cma 0x40200000 - 0x41000000 0x00e00000
在系统运行时,可以通过 RT-Thread 下的
free
命令来查看 heap_sys
和
heap_cma
内存池的运行情况:aic /> free
memheap pool size max used size available size
---------------- ---------- ------------- --------------
heap_cma 8362744 48 8362696
heap_sys 758948 50384 710780