Skip to main content

AD100 预留内存使用说明

一 概述

预留内存的目的是根据各个场景的不同, 需要预留一些内存给一些功能单独使用, 方便使用以及调试, 各方面的预留内存可以让对应模块的内存申请独有化, 减少多次申请导致的内存碎片以及让调试过程中能更好的配置自己模块所需要的内存大小,提高整体的稳定性

  • VPU_MEM:h264解码

  • rmem:lcd, jpeg编解码, 2d

  • SHARE_MEM:共享内存,目前主要用于快启时rtos的显示

二 预留内存方式

2.1 rmem

说明:rmem的内存由libhardware2的rmem相关接口进行调用申请, 主要提供给一些需要申请大内存的驱动或场景使用

例如lcd, jpeg编解码, 2d, 应用层上还经常使用rmem的接口申请带有物理地址的内存, 用于给一些需要硬件参与的驱动直接调用

配置方法:位于bootloader/uboot-x2000/boards.cfg中配置, 在所用配置的options里加上RMEM_MB/KB=XXX

boards.cfg中使用的配置以ad100_evb_v10_nor_5.10_defconfig为例

bhu@bhu-PC:~/work/build/configs$ grep -nr "uboot" ad100_evb_v10_nor_5.10_defconfig
3:APP_uboot_toolchain_dir=../tools/toolchains/mips-gcc720-glibc229
4:APP_uboot_dir=../bootloader/uboot-x2000
5:APP_uboot_config=ad100_base_xImage_sfc_nor
ad100_base_xImage_sfc_nor        mips     xburst2    ad100_base       ingenic    ad100   ad100_base:AD100N_DDR,SPL_SFC_NOR,ENV_IS_IN_SFC,MTD_SFCNOR,SPL_OS_BOOT,NOR_SPL_BOOT_OS,RMEM_MB=8

iconfig配置:需要选中两个,第一个是驱动的选项,第二个是驱动对应的调用

2

3

查看:烧录进入板子后可通过cat /proc/cmdline查看配置的rmem

使用情况: 烧录进入板子后可通过cat /proc/rmem 查看rmem使用情况

计算方法:以下分别用上lcd, jpeg编解码, 2d时所需要的内存, 这里提供简单的基本算法,实际使用应该尽量往高一点计算

lcd为720p的屏幕, 并且fb只配置一层, 然后为2个buffer时

(720 ×1280 × 4) × 2 = 7372800 (lcd的内存是按ARGB的32位申请的,因此需要乘4)

4

计算方法:解码720p的视频,需要预留2帧NV12 缓存

frame_size = 1280 × 720 × 3 / 2 × 2= 2764800

jpeg解码需要输入源和输出源

输入 1280 × 720 = 921600 (jpeg图片最大按宽 * 高计算)

输出 1280 × 720 × 4 = 3686400 (ARGB的大小)

总大小为 921600 + 3686400 = 4608000

(多程序多线程调用时需要多一倍)

jpeg编码需要输入源和输出源

输入 1280 × 720 × 4 = 3686400 (ARGB的大小)

输出 1280 × 720 = 921600 (jpeg图片最大按宽 * 高计算)

总大小为 3686400 + 921600 = 4608000

(多程序多线程调用时需要多一倍)

2d的功能比较多,由各个功能不同决定内存大小不同,此处以旋转为例子 (2d的接口支持用已申请的物理地址进行运算, 例如当你直接将一个源旋转到lcd的物理地址上时,则可以免去目标地址的内存申请)

输入 1280 × 720 × 3 / 2 = 1382400 (旋转前的源大小)

输出 720 × 1280 × 3 / 2 = 1382400 (旋转后的目标大小)

总大小为 1382400 + 1382400 = 2764800

2.2 SHARE_MEM

说明:SHARE_MEM主要是快速启动时, 分配给rtos使用的显示内存, linux会接管

配置方法:位于bootloader/uboot-x2000/boards.cfg中配置,在所用配置的options里加上SHARE_MEM_MB/KB=XXX

1

查看:烧录进入板子后可通过在Linux系统里cat /proc/cmdline查看配置的SHARE_MEM_MB/KB

计算方法:根据fb驱动配置的帧数*分辨率

