Edit online

SRAM

5 Dec 2024
Read time: 3 minute(s)

对于没有 SiP PSRAM 颗粒和 PSRAM Memory 空间的部分 D13x型号,如需使用多媒体模块 DE/ GE/ VE ,必须使能 SRAM_S1 区域。SRAM_S1 区域可以被 DE/GE/VE 硬件访问,但其空间需要从 SRAM_S0 中划分。

SRAM 配置和SRAM + PSRAM 配置区别是用 SRAM_S1 取代 PSRAM 来充当 CMA 区域,本节仅描述两者的差异部分。

内存布局和使用策略


d13x_mem_layout3

如图所示,针对 SRAM_S1 Memory 资源,软件会使用以下策略来进行分配:

  • 将 SRAM_S1 分成两个区域:
    • SRAM_S1 Software Region:在 SRAM_S0 不够系统软件用的情况下补充划分一部分SRAM_S1 给软件使用。
    • SRAM_S1 CMA Region:专供多媒体模块 MPP 使用
  • 将每个 Region 进一步划分成以下子区域:
    • 静态分配 Static:编译链接后可确认地址。
    • 动态分配 Heap:Heap 内存池运行时确定地址。
综合上述策略,SRAM_S1 空间被软件划分成四块区域:
  • SRAM_S1 SW Static:系统静态分配区域,属于可选区域,通常情况下未配置。

    如需链接到此区域,可在函数定义和全局变量定义中加入 SRAM1_SW_DATA_DEFINE 宏声明:

    // 函数定义:
    void SRAM1_SW_DATA_DEFINE test_func(void);
    
    // 全局变量定义:
    SRAM1_SW_DATA_DEFINE int a = 1;
  • SRAM_S1 SW Heap:系统动态分配区域,即 heap_sram1_sw 内存池,属于可选区域,通常情况下未配置。

    使用以下函数,可从该内存池分配内存:

    aicos_malloc(MEM_SRAM1_SW, size);
  • SRAM_S1 CMA Static:CMA 静态分配区域,属于可选区域,通常情况下未配置。
    • 当 SRAM_S0 空间不够用时,通过 menuconfig 配置菜单,将 .text.rodata.data.bss 放置到 PSRAM 中,可链接到本区域。

    • 如需链接到此区域,可在函数定义和全局变量定义中加入 CMA_DATA_DEFINE 宏声明:
      // 函数定义:
      void CMA_DATA_DEFINE test_func(void);   // CMA_DATA_DEFINE = SRAM1_CMA_DATA_DEFINE
      
      // 全局变量定义:
      CMA_DATA_DEFINE int a = 1;
  • SRAM_S1 CMA Heap:CMA 动态分配区域,即 heap_cma 内存池

    使用以下函数,,可从该内存池分配内存。

    aicos_malloc(MEM_CMA, size);        // MEM_CMA = MEM_SRAM1_CMA

参数配置

通过 scons --menuconfig 命令进入 menuconfig 配置界面,配置下列 Meomry 相关参数:
Board options  --->
    Mem Options  --->
  • SRAM_S1 总大小

    SRAM parameter  --->
        (0x100000) SRAM Total Size    // 配置 SRAM 总大小为 1M
        SRAM_S1 Size (512K)           // 配置 SRAM_S1 大小为 512k,SRAM_S0 大小即为剩下的 512k
            ( ) 0K
            ( ) 128K
            ( ) 256K
            ( ) 384K
            (X) 512K
            ( ) 640K
  • SRAM_S1 CMA 区域大小

    SRAM parameter  --->
        (0x0) Software size in SRAM_S1 // 配置 SRAM_S1 开头 Software 区域大小为 0,剩余结尾 CMA 区域大小即为 512k
  • .text.rodata.data.bss 区域可选择配置到 SRAM_S0/SRAM_S1 中:

    ELF Sections memory locatio  --->
        Section .text (SRAM_S0)  --->
        Section .rodata (SRAM_S0)  --->
        Section .data (SRAM_S0)  --->
        Section .bss (SRAM_S1)  --->
            ( ) SRAM_S0
            (X) SRAM_S1      // 在 SRAM_S0 空间不足的情况下,选择把部分数据存放到 SRAM_S1 当中