12 Star 9 Fork 0

wicom-ingenic / OpenHarmony

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
memory.md 4.64 KB
一键复制 编辑 原始数据 按行查看 历史

系统平台内存分配

1. 简介

本文对系统平台的内存分配进行简单介绍。

综合全文,Halley5 通常占用 86 MiB, Hippo 通常占用 182 MiB。

2. 系统内存

君正芯片通常使用内置 DDR,不同的芯片型号对应不同大小的内存,参考下表所示

芯片型号 开发板型号 内存大小
X2000 Halley5 128MiB
X2500 Hippo 256MiB

2.1 镜像占用内存

通常情况下,OpenHarmony / LVGL 等 Linux 内核的操作系统镜像及其它必须内存会占用 10 MiB 左右,这一部分对于内存操作系统是不可见的。

此时启动内核进入文件系统 free 查看系统内存只能看到 (DDR总大小 - 10) ~= 可见内存总大小。

2.2 内核驱动占用内存

通常情况下,内核系统默认会加载许多驱动,如 nand、wifi 等驱动,这些驱动一般会占用 30 MiB 左右通用内存。

此时 free 查看系统可用内存为 (DDR总大小 - 10 - 30)。

2.3 应用及框架占用内存

通常情况下,应用启动完成后所依赖的框架及其他服务一般占用 30 MiB 左右通用内存,这个数值根据平台和应用的不同大约有 10 MiB 波动。

此时 free 查看系统可用内存为 (DDR总大小 - 10 - 30 - 30)。

3. 设备内存

根据开发板设计以及业务逻辑的不同,用户需要专门为 DPU、VPU、ISP 等硬件预留物理连续的设备内存,这一部分内存通常需要根据设备分辨率进行资源占用。

注意设备内存通常由对齐要求,实际预留内存时需要考虑每个缓冲 buffer 的对齐关系,额外预留一些对齐所需空间。

3.1 NPU

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)。

  • 请注意芯片是否支持 NPU 模块

3.2 DPU

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)。

3.3 ISP

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)。

3.4 VPU

vpu 模块的申请方式和计算公式与 isp 模块相同,其中分辨率需要修改为支持的视频分辨率。

通常情况下,视频分辨率会等于屏幕分辨率或者屏幕窗口分辨率,所以预留内存 ~= 12 MiB。

此时 free 查看系统内存只能看到 (DDR总大小 - 10 - (48) - 18 - 12) ~= 可见内存总大小。 此时 free 查看系统可用内存为 (DDR总大小 - 10 - 30 - 30 (- 48) - 16 - 18 - 12)。

4. 内存优化

由于业务逻辑中 ISP 预留内存和 VPU 预留内存一般不会同时使用,且实际产品会去除内核中为调试预留的部分内存,通常能够节约 10 ~ 20 MiB 内存空间。

马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/wicom-ingenic/openharmony.git
git@gitee.com:wicom-ingenic/openharmony.git
wicom-ingenic
openharmony
OpenHarmony
master

搜索帮助

344bd9b3 5694891 D2dac590 5694891