lcd为720p的屏幕, 并且fb只配置一层, 然后为2个buffer时

(720 × 1280 × 4) × 2 = 7372800 (lcd的内存是按ARGB的32位申请的,因此需要乘4)

2.3 VPU_MEM

说明:不同于RMEM, 该段内存主要用于给h264解码内存使用, h264解码是一个相对独立且内存消耗较大的驱动

单独用此功能分配内存可以更好的管理内存分配, 并且避免在使用内存较频繁之后产生内存碎片, 申请不到解码所需要的连续内存导致错误

配置方法:位于bootloader/uboot-x2000/boards.cfg中配置,在所用配置的options里加上VPU_MEM_MB/KB=XXX

kernel设备树dts文件解码配置使用VPU_MEM, dts文件查询, 以ad100_evb_v10_nor_5.10_defconfig为例

bhu@bhu-PC:~/ad100/build/configs$ grep -nr "kernel"  ad100_evb_v10_nor_5.10_defconfig 
6:APP_kernel_dir=../kernel/kernel
7:APP_kernel_config=ad100_module_base_linux_sfc_nor_defconfig
bhu@bhu-PC:~/ad100/build/configs$ grep -nr ".dts" ../../kernel/kernel/arch/mips/configs/ad100_module_base_linux_sfc_nor_defconfig
247:CONFIG_DT_AD100_MODULE_BASE_DTS_FILE="ad100_module_base.dts"

解码内存计算说明

    解码内存大小说明:(需要的最小值)

例如:1080p, 参考帧为(ref_frame_count)4 帧,没有 B 帧的视频解码,需要预留的内存大小:
dec_mem:
frame_size = 1920 * 1088 * 3 / 2 = 3133440; //h264解码宽高需要16位对齐,所以1080按1088计算
mb_size = (1920 / 16) * (1088 / 16) * 136 = 1109760 //固定计算公式
dec_mem = (ref_frame_count + 1) * (frame_size + mb_size) + 其他结构体 + 码流缓存 //其他结构体固定大小,码流缓存按最大1MB计算
= (4 + 1) * 4243200 + 360448 + 1048576
= 21.5M
同理算出720p需要内存为 = 10.3M
ps:
1.计算出来的内存为极限值,并且只对于h264解码,需要多预留
2.此为使用libhardware2 接口内存计算方式,若使用ffmpeg以ffmpeg实际使用为准
3.要想降低使用内存,则需要h264编码只采用 1 帧参考帧,这样1080p只需要 9.4M
4.ref_frame_count 可以使用 cmd_h264_parse 命令查看

dts 文件解码配置使用VPU_MEM


/* 加上 memory-region="cmdline,vpu_mem"; 表示会用命令行 cmdline 解析出来的 vpu_mem 的内存地址和大小作为内存申请,需要在 uboot 配置 VPU_MEM_MB/VPU_MEM_KB */

&felix {
status = "okay";
memory-region="cmdline,vpu_mem";
};

注:

  1. 计算出来的内存为参考,若视频有B帧, 需要更多内存
  2. 此为使用libhardware2 接口内存计算方式,若使用ffmpeg以ffmpeg实际使用为准
  3. 建议开始多给点内存,根据实际剩余内存,修改预留大小,实际剩余内存见第一次解码后的打印
# cmd_h264_decode  infile=/usr/data/1_360p.h264 width=640  height=360
[ 131.920557] max available: 22937600
[ 131.920802] min available: 22937600
[ 131.922487] min available: 21524480
[ 131.922735] min available: 21405696
[ 131.922971] min available: 21168128
[ 131.923205] min available: 21049344
[ 131.926647] min available: 21041152
[ 131.926893] min available: 20922368
[ 131.927129] min available: 20684800
[ 131.927363] min available: 20566016
[ 131.943413] min available: 20557824
[ 131.943660] min available: 20439040
[ 131.943897] min available: 20201472
[ 131.944131] min available: 20082688
[ 131.960334] min available: 20074496
[ 131.960582] min available: 19955712
[ 131.960818] min available: 19718144
[ 131.961052] min available: 19599360 //解码后实际剩余内存
[ 162.415004] step3 D-PHY PLL unlocked warning (This log can be temporarily ignored)