cypress-tp固件升级脚本及解决申请不到内存的方法

一,脚本:
adb remount        
set AP_IIC_DIR=D:         
adb push %AP_IIC_DIR%\Coolpad5310_JunDa_20140402_V6047.iic /data             
adb shell "sync && echo 1 > /proc/sys/vm/drop_caches && cat /data/Coolpad5310_JunDa_20140402_V6047.iic > /dev/cy8c242_ts"
adb reboot

注释:
set AP_IIC_DIR=D:        //iic存放路径
adb push %AP_IIC_DIR%\Coolpad5310_JunDa_20140402_V6047.iic /data            //push
sync   同步
echo 1 > /proc/sys/vm/drop_caches      释放内存
cat /data/Coolpad5310_JunDa_20140402_V6047.iic > /dev/cy8c242_ts    开始升级

cache释放:
To free pagecache:
echo 1 > /proc/sys/vm/drop_caches
To free dentries and inodes:
echo 2 > /proc/sys/vm/drop_caches
To free pagecache, dentries and inodes:
echo 3 > /proc/sys/vm/drop_caches
说明,释放前最好sync一下,防止丢数据

二,代码中解决申请不到内存的方法
在选择升级后,在huamobile_misc_write函数里面  fw->data = kzalloc(KB(180), GFP_KERNEL);  kzalloc空间的时候,会提示“Out of memory”,申请不到连续的内存空间。
当申请不到空间时,kernel log如下:
****************************************************************************************************************************************
<6>[01-02 00:01:38.710] TP_CY8C242_:huamobile_misc_open( )_1206_:
<6>[01-02 00:01:38.711] TP_CY8C242_:huamobile_misc_write( )_1238_:
<6>[01-02 00:01:38.711] TP_CY8C242_:huamobile_misc_write( )_1243_: kzalloc KB(180) = 184320
<4>[01-02 00:01:38.716] Thread-193: page allocation failure: order:6, mode:0xc0d0
<6>[01-02 00:01:38.736] [<c010ccb4>] (unwind_backtrace+0x0/0x138) from [<c02221d8>] (warn_alloc_failed+0xc4/0x12c)
<6>[01-02 00:01:38.736] [<c02221d8>] (warn_alloc_failed+0xc4/0x12c) from [<c0225b64>] (__alloc_pages_nodemask+0x6f0/0x944)
<6>[01-02 00:01:38.736] [<c0225b64>] (__alloc_pages_nodemask+0x6f0/0x944) from [<c0225dc8>] (__get_free_pages+0x10/0x50)
<6>[01-02 00:01:38.736] [<c0225dc8>] (__get_free_pages+0x10/0x50) from [<c0255a84>] (kmalloc_order_trace+0x24/0xd0)
<6>[01-02 00:01:38.736] [<c0255a84>] (kmalloc_order_trace+0x24/0xd0) from [<c053a438>] (huamobile_misc_write+0x108/0x150)
<6>[01-02 00:01:38.736] [<c053a438>] (huamobile_misc_write+0x108/0x150) from [<c025edec>] (vfs_write+0xa0/0x144)
<6>[01-02 00:01:38.736] [<c025edec>] (vfs_write+0xa0/0x144) from [<c025f078>] (sys_write+0x38/0x70)
<6>[01-02 00:01:38.736] [<c025f078>] (sys_write+0x38/0x70) from [<c0106720>] (ret_fast_syscall+0x0/0x30)
<6>[01-02 00:01:38.736] Mem-info:
<6>[01-02 00:01:38.736] Normal per-cpu:
<6>[01-02 00:01:38.736] CPU 0: hi: 186, btch: 31 usd: 31
<6>[01-02 00:01:38.736] active_anon:23178 inactive_anon:23403 isolated_anon:0
<6>[01-02 00:01:38.736] active_file:13290 inactive_file:13226 isolated_file:0
<6>[01-02 00:01:38.737] unevictable:266 dirty:3 writeback:0 unstable:0
<6>[01-02 00:01:38.737] free:2644 slab_reclaimable:2313 slab_unreclaimable:4288
<6>[01-02 00:01:38.737] mapped:17372 shmem:86 pagetables:2528 bounce:0
<6>[01-02 00:01:38.737] free_cma:187
<6>[01-02 00:01:38.737] Normal free:10576kB min:2624kB low:3280kB high:3936kB active_anon:92712kB inactive_anon:93612kB active_file:53160kB inactive_f
ile:52904kB unevictable:1064kB isolated(anon):0kB isolated(file):0kB present:430592kB mlocked:0kB dirty:12kB writeback:0kB mapped:69488kB shmem:344kB
slab_reclaimable:9252kB slab_unreclaimable:17152kB kernel_stack:7272kB pagetables:10112kB unstable:0kB bounce:0kB free_cma:748kB writeback_tmp:0kB pag
es_scanned:0 all_unreclaimable? no
<6>[01-02 00:01:38.737] lowmem_reserve[]: 0 0
<6>[01-02 00:01:38.737] Normal: 1454*4kB (EMRC) 301*8kB (UMRC) 97*16kB (UMC) 9*32kB (UMC) 0*64kB 0*128kB 0*256kB 1*512kB (C) 0*1024kB 0*2048kB 0*4096k
B = 10576kB
************************************************************************************************************************************************
解决方法,把 fw->data = kzalloc(KB(180), GFP_KERNEL); 改为:  fw->data = vmalloc(KB(180));  申请非连续的内存空间。
需要加:#include <linux/vmalloc.h>
释放申请的空间的时候要用  vfree(fw->data); 来替换  kfree(fw->data);   否则升级完之后,白屏,内核异常造成的


