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