SSD_Flash&DDR使用参考
1. Flash的分区查看与配置¶
1.1. 查看分区配置的方法¶
-
编译阶段
编译完工程之后,会在生成image的目录生成
partition_layout.txt
,可以看到image的分区布局: -
kernel阶段
kernel起来后可以通过命令
cat /proc/mtd
查看 -
boot阶段
在uboot控制台下可以通过命令
mtdpart
1.2. 修改分区大小¶
-
找到项目使用的对应分区config文件
如下图,找到 IMAGE_CONFIG变量指定的分区配置config,这里用spinand.ubifs.partition.dualenv.dispcam.config举例(目录:project\image\configs\p3\spinand.ubifs.partition.dualenv.dispcam.config)
-
打开分区配置config,这里拿kernel分区为例,如下图,修改*$(PATSIZE)制定的大小值
注意:由于flash的物理特性,一般擦除时只能以一个block为单位,分区配置要按block大小对齐(nand flash 分区大小需按照128K对齐,nor flash按照64K对齐)
2. DDR的内存查看与配置¶
-
平台内存的组成方式
DDR总内存 = linux内存 + kernel reserved部分内存 (包含MMA)
-
查看内存的方法
-
查看linux内存
为了准确的查看内存的MemFree,建议查看前先执行:
echo 3 >/proc/sys/vm/drop_caches
,然后再cat /proc/meminfo
如下图,MemTotal代表的是linux的总内存大小,MemFree就是空闲内存
-
查看MMA内存
如下图,length代表分配的MMA总大小为 0x1e00000 Byte,其中MMA剩余的内存为:chunk_mgr_avail = 0x132d000 Byte = 30M
-
-
配置MMA内存大小的方法
-
项目工程中,打开项目project的config(这里使用:configs/defconfigs/dispcam_p3_spinand.glibc-9.1.0-s01a.64.qfn128.demo_camera_defconfig)
如下图,找到文件中的CONFIG_KERNEL_BOOT_ENV,修改mma_heap_name0对应的sz(这里sz=0x1E00000 即30M大小的MMA)
-
在debug过程中,可以在boot控制台直接修改板子上的bootargs参数,saveenv之后reset重启即可生效,如下图
-
-
如何判断MMA/Linux 不足够
-
如果log出现MmaAlloc fail等字样,说明MMA内存可能不够,要确认问题,可以在出现问题之前:echo 3 > /proc/mi_moudles/mi_sys/debug_level 调高sys的debug level,出现问题的时候就会在串口打印出问题时MMA debug信息
-
如果是Liunx内存不足,一般会出现OOM,OOM会kill掉某些应用,log产生backtrace信息
-
-
实际程序运行中,项目上遇到内存相关的问题需要怎么debug?
项目上,通过调节MMA的内存大小来均衡MMA跟linux的可用内存,可以按照以下步骤确认。
-
确定是否存在有泄漏问题?如果存在可用内存不断减少的情况,请先解决内存泄漏问题;
-
是否存在Out of Memory的情况?如果出现这种情况,说明内存不足,如果MMA有剩余可以考虑将MMA的内存分配减小,相应的减小部分就会增加到linux 内存部分;
-
是否出现MmaAlloc fail相关的MMA申请错误字样?如果出现这种情况,说明该使用场景下,MMA的内存大小不足于支持,如果linux部分Memory有剩余,可以增大MMA部分内存
-
在没有出现内存泄漏,且linux内存跟MMA内存互相均衡的情况下,内存依旧不足够使用?如果出现这种情况,只能考虑做下功能裁剪或者更换内存更大的DDR
-