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