本文对系统平台的内存分配进行简单介绍。
综合全文,Halley5 通常占用 86 MiB, Hippo 通常占用 182 MiB。
君正芯片通常使用内置 DDR,不同的芯片型号对应不同大小的内存,参考下表所示
芯片型号 | 开发板型号 | 内存大小 |
---|---|---|
X2000 | Halley5 | 128MiB |
X2500 | Hippo | 256MiB |
通常情况下,OpenHarmony / LVGL 等 Linux 内核的操作系统镜像及其它必须内存会占用 10 MiB 左右,这一部分对于内存操作系统是不可见的。
此时启动内核进入文件系统 free 查看系统内存只能看到 (DDR总大小 - 10) ~= 可见内存总大小。
通常情况下,内核系统默认会加载许多驱动,如 nand、wifi 等驱动,这些驱动一般会占用 30 MiB 左右通用内存。
此时 free 查看系统可用内存为 (DDR总大小 - 10 - 30)。
通常情况下,应用启动完成后所依赖的框架及其他服务一般占用 30 MiB 左右通用内存,这个数值根据平台和应用的不同大约有 10 MiB 波动。
此时 free 查看系统可用内存为 (DDR总大小 - 10 - 30 - 30)。
根据开发板设计以及业务逻辑的不同,用户需要专门为 DPU、VPU、ISP 等硬件预留物理连续的设备内存,这一部分内存通常需要根据设备分辨率进行资源占用。
注意设备内存通常由对齐要求,实际预留内存时需要考虑每个缓冲 buffer 的对齐关系,额外预留一些对齐所需空间。
npu 模块目前在 uboot bootargs 中划分预留内存,大小为 48 MiB,系统启动后这部分内存不可见。
//device/ingenic/src/u-boot/include/configs/hippo.h
#define BOOTARGS_COMMON LINUX_LOGLEVEL " console=ttyS1,115200n8 mem=208M@0x0 nmem=48M@0xD000000 "
//其中 nmem 即表示 npu 预留内存
此时启动内核进入文件系统 free 查看系统内存只能看到 (DDR总大小 - 10 - 48) ~= 可见内存总大小。 此时 free 查看系统可用内存为 (DDR总大小 - 10 - 30 - 30 - 48)。
dpu 模块目前通过 dts 设备树文件和 kernel defconfig 共同控制设备预留内存大小,这部分内存占用的是通用内存。
//defconfig
CONFIG_FB_INGENIC_NR_FRAMES=3
//dts
ingenic,layer-frames
//以上两个参数控制预留内存个数,将取其中的最小值生效
内存计算公式: rgba format * fb_width * fb_height * fb_number (+ nv12 format * fb_width * fb_height * fb_number)。
以 OpenHarmony 平台 Halley5 为例,使用一层 rgba layer + 一层 nv12 layer,每层各预留 3 个缓冲 buffer, 则 DPU 内存为 128072043 + 12807201.53 ~= 16 MiB
此时 free 查看系统可用内存为 (DDR总大小 - 10 - 30 - 30 (- 48) - 16)。
isp 模块目前通过 dts 设备树文件预留内存大小,系统启动后这部分内存不可见。
//dts
reserved_memory: reserved_mem@0x8f00000{
compatible = "shared-dma-pool";
reg = <0x08f00000 0x4000000>;
};
//其中@0x8f00000 需要和 reg 第一个参数保持统一
//reg 第一个参数 = (DDR总大小 - 其他不可见预留大小 - reg第二个参数),第二个参数表示要预留的内存大小
//更具体的参数含义可以查找网络资料 - "dma reserved-memory"
通常 isp 需要预留的内存计算公式为: nv12_format * cam_width * cam_height * 6。
以 OpenHarmony 平台 Halley5 为例,Camera 默认分辨率为 1920*1080,所以预留内存 ~= 18 MiB。
注意由于 isp 模块内部有一些额外的缓冲 buffer 开销,所以当 v4l2 接口申请内存失败时,请适当扩大 isp 预留内存 4 ~ 6 MiB。
此时 free 查看系统内存只能看到 (DDR总大小 - 10 - (48) - 18) ~= 可见内存总大小。 此时 free 查看系统可用内存为 (DDR总大小 - 10 - 30 - 30 (- 48) - 16 - 18)。
vpu 模块的申请方式和计算公式与 isp 模块相同,其中分辨率需要修改为支持的视频分辨率。
通常情况下,视频分辨率会等于屏幕分辨率或者屏幕窗口分辨率,所以预留内存 ~= 12 MiB。
此时 free 查看系统内存只能看到 (DDR总大小 - 10 - (48) - 18 - 12) ~= 可见内存总大小。 此时 free 查看系统可用内存为 (DDR总大小 - 10 - 30 - 30 (- 48) - 16 - 18 - 12)。
由于业务逻辑中 ISP 预留内存和 VPU 预留内存一般不会同时使用,且实际产品会去除内核中为调试预留的部分内存,通常能够节约 10 ~ 20 MiB 内存空间。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。