RAM 布局与配置
简介
本章介绍默认内存布局及其修改方法。
RAM 内存布局
芯片集成了内部 SRAM 和可扩展的 PSRAM,其容量如下:
内部 SRAM: 512KB
可扩展的 PSRAM: 容量请参考 datasheet
芯片集成了内部 SRAM 和可扩展的 PSRAM,其容量如下:
内部 SRAM: 768KB
可扩展的 PSRAM: 容量请参考 datasheet
芯片集成了内部 SRAM 和可扩展的 PSRAM,其容量如下:
内部 SRAM: 512KB
可扩展的 PSRAM: 容量请参考 datasheet
芯片集成了内部 SRAM 和可扩展的 PSRAM,其容量如下:
内部 SRAM: 512KB
可扩展的 PSRAM: 容量请参考 datasheet
芯片集成了内部 SRAM 和可扩展的 PSRAM,其容量如下:
内部 SRAM: 256KB + 128KB
可扩展的 PSRAM: 请参考 datasheet
芯片集成了内部 SRAM 和可扩展的 PSRAM,其容量如下:
内部 SRAM: 512KB
可扩展的 PSRAM: 容量请参考 datasheet
SRAM 与 PSRAM 混合布局
Item |
起始地址 |
大小 (KB) |
描述 |
必需 |
---|---|---|---|---|
SRAM FIXED |
0x2000_0000 |
40 |
用于 ROM BSS, MSP 等 |
√ |
KM4 Bootloader |
0x3000_A000 |
32 |
KM4 安全启动加载程序,包括代码和数据 |
√ |
KM4 BD RAM TZ |
0x2001_2000 |
64 |
KM4 IMG3 BD RAM,如果不需要可以合并到 KM4 BD RAM |
x |
KM4 BD RAM |
0x2002_2000 |
280 |
KM4 BDRAM 数据、BSS 和 heap |
√ |
KM0 BD RAM |
0x2006_8000 |
96 |
KM0 BDRAM 数据、BSS 和 heap |
√ |
KM4 BD PSRAM TZ |
0x6000_0000 |
64 |
KM4 IMG3 PSRAM,如果不需要可以合并到 KM4 PSRAM |
x |
KM4 BD PSRAM |
0x6001_0000 |
3220 |
KM4 BD PSRAM 代码和数据 |
√ |
KM0 BD PSRAM |
0x6032_5000 |
876 |
KM0 BD PSRAM 代码和数据 |
√ |
KM4 HEAP EXT |
0x6FFF_FFFF |
0 |
如果 KM4 堆空间不足,可用于扩展 heap 大小 |
x |
KM0 HEAP EXT |
0x6FFF_FFFF |
0 |
如果 KM0 堆空间不足,可用于扩展 heap 大小 |
x |
备注
如果 Trustzone 未启用,则 KM4 BD RAM TZ
和 KM4 BD PSRAM TZ
将作为 Non-secure 区域,并分别合并到 KM4 BD RAM
和 KM4 BD PSRAM
中。
带 PSRAM
备注
如果 Trustzone 未启用,则 KM4_BD_PSRAM_TZ
将作为 Non-secure 区域,并合并到 KM4_BD_PSRAM
中。
Item |
起始地址 |
大小 |
描述 |
必需 |
---|---|---|---|---|
SRAM FIXED |
0x2000_0000 |
40KB |
用于 ROM BSS, MSP … |
√ |
KM4 BOOTLOADER |
0x3000_A000 |
28KB |
用于 Bootloader |
√ |
KM4 BD RAM |
0x2001_1000 |
348KB |
KM4 BDRAM 数据、BSS 和 heap |
√ |
KR4 BD RAM |
0x2006_8000 |
96KB |
KR4 BDRAM 数据、BSS 和 heap |
√ |
KM4 BD PSRAM TZ |
0x6000_0000 |
64KB |
KM4 IMG3,如果不需要 IMG3 可以合并到 KM4 PSRAM |
x |
KM4 BD PSRAM |
0x6001_0000 |
1472KB |
KM4 代码 |
√ |
KR4 BD PSRAM |
0x6018_0000 |
1536KB |
KR4 代码 |
√ |
KM4 HEAP EXT |
0x6FFF_FFFF |
0 |
如果 KM4 堆空间不足,可用于扩展堆大小 |
x |
KR4 HEAP EXT |
0x6FFF_FFFF |
0 |
如果 KR4 堆空间不足,可用于扩展堆大小 |
x |
不带 PSRAM
备注
如果 Trustzone 未启用,则 KM4_BD_RAM_TZ
将作为 Non-secure 区域,并合并到 KM4_BD_RAM
中。
Item |
起始地址 |
大小 |
描述 |
必需 |
---|---|---|---|---|
SRAM FIXED |
0x2000_0000 |
40KB |
用于 ROM BSS, MSP … |
√ |
KM4 BOOTLOADER |
0x3000_A000 |
28KB |
用于 Bootloader |
√ |
KM4 BD RAM TZ |
0x2001_1000 |
64KB |
KM4 IMG3,如果不需要 IMG3 可供用户使用 |
x |
KM4 BD RAM |
0x2002_0000 |
288KB |
KM4 BDRAM 数据、BSS 和 heap |
√ |
KR4 BD RAM |
0x2006_8000 |
96KB |
KR4 BDRAM 数据、BSS 和 heap |
√ |
备注
如果 Trustzone 未启用,则 KM4_BD_PSRAM_TZ
将作为 Non-secure 区域,并合并到 KM4_BD_PSRAM
中。
Item |
起始地址 |
大小 |
描述 |
必需 |
---|---|---|---|---|
SRAM FIXED |
0x2000_0000 |
40KB |
用于 ROM BSS, MSP 等 |
√ |
KM4 BOOTLOADER |
0x3000_A000 |
28KB |
用于 Bootloader |
√ |
KM4_BD_PSRAM_TZ |
0x6000_0000 |
64KB |
KM4 IMG3,如果不需要 IMG3 可以合并到 KM4 BD PSRAM |
x |
KM4 BD PSRAM |
0x6001_0000 |
1472KB |
KM4 代码、数据、BSS 和 heap |
√ |
KR4 BD PSRAM |
0x6018_0000 |
1536KB |
KR4 代码、数据、BSS 和 heap |
√ |
DSP BD PSRAM |
0x6030_0000 |
5120KB |
DSP PSRAM |
√ |
KM4 HEAP EXT |
0x6FFF_FFFF |
0 |
如果 KM4 堆空间不足,可用于扩展堆大小 |
x |
KR4 HEAP EXT |
0x6FFF_FFFF |
0 |
如果 KR4 堆空间不足,可用于扩展堆大小 |
x |
备注
如果 Trustzone 未启用,则 KM4_BD_PSRAM_TZ
将作为 Non-secure 区域,并合并到 KM4_BD_PSRAM
中。
Item |
起始地址 |
大小 |
描述 |
必需 |
---|---|---|---|---|
SRAM FIXED |
0x2000_0000 |
40KB |
用于 ROM BSS, MSP 等 |
√ |
KM4 BOOTLOADER |
0x3000_A000 |
28KB |
用于 Bootloader |
√ |
KM4_BD_PSRAM_TZ |
0x6000_0000 |
64KB |
KM4 IMG3,如果不需要 IMG3 可以合并到 KM4 BD PSRAM |
x |
KM4 BD PSRAM |
0x6001_0000 |
1472KB |
KM4 代码、数据、BSS 和 heap |
√ |
KR4 BD PSRAM |
0x6018_0000 |
1536KB |
KR4 代码、数据、BSS 和 heap |
√ |
DSP BD PSRAM |
0x6030_0000 |
5120KB |
DSP PSRAM |
√ |
KM4 HEAP EXT |
0x6FFF_FFFF |
0 |
如果 KM4 堆空间不足,可用于扩展堆大小 |
x |
KR4 HEAP EXT |
0x6FFF_FFFF |
0 |
如果 KR4 堆空间不足,可用于扩展堆大小 |
x |
Item |
Sub-item |
物理地址 |
大小 |
描述 |
必需 |
---|---|---|---|---|---|
KM4 DRAM |
KM4_IMG2_RAM_NS |
0x6000_0000 |
1388KB |
KM4 image2 SRAM,包括代码、数据、BSS 和 heap |
√ |
KM4_BD_RAM_NSC |
0x6015_B000 |
4KB |
KM4 非安全可调用区域 |
x |
|
KM4_BD_RAM_ENTRY |
0x6015_C000 |
16KB |
KM4 非安全可调用函数入口 |
x |
|
KM4_BD_RAM_S |
0x7016_0000 |
128KB |
KM4 安全内存,包括安全代码、数据、BSS 和 heap |
x |
|
KM4_DRAM_HEAP_EXT |
0x6070_0000 |
1MB |
KM4 堆扩展 |
√ |
|
CA32 DARM |
BL1_RO |
0x6018_0000 |
128KB |
AP BL1 代码和只读数据 |
√ |
BL1_RW |
0x601A_0000 |
64KB |
AP BL1 栈和 BSS |
√ |
|
SHARED_RAM |
0x601B_0000 |
64KB |
AP 共享内存,用于多核通信 |
√ |
|
BL2 |
0x601C_0000 |
256KB |
AP BL2 代码、数据、栈和 BSS |
√ |
|
BL32 |
0x6020_0000 |
1MB |
AP BL32 代码、数据、栈和 BSS 对于 FreeRTOS SDK,BL32 是 SP_MIN。 |
√ |
|
BL33 |
0x6030_0000 |
4MB |
AP BL33 代码、数据、栈和 BSS 对于 FreeRTOS SDK,BL33 是 image2(应用程序)。 |
√ |
|
KM4 SRAM |
KM4_BOOT_RAM_S |
0x3000_3000 |
68KB |
KM4 安全启动加载程序,包括数据和代码 |
√ |
KM4_BD_RAM |
0x2001_4000 |
28KB |
KM4 主 SRAM,在仅 XIP 时使用 |
x |
|
ATF SHARE SRAM |
0x3001_F000 |
3.5KB |
在仅 XIP 时用于 atf 共享 SRAM |
x |
|
CA32_BL1 SRAM_S |
0x3001_FE00 |
512B |
CA32 BL1 SRAM |
√ |
|
RSVD for Audio |
0x2002_0000 |
128KB |
保留用于音频 |
√ |
|
KM0 SRAM |
KM0_BD_RAM |
0x2300_2000 |
119.25KB |
KM0 image2 SRAM,包括代码、数据、BSS 和 heap |
√ |
IPC_MEM |
0x2301_FD00 |
768B |
用于 CPU 之间通信的缓冲区 |
√ |
备注
如果 Trustzone 未启用,则 KM4 BD RAM TZ
和 KM4 BD PSRAM TZ
将作为 Non-secure 区域,并分别合并到 KM4 BD RAM
和 KM4 BD PSRAM
中。
Item |
起始地址 |
大小 (KB) |
描述 |
必需 |
---|---|---|---|---|
SRAM FIXED |
0x2000_0000 |
20 |
用于 ROM BSS, MSP 等 |
√ |
KM4TZ Bootloader |
0x3000_5000 |
32 |
KM4TZ 安全启动加载程序,包括代码和数据 |
√ |
KM4TZ BD RAM TZ |
0x2000_D000 |
64 |
KM4TZ IMG3 BD RAM,如果不需要可以合并到 KM4TZ BD RAM |
x |
KM4TZ BD RAM |
0x2001_D000 |
204 |
KM4TZ BDRAM 数据、BSS 和 heap |
√ |
KM4NS BD RAM |
0x2005_0000 |
192 |
KM4NS BDRAM 数据、BSS 和 heap |
√ |
KM4TZ BD PSRAM TZ |
0x6000_0000 |
148 |
KM4TZ IMG3 PSRAM,如果不需要可以合并到 KM4TZ PSRAM |
x |
KM4TZ BD PSRAM |
0x6002_5000 |
3072 |
KM4TZ BD PSRAM 代码、数据和 heap |
√ |
KM4NS BD PSRAM |
0x6032_5000 |
876 |
KM4NS BD PSRAM 代码、数据和 heap |
√ |
KM4TZ HEAP EXT |
0x6FFF_FFFF |
0 |
如果 KM4TZ 堆空间不足,可用于扩展 heap 大小 |
x |
KM4NS HEAP EXT |
0x6FFF_FFFF |
0 |
如果 KM4NS 堆空间不足,可用于扩展 heap 大小 |
x |
备注
如果 Trustzone 未启用,则 KM4TZ BD RAM TZ
和 KM4TZ BD PSRAM TZ
将作为 Non-secure 区域,并分别合并到 KM4TZ BD RAM
和 KM4TZ BD PSRAM
中。
Kconfig Link Option
menuconfig 提供了相关的设置,用于控制代码和数据的加载位置。进入 CONFIG Link Option 选项
IMG1(Bootloader) running on FLASH or SRAM? (FLASH) --->
IMG2(Application) running on FLASH, SRAM, or PSRAM? (FLASH) --->
IMG2 Data and Heap in SRAM or PSRAM? (SRAM) --->
IMG3(SecureImage) running on PSRAM or SRAM? (PSRAM) --->
[*] ALL PSRAM USED FOR APPLICATION HEAP
每个选项的含义如下:
IMG1(Bootloader) running on FLASH or SRAM?
:FLASH : bootloader 的全部代码加载到 FLASH 上运行。
SRAM : bootloader 的全部代码加载到 SRAM 上运行,一般用于对安全要求较高,且 SRAM 空间足够的场景。
IMG2(Application) running on FLASH, SRAM, or PSRAM?
:FLASH: application 的代码直接在 FLASH 上运行,仅支持 NOR FLASH。
SRAM: application 的代码加载到 SRAM 上运行,用于少数特定场景。
PSRAM: application 的代码加载到 PSRAM 上运行,用于对代码执行速度有要求,或安全性要求比较高的场景。
IMG2 Data and Heap in SRAM or PSRAM?
:SRAM: application 的数据加载到 SRAM, SRAM 和 PSRAM 的剩余空间都作 heap 使用。
PSRAM: application 的数据加载到 PSRAM, 仅 PSRAM 的剩余空间作 heap 使用。这种情况下 SRAM 一般预留给 DSP 使用。
IMG3(SecureImage) running on PSRAM or SRAM?
:SRAM: trustzone 的代码加载到 SRAM 运行,安全性更高,占用更多 SRAM 资源。
PSRAM: trustzone 的代码加载到 PSRAM 运行。
ALL PSRAM USED FOR APPLICATION HEAP
: 当 PSRAM 不加载代码或数据时, 将所有 PSRAM 空间都划给 application 作 heap 使用
备注
选择 PSARM 相关选项前需确认 IC 内部是否集成 PSRAM 或外挂 PSRAM
Bootloader_RAM
在 ameba_layout.ld
有如下定义:
#if defined(CONFIG_IMG1_FLASH)
#define KM4_IMG1_SIZE KBYTES(4)
#else
#define KM4_IMG1_SIZE KBYTES(32)
#endif
KM4_BOOTLOADER_RAM_S (rwx) : ORIGIN = KM4_IMG1_RAM_SATRT + SECURE_ADDR_OFFSET + IMAGE_HEADER_LEN, LENGTH = KM4_IMG1_SIZE - IMAGE_HEADER_LEN
在 menuconfig 中配置 CONFIG Link Option 选项, bootloader 占用 RAM 空间会随之调整:
选择 IMG1 –> FLASH 时,
KM4_BOOTLOADER_RAM_S
预设为 4KB选择 IMG1 –> SARM 时,
KM4_BOOTLOADER_RAM_S
预设为 32KB
如需扩大 KM4_BOOTLOADER_RAM_S
,需确保调整后的尺寸为 4KB 对齐(MPC 保护以 4KB 为单位)。
在 ameba_layout.ld
有如下定义:
#if defined(CONFIG_IMG1_FLASH)
#define KM4_IMG1_SIZE KBYTES(4)
#else
#define KM4_IMG1_SIZE KBYTES(28)
#endif
KM4_BOOTLOADER_RAM_S (rwx) : ORIGIN = KM4_IMG1_RAM_SATRT + SECURE_ADDR_OFFSET + IMAGE_HEADER_LEN, LENGTH = KM4_IMG1_SIZE - IMAGE_HEADER_LEN
在 menuconfig 中配置 CONFIG Link Option 选项, bootloader 占用 RAM 空间会随之调整:
选择 IMG1 –> FLASH 时,
KM4_BOOTLOADER_RAM_S
预设为 4KB选择 IMG1 –> SARM 时,
KM4_BOOTLOADER_RAM_S
预设为 28KB
如需扩大 KM4_BOOT_RAM_S
,需确保调整后的尺寸为 4KB 对齐(MPC 保护以 4KB 为单位)。
在 ameba_layout.ld
有如下定义:
#if defined(CONFIG_IMG1_FLASH)
#define KM4_IMG1_SIZE KBYTES(4)
#else
#define KM4_IMG1_SIZE KBYTES(28)
#endif
KM4_BOOTLOADER_RAM_S (rwx) : ORIGIN = KM4_IMG1_RAM_SATRT + SECURE_ADDR_OFFSET + IMAGE_HEADER_LEN, LENGTH = KM4_IMG1_SIZE - IMAGE_HEADER_LEN
在 menuconfig 中配置 CONFIG Link Option 选项, bootloader 占用 RAM 空间会随之调整:
选择 IMG1 –> FLASH 时,
KM4_BOOTLOADER_RAM_S
预设为 4KB选择 IMG1 –> SARM 时,
KM4_BOOTLOADER_RAM_S
预设为 28KB
如需扩大 KM4_BOOT_RAM_S
,需确保调整后的尺寸为 4KB 对齐(MPC 保护以 4KB 为单位)。
在 ameba_layout.ld
有如下定义:
#if defined(CONFIG_IMG1_FLASH)
#define KM4_IMG1_SIZE KBYTES(4)
#else
#define KM4_IMG1_SIZE KBYTES(28)
#endif
KM4_BOOTLOADER_RAM_S (rwx) : ORIGIN = KM4_IMG1_RAM_SATRT + SECURE_ADDR_OFFSET + IMAGE_HEADER_LEN, LENGTH = KM4_IMG1_SIZE - IMAGE_HEADER_LEN
在 menuconfig 中配置 CONFIG Link Option 选项, bootloader 占用 RAM 空间会随之调整:
选择 IMG1 –> FLASH 时,
KM4_BOOTLOADER_RAM_S
预设为 4KB选择 IMG1 –> SARM 时,
KM4_BOOTLOADER_RAM_S
预设为 28KB
如需扩大 KM4_BOOT_RAM_S
,需确保调整后的尺寸为 4KB 对齐(MPC 保护以 4KB 为单位)。
在 ameba_layout.ld
有如下定义:
KM4_BOOTLOADER_RAM_S (rwx) : ORIGIN = 0x30003020, LENGTH = 0x30014000 - 0x30003020
在 ameba_layout.ld
有如下定义:
#if defined(CONFIG_IMG1_FLASH)
#define KM4TZ_IMG1_SIZE KBYTES(4)
#else
#define KM4TZ_IMG1_SIZE KBYTES(32)
#endif
KM4TZ_BOOTLOADER_RAM_S (rwx) : ORIGIN = KM4TZ_IMG1_RAM_SATRT + SECURE_ADDR_OFFSET + IMAGE_HEADER_LEN, LENGTH = KM4TZ_IMG1_SIZE - IMAGE_HEADER_LEN
在 menuconfig 中配置 CONFIG Link Option 选项, bootloader 占用 RAM 空间会随之调整:
选择 IMG1 –> FLASH 时,
KM4TZ_BOOTLOADER_RAM_S
预设为 4KB选择 IMG1 –> SARM 时,
KM4TZ_BOOTLOADER_RAM_S
预设为 32KB
如需扩大 KM4TZ_BOOTLOADER_RAM_S
,需确保调整后的尺寸为 4KB 对齐(MPC 保护以 4KB 为单位)。
BD_RAM 和 BD_PSRAM
BD_RAM
在 ameba_layout.ld
中有如下定义:
#define RAM_KM4_IMG3_SIZE KBYTES(44)
#define RAM_KM0_IMG2_SIZE KBYTES(96)
#define KM4_IMG2_RAM_START (KM4_RAM_TZ_SECURE_START + RAM_KM4_IMG3_SIZE)
#define KM0_IMG2_RAM_START (SRAM_END - RAM_KM0_IMG2_SIZE)
KM4_BD_RAM (rwx) : ORIGIN = KM4_IMG2_RAM_START + IMAGE_HEADER_LEN, LENGTH = KM0_IMG2_RAM_START - KM4_IMG2_RAM_START - IMAGE_HEADER_LEN
KM0_BD_RAM (rwx) : ORIGIN = KM0_IMG2_RAM_START + IMAGE_HEADER_LEN, LENGTH = RAM_KM0_IMG2_SIZE - IMAGE_HEADER_LEN
除 Fixed RAM 以及 IMG1 所占用空间外,剩余的 SRAM 空间分配给 KM4_IMG3, KM0_IMG2, 以及 KM4_IMG2。
ameba_layout.ld
中已通过RAM_KM4_IMG3_SIZE
定义 KM4_IMG3 占用的 SRAM 空间大小,通过RAM_KM0_IMG2_SIZE
定义 KM0_IMG2 占用的 SRAM 大小,剩余的空间用作 KM4_IMG2,用户可以根据实际需求调整相应的值。
BD_PSRAM
在 ameba_layout.ld
中有如下定义:
#define PSRAM_BASE (0x60000000)
#define PSRAM_END (0x60400000)
#define PSRAM_KM4_IMG3_SIZE KBYTES(44)
#define PSRAM_KM4_IMG2_SIZE (KBYTES(3220) - (PSRAM_TZ_NSC_SIZE + PSRAM_TZ_ENTRY_SIZE + PSRAM_KM4_IMG3_SIZE))
#define KM4_IMG2_PSRAM_START (KM4_PSRAM_TZ_SECURE_START + PSRAM_KM4_IMG3_SIZE)
#define KM0_IMG2_PSRAM_START (KM4_IMG2_PSRAM_START + PSRAM_KM4_IMG2_SIZE)
#define PSRAM_KM0_IMG2_SIZE (PSRAM_END - KM0_IMG2_PSRAM_START)
KM4_BD_PSRAM (rwx) : ORIGIN = KM4_IMG2_PSRAM_START + IMAGE_HEADER_LEN, LENGTH = PSRAM_KM4_IMG2_SIZE - IMAGE_HEADER_LEN
KM0_BD_PSRAM (rwx) : ORIGIN = KM0_IMG2_PSRAM_START + IMAGE_HEADER_LEN, LENGTH = PSRAM_KM0_IMG2_SIZE - IMAGE_HEADER_LEN
PSRAM 的空间依次分配给 KM4_IMG3, KM4_IMG2, KM0_IMG2,PSRAM 的起始和结束地址分别由
PSRAM_BASE
和PSRAM_END
定义,默认大小为 4MB。 起始地址PSRAM_BASE
为固定值,用户可根据实际 PSRAM 大小调整结束地址PSRAM_END
的值 。如需调整
PSRAM_BASE
到PSRAM_END
之间的空间分配,请通过PSRAM_KM4_IMG3_SIZE
调整 KM4_IMG3 的大小,通过PSRAM_KM4_IMG2_SIZE
调整 KM4_IMG2 的大小,剩余的空间将全部分配给 KM0_IMG2。PSRAM_END
之后的空间(如有)可作为拓展 heapxxx_PSRAM_HEAP_EXT
使用,默认未启用。
BD_RAM
在 ameba_layout.ld
中有如下定义:
#if defined(CONFIG_AP_CORE_KM4)
#define RAM_KR4_IMG2_SIZE KBYTES(96)
#define KM4_IMG2_RAM_START (KM4_RAM_TZ_SECURE_START + RAM_KM4_IMG3_SIZE)
#define KR4_IMG2_RAM_START (SRAM_END - RAM_KR4_IMG2_SIZE)
#define RAM_KM4_IMG2_SIZE (KR4_IMG2_RAM_START - KM4_IMG2_RAM_START)
#else
#define RAM_KM4_IMG2_SIZE KBYTES(96)
#define KM4_IMG2_RAM_START (KM4_RAM_TZ_SECURE_START + RAM_KM4_IMG3_SIZE)
#define KR4_IMG2_RAM_START (KM4_IMG2_RAM_START + RAM_KM4_IMG2_SIZE)
#define RAM_KR4_IMG2_SIZE (SRAM_END - KR4_IMG2_RAM_START)
#endif
KM4_BD_RAM
和KR4_BD_RAM
分配 IMG1,Fixed RAM 外,全部剩余的 SRAM 空间,修改RAM_KR4_IMG2_SIZE
或RAM_KM4_IMG2_SIZE
的值,可以调整KM4_BD_RAM
和KR4_BD_RAM
的空间分配。
BD_PSRAM
在 ameba_layout.ld
中有如下定义:
#define PSRAM_BASE (0x60000000)
#define PSRAM_DSP_START (0x60300000)
#define PSRAM_KM4_IMG3_SIZE KBYTES(44)
#define PSRAM_KM4_IMG2_SIZE (KBYTES(1536) - (PSRAM_TZ_NSC_SIZE + PSRAM_TZ_ENTRY_SIZE + PSRAM_KM4_IMG3_SIZE))
#define KM4_IMG2_PSRAM_START (KM4_PSRAM_TZ_SECURE_START + PSRAM_KM4_IMG3_SIZE)
#define KR4_IMG2_PSRAM_START (KM4_IMG2_PSRAM_START + PSRAM_KM4_IMG2_SIZE)
#define PSRAM_KR4_IMG2_SIZE (PSRAM_DSP_START - KR4_IMG2_PSRAM_START)
KM4_BD_PSRAM (rwx) : ORIGIN = KM4_IMG2_PSRAM_START + IMAGE_HEADER_LEN, LENGTH = PSRAM_KM4_IMG2_SIZE - IMAGE_HEADER_LEN
KR4_BD_PSRAM (rwx) : ORIGIN = KR4_IMG2_PSRAM_START + IMAGE_HEADER_LEN, LENGTH = PSRAM_KR4_IMG2_SIZE - IMAGE_HEADER_LEN
PSRAM_BASE
到PSRAM_DSP_START
之间的空间依次分配给 KM4_IMG3, KM4_IMG2 以及 KR4_IMG2。 如需调整空间分配,请通过PSRAM_KM4_IMG3_SIZE
调整 KM4_IMG3 的大小,通过PSRAM_KM4_IMG2_SIZE
调整 KM4_IMG2 的大小,剩余的空间将全部分配给 KR4_IMG2。PSRAM_DSP_START
以后的空间可作为拓展 heap 使用,也可以调整PSRAM_DSP_START
的值将空间合并到BD_PSRAM
,注意PSRAM_DSP_START
的值不要超出 PSRAM 的物理地址范围。
BD_PSRAM
在 ameba_layout.ld
中有如下定义:
#define PSRAM_BASE (0x60000000)
#define PSRAM_DSP_START (0x60300000)
#define PSRAM_END (0x60400000)
#define PSRAM_KM4_IMG3_SIZE KBYTES(44)
#define PSRAM_KM4_IMG2_SIZE (KBYTES(1536) - (PSRAM_TZ_NSC_SIZE + PSRAM_TZ_ENTRY_SIZE + PSRAM_KM4_IMG3_SIZE))
#define KM4_IMG2_PSRAM_START (KM4_PSRAM_TZ_SECURE_START + PSRAM_KM4_IMG3_SIZE)
#define KR4_IMG2_PSRAM_START (KM4_IMG2_PSRAM_START + PSRAM_KM4_IMG2_SIZE)
#define PSRAM_KR4_IMG2_SIZE (PSRAM_DSP_START - KR4_IMG2_PSRAM_START)
KM4_BD_PSRAM (rwx) : ORIGIN = KM4_IMG2_PSRAM_START + IMAGE_HEADER_LEN, LENGTH = PSRAM_KM4_IMG2_SIZE - IMAGE_HEADER_LEN
KR4_BD_PSRAM (rwx) : ORIGIN = KR4_IMG2_PSRAM_START + IMAGE_HEADER_LEN, LENGTH = PSRAM_KR4_IMG2_SIZE - IMAGE_HEADER_LEN
PSRAM_BASE
到PSRAM_DSP_START
之间的空间依次分配给 KM4_IMG3, KM4_IMG2 以及 KR4_IMG2。 如需调整空间分配,请通过PSRAM_KM4_IMG3_SIZE
调整 KM4_IMG3 的大小,通过PSRAM_KM4_IMG2_SIZE
调整 KM4_IMG2 的大小,剩余的空间将全部分配给 KR4_IMG2。PSRAM_DSP_START
到PSRAM_END
之间空间分配给 DSP 使用,可根据实际 PSRAM 容量调整PSRAM_END
的值。PSRAM_END
之后的空间(如有)可作为拓展 heapxxx_PSRAM_HEAP_EXT
使用,默认未启用。
BD_PSRAM
在 ameba_layout.ld
中有如下定义:
#define PSRAM_BASE (0x60000000)
#define PSRAM_DSP_START (0x60300000)
#define PSRAM_END (0x60400000)
#define PSRAM_KM4_IMG3_SIZE KBYTES(44)
#define PSRAM_KM4_IMG2_SIZE (KBYTES(1536) - (PSRAM_TZ_NSC_SIZE + PSRAM_TZ_ENTRY_SIZE + PSRAM_KM4_IMG3_SIZE))
#define KM4_IMG2_PSRAM_START (KM4_PSRAM_TZ_SECURE_START + PSRAM_KM4_IMG3_SIZE)
#define KR4_IMG2_PSRAM_START (KM4_IMG2_PSRAM_START + PSRAM_KM4_IMG2_SIZE)
#define PSRAM_KR4_IMG2_SIZE (PSRAM_DSP_START - KR4_IMG2_PSRAM_START)
KM4_BD_PSRAM (rwx) : ORIGIN = KM4_IMG2_PSRAM_START + IMAGE_HEADER_LEN, LENGTH = PSRAM_KM4_IMG2_SIZE - IMAGE_HEADER_LEN
KR4_BD_PSRAM (rwx) : ORIGIN = KR4_IMG2_PSRAM_START + IMAGE_HEADER_LEN, LENGTH = PSRAM_KR4_IMG2_SIZE - IMAGE_HEADER_LEN
PSRAM_BASE
到PSRAM_DSP_START
之间的空间依次分配给 KM4_IMG3, KM4_IMG2 以及 KR4_IMG2。 如需调整空间分配,请通过PSRAM_KM4_IMG3_SIZE
调整 KM4_IMG3 的大小,通过PSRAM_KM4_IMG2_SIZE
调整 KM4_IMG2 的大小,剩余的空间将全部分配给 KR4_IMG2。PSRAM_DSP_START
到PSRAM_END
之间空间分配给 DSP 使用,可根据实际 PSRAM 容量调整PSRAM_END
的值。PSRAM_END
之后的空间(如有)可作为拓展 heapxxx_PSRAM_HEAP_EXT
使用,默认未启用。
BD_RAM
在 ameba_layout.ld
中有如下定义:
KM4_BD_RAM (rwx) : ORIGIN = 0x20014020, LENGTH = 0x2001B000 - 0x20014020
KM0_BD_RAM (rwx) : ORIGIN = 0x23002020, LENGTH = 0x2301FD00 - 0x23002020
BD_PSRAM
在 ameba_layout.ld
中有如下定义:
#if CONFIG_IMG2_FLASH
KM4_BD_DRAM (rwx) : ORIGIN = 0x60000020, LENGTH = 0x60060000 - 0x60000020
CA32_BL3_DRAM_NS (rwx) : ORIGIN = 0x60094000, LENGTH = PSRAM_END - 0x60094000
#else
KM4_BD_RAM_S (rwx) : ORIGIN = 0x70160020, LENGTH = 0x70180000 - 0x70160020
CA32_BL3_DRAM_NS (rwx) : ORIGIN = 0x60300000, LENGTH = 0x60700000 - 0x60300000
#endif
BD_RAM
在 ameba_layout.ld
中有如下定义:
#define RAM_KM4TZ_IMG3_SIZE KBYTES(44)
#define RAM_KM4NS_IMG2_SIZE KBYTES(192)
#define KM4TZ_IMG2_RAM_START (KM4TZ_RAM_TZ_SECURE_START + RAM_KM4TZ_IMG3_SIZE)
#define KM4NS_IMG2_RAM_START (SRAM_END - RAM_KM4NS_IMG2_SIZE)
KM4TZ_BD_RAM (rwx) : ORIGIN = KM4TZ_IMG2_RAM_START + IMAGE_HEADER_LEN, LENGTH = KM4NS_IMG2_RAM_START - KM4TZ_IMG2_RAM_START - IMAGE_HEADER_LEN
KM4NS_BD_RAM (rwx) : ORIGIN = KM4NS_IMG2_RAM_START + IMAGE_HEADER_LEN, LENGTH = RAM_KM4NS_IMG2_SIZE - IMAGE_HEADER_LEN
除 Fixed RAM 以及 IMG1 所占用空间外,剩余的 SRAM 空间分配给 KM4TZ_IMG3, KM4NS_IMG2, 以及 KM4TZ_IMG2。
ameba_layout.ld
中已通过RAM_KM4TZ_IMG3_SIZE
定义 KM4_IMG3 占用的 SRAM 空间大小,通过RAM_KM4NS_IMG2_SIZE
定义 KM4NS_IMG2 占用的 SRAM 大小,剩余的空间用作 KM4TZ_IMG2,用户可以根据实际需求调整相应的值。
BD_PSRAM
在 ameba_layout.ld
中有如下定义:
#define PSRAM_BASE (0x60000000)
#define PSRAM_END (0x60400000)
#define PSRAM_KM4TZ_IMG3_SIZE KBYTES(128)
#define PSRAM_KM4TZ_IMG2_SIZE (KBYTES(3220) - (PSRAM_TZ_NSC_SIZE + PSRAM_TZ_ENTRY_SIZE + PSRAM_KM4TZ_IMG3_SIZE))
#define KM4TZ_IMG2_PSRAM_START (KM4TZ_PSRAM_TZ_SECURE_START + PSRAM_KM4TZ_IMG3_SIZE)
#define KM4NS_IMG2_PSRAM_START (KM4TZ_IMG2_PSRAM_START + PSRAM_KM4TZ_IMG2_SIZE)
#define PSRAM_KM4NS_IMG2_SIZE (PSRAM_END - KM4NS_IMG2_PSRAM_START)
KM4TZ_BD_PSRAM (rwx) : ORIGIN = KM4TZ_IMG2_PSRAM_START + IMAGE_HEADER_LEN, LENGTH = PSRAM_KM4TZ_IMG2_SIZE - IMAGE_HEADER_LEN /* KM4TZ BD PSRAM : Tz off,3220K; TZ on, 3072K */
KM4NS_BD_PSRAM (rwx) : ORIGIN = KM4NS_IMG2_PSRAM_START + IMAGE_HEADER_LEN, LENGTH = PSRAM_KM4NS_IMG2_SIZE - IMAGE_HEADER_LEN
PSRAM 的空间依次分配给 KM4TZ_IMG3, KM4TZ_IMG2, KM4NS_IMG2,PSRAM 的起始和结束地址分别由
PSRAM_BASE
和PSRAM_END
定义,默认大小为 4MB。 起始地址PSRAM_BASE
为固定值,用户可根据实际 PSRAM 大小调整结束地址PSRAM_END
的值 。如需调整
PSRAM_BASE
到PSRAM_END
之间的空间分配,请通过PSRAM_KM4TZ_IMG3_SIZE
调整 KM4TZ_IMG3 的大小,通过PSRAM_KM4TZ_IMG2_SIZE
调整 KM4TZ_IMG2 的大小,剩余的空间将全部分配给 KM4NS_IMG2。PSRAM_END
之后的空间(如有)可作为拓展 heapxxx_PSRAM_HEAP_EXT
使用,默认未启用。
堆内存(Heap)
调整 HEAP 大小
BD_RAM 和 BD_PSRAM 加载完静态区域后的剩余空间都将作为 heap 使用,因此可通过调整 BD_RAM 和 BD_PSRAM 的区域来扩大或缩小对应 MCU 的 heap 空间,调整方法参考 BD_RAM 和 BD_PSRAM
将空闲的 PSRAM 地址定义到
xxx_PSRAM_HEAP_EXT
以使能 PSRAM_HEAP_EXT 区域:默认的 PSRAM_HEAP_EXT 的区域为无效值:
xxx_PSRAM_HEAP_EXT (rwx) : ORIGIN = 0x6FFFFFFF, LENGTH = 0x6FFFFFFF - 0x6FFFFFFF /* PSRAM HEAP EXT */
可以将空闲的 PSARM 区域(如存在, 以
0x60400000 ~ 0x60800000
为例)定义到:xxx_PSRAM_HEAP_EXT (rwx) : ORIGIN = 0x60400000, LENGTH = 0x60800000 - 0x60400000 /* PSRAM HEAP EXT */
备注
可以在
xxx_gcc_project/project_xx/xsdk/image/target_img2.map
中查看__bdram_heap_buffer_size__
,__psram_heap_buffer_size__
,__psram_heap_extend_size__
来获取对应 HEAP 区域的实际空间。当 menuconfig 选中 ALL PSRAM USED FOR APPLICATION HEAP 时, PSARM_BDRAM 与 PSRAM_HEAP_EXT 的定义无效,PSRAM 的整个区域将直接划分给 application 的 heap 使用。
API 参考
MALLOC_TYPES
typedef enum {
TYPE_TCM = 0,
TYPE_SRAM,
TYPE_DRAM,
TYPE_ALL
} MALLOC_TYPES;
内存类型:
- TYPE_TCM:
可从 TCM, SRAM, DRAM 类型的内存中申请(如有), 即可以申请从
0x00000000
开始的内存地址。- TYPE_SRAM:
不可从 TCM 中申请内存,仅可从 SRAM, DRAM 中申请(如有),即可以申请从
0x20000000
开始的内存地址。- TYPE_DRAM:
不可从 TCM,SRAM 中申请内存,仅可从 DRAM 中申请(如有),即可以申请从
0x60000000
开始的内存地址。- TYPE_ALL:
无限制,可以申请从
0x00000000
开始的内存地址。
malloc
void *rtos_mem_malloc(uint32_t size);
从初始化好的 heap 区域中申请一块内存空间,无内存类型限制。
参数:
- size:
申请内存块的大小
返回值: 指向内存块起始地址的指针
void *rtos_heap_types_malloc(uint32_t size, MALLOC_TYPES type);
从初始化好的 heap 区域中申请一块内存空间,仅可申请指定内存类型的内存块。
参数:
- size:
申请内存块的大小
- type:
内存类型
返回值: 指向内存块起始地址的指针
zmalloc
void *rtos_mem_zmalloc(uint32_t size);
从初始化好的 heap 区域中申请一块内存空间,并将分配的内存初始化为 0。无内存类型限制。
参数:
- size:
申请内存块的大小
返回值: 指向内存块起始地址的指针
void *rtos_heap_types_zmalloc(uint32_t size, MALLOC_TYPES type);
从初始化好的 heap 区域中申请一块内存空间,并将分配的内存初始化为 0。仅可申请指定内存类型的内存块。
参数:
- size:
申请内存块的大小
- type:
内存类型
返回值: 指向内存块起始地址的指针
calloc
void *rtos_mem_calloc(uint32_t elementNum, uint32_t elementSize);
从初始化好的 heap 区域中申请一块内存空间,用于存储 num 个大小为 size 的元素,并将分配的内存初始化为 0。无内存类型限制。
参数:
- elementNum:
元素数量
- elementSize:
单个元素的大小
返回值: 指向内存块起始地址的指针
void *rtos_heap_types_calloc(uint32_t elementNum, uint32_t elementSize, MALLOC_TYPES type);
从初始化好的 heap 区域中申请一块内存空间,用于存储 num 个大小为 size 的元素,并将分配的内存初始化为 0。仅可申请指定内存类型的内存块。
参数:
- elementNum:
元素数量
- elementSize:
单个元素的大小
- type:
内存类型
返回值: 指向内存块起始地址的指针
realloc
void *rtos_mem_realloc(void *ptr, uint32_t new_size);
调整之前分配的内存块的大小。如果新的内存块大于原内存块,新增部分的内容不会被初始化。若无法在原位置扩展,则会尝试移动整个内存块到新位置并释放旧内存。无内存类型限制。
参数:
- ptr:
指向已分配内存块的指针
- new_size:
新的内存块大小
返回值: 指向重新分配后的内存块起始地址的指针,失败时返回 NULL(原始内存未释放)
void *rtos_heap_types_realloc(void *ptr, uint32_t new_size, MALLOC_TYPES type);
调整之前分配的内存块的大小。如果新的内存块大于原内存块,新增部分的内容不会被初始化。若无法在原位置扩展,则会尝试移动整个内存块到新位置并释放旧内存。仅可申请指定内存类型的内存块。
参数:
- ptr:
指向已分配内存块的指针
- new_size:
新的内存块大小
- type:
内存类型
返回值: 指向重新分配后的内存块起始地址的指针,失败时返回 NULL(原始内存未释放)
free
void rtos_mem_free(void *pbuf);
void rtos_heap_types_free(void *pbuf);
释放内存块。
参数:
- pbuf:
指向带释放内存块起始地址的指针
返回值: 无