三,
1.Android在使用一段时间后,系统的memory fragmentation可能比较严重,连续的大块内存很少,导致一些驱动层的内存分配失败,比如TP升级需要分配一个连续的180KB字节区域时,就会提示申请内存失败。在代码中插入show_mem()可以查看当前的memory使用情况。kernel内存非配失败是也会调用show_mem() dump内存分配失败的问题。
下面分析下TP升级的时候申请内存失败的log:
****************************************************************************************************************************************
<6>[01-02 00:01:38.710] TP_CY8C242_:huamobile_misc_open( )_1206_:
<6>[01-02 00:01:38.711] TP_CY8C242_:huamobile_misc_write( )_1238_:
<6>[01-02 00:01:38.711] TP_CY8C242_:huamobile_misc_write( )_1243_: kzalloc KB(180) = 184320
<4>[01-02 00:01:38.716] Thread-193: page allocation failure: order:6, mode:0xc0d0                              //上面order:6说明要分配一个联系的2^6的Page,就是256K的块
**************堆栈*******stack********************
<6>[01-02 00:01:38.736] [<c010ccb4>] (unwind_backtrace+0x0/0x138) from [<c02221d8>] (warn_alloc_failed+0xc4/0x12c)
<6>[01-02 00:01:38.736] [<c02221d8>] (warn_alloc_failed+0xc4/0x12c) from [<c0225b64>] (__alloc_pages_nodemask+0x6f0/0x944)
<6>[01-02 00:01:38.736] [<c0225b64>] (__alloc_pages_nodemask+0x6f0/0x944) from [<c0225dc8>] (__get_free_pages+0x10/0x50)
<6>[01-02 00:01:38.736] [<c0225dc8>] (__get_free_pages+0x10/0x50) from [<c0255a84>] (kmalloc_order_trace+0x24/0xd0)
<6>[01-02 00:01:38.736] [<c0255a84>] (kmalloc_order_trace+0x24/0xd0) from [<c053a438>] (huamobile_misc_write+0x108/0x150)
<6>[01-02 00:01:38.736] [<c053a438>] (huamobile_misc_write+0x108/0x150) from [<c025edec>] (vfs_write+0xa0/0x144)
<6>[01-02 00:01:38.736] [<c025edec>] (vfs_write+0xa0/0x144) from [<c025f078>] (sys_write+0x38/0x70)
<6>[01-02 00:01:38.736] [<c025f078>] (sys_write+0x38/0x70) from [<c0106720>] (ret_fast_syscall+0x0/0x30)
*****************************************
<6>[01-02 00:01:38.736] Mem-info:
<6>[01-02 00:01:38.736] Normal per-cpu:
<6>[01-02 00:01:38.736] CPU 0: hi: 186, btch: 31 usd: 31
<6>[01-02 00:01:38.736] active_anon:23178 inactive_anon:23403 isolated_anon:0
<6>[01-02 00:01:38.736] active_file:13290 inactive_file:13226 isolated_file:0
<6>[01-02 00:01:38.737] unevictable:266 dirty:3 writeback:0 unstable:0
<6>[01-02 00:01:38.737] free:2644 slab_reclaimable:2313 slab_unreclaimable:4288
<6>[01-02 00:01:38.737] mapped:17372 shmem:86 pagetables:2528 bounce:0
<6>[01-02 00:01:38.737] free_cma:187
<6>[01-02 00:01:38.737] Normal free:10576kB min:2624kB low:3280kB high:3936kB active_anon:92712kB inactive_anon:93612kB active_file:53160kB inactive_f
ile:52904kB unevictable:1064kB isolated(anon):0kB isolated(file):0kB present:430592kB mlocked:0kB dirty:12kB writeback:0kB mapped:69488kB shmem:344kB
slab_reclaimable:9252kB slab_unreclaimable:17152kB kernel_stack:7272kB pagetables:10112kB unstable:0kB bounce:0kB free_cma:748kB writeback_tmp:0kB pag
es_scanned:0 all_unreclaimable? no
<6>[01-02 00:01:38.737] lowmem_reserve[]: 0 0
<6>[01-02 00:01:38.737] Normal: 1454*4kB (EMRC) 301*8kB (UMRC) 97*16kB (UMC) 9*32kB (UMC) 0*64kB 0*128kB 0*256kB 1*512kB (C) 0*1024kB 0*2048kB 0*4096kB = 10576kB
而下面Normal显示的内存fragmentation信息中,256KB的连续内存已经没有了。 所以内存分配会失败; 这是就不能仅仅看后面的10576kB总数了。 0*256kB表示0个256KB的块

************************************************************************************************************************************************

可以运行cat /proc/buddyinfo查看当前的内存fragmentation情况
cat /proc/buddyinfo Node 0, zone Normal 48 15 8 7 2 3 0 1 1 1 24
Normal后面的11个数字表示show_mem()中的内存分段系数:分别对应2的0、1、2、3、4、5、6、7、8、9、10次方个连续Page的系数。
<6>[01-02 00:01:38.737] Normal: 1454*4kB (EMRC) 301*8kB (UMRC) 97*16kB (UMC) 9*32kB (UMC) 0*64kB 0*128kB 0*256kB 1*512kB (C) 0*1024kB 0*2048kB 0*4096kB = 10576kB  *号前的数字与上面11个数字相对应。

2.查看内存使用情况:
cat proc/meminfo

3.
cat proc/slabinfo
4.通过cat /proc/buddyinfo查看当前可用的内存块
cat /proc/buddyinfo

5.system函数的使用
在代码中可以调用system("sync && echo 1 > /proc/sys/vm/drop_caches")来完成shell命令

6.man 3 system命令



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值