Flash&DDR使用参考


1. Flash的分区查看与配置


1.1. 查看分区配置的方法

  1. 编译阶段

    编译完工程之后,会在生成image的目录生成partition_layout.txt,可以看到image的分区布局:

  2. kernel阶段

    kernel起来后可以通过命令cat /proc/mtd 查看

  3. boot阶段

    在uboot控制台下可以通过命令mtdpart


1.2. 修改分区大小

  1. 找到项目使用的对应分区config文件

    如下图,找到 IMAGE_CONFIG变量指定的分区配置config,这里用spinand.ubifs.partition.dualenv.dispcam.config举例(目录:project\image\configs\p3\spinand.ubifs.partition.dualenv.dispcam.config)

  2. 打开分区配置config,这里拿kernel分区为例,如下图,修改*$(PATSIZE) 制定的大小值即可

    注意:因为flash的物理特性,一般情况下擦除只能按照一个block为单位,所以分区配置要要按block大小对齐(nand flash 分区大小需按照128K对齐,nor flash按照64K对齐)


2. DDR的内存查看与配置

  1. 平台内存的组成方式

    DDR总内存 = linux内存 + kernel reserved部分内存 (包含MMA)

  2. 查看内存的方法

    1. 查看linux内存

      为了准确的查看内存的MemFree,建议查看前先执行:echo 3 >/proc/sys/vm/drop_caches  ,然后再cat /proc/meminfo

      如下图,MemTotal代表的是linux的总内存大小,MemFree就是空闲内存

    2. 查看MMA内存

      如下图,length代表分配的MMA总大小为 0x1e00000 Byte,其中MMA剩余的内存为:chunk_mgr_avail = 0x132d000 Byte  = 30M

  3. 配置MMA内存大小的方法

    1. 项目工程中,打开项目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)

    2. 在debug过程中,可以在boot控制台直接修改板子上的bootargs参数,saveenv之后reset重启即可生效,如下图

  4. 如何判断MMA/Linux 不足够

    1. 如果log出现MmaAlloc fail等字样,说明MMA内存可能不够,要确认问题,可以在出现问题之前:echo 3  > /proc/mi_moudles/mi_sys/debug_level  调高sys的debug level,出现问题的时候就会在串口打印出问题时MMA debug信息

    2. 如果是Liunx内存不足,一般会出现OOM,OOM会kill掉某些应用,log产生backtrace信息

  5. 实际程序运行中,项目上遇到内存相关的问题需要怎么debug?

    项目上,只有通过调节MMA的内存大小,来合理的均衡MMA跟linux的可用内存之间的大小,内存相关的问题可以按照以下步骤的顺序按步确认。

    1. 确定是否存在有泄漏问题?如果存在可用内存不断减少的情况,请先解决内存泄漏问题;

    2. 是否存在Out of Memory的情况?如果出现这种情况,说明内存不足,如果MMA有剩余可以考虑将MMA的内存分配减小,相应的减小部分就会增加到linux 内存部分;

    3. 是否出现MmaAlloc fail相关的MMA申请错误字样?如果出现这种情况,说明该使用场景下,MMA的内存大小不足于支持,如果linux部分Memory有剩余,可以增大MMA部分内存

    4. 在没有出现内存泄漏,且linux内存跟MMA内存互相均衡的情况下,内存依旧不足够使用?如果出现这种情况,只能考虑做下功能裁剪或者更换内存更大的DDR