完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
客户使用蓝牙a2dp source功能,连接蓝牙耳机播放音乐高概率出现播放无声的现象。
但在客户使用相同btmanager版本的其他机型上并没有遇到这个问题。 在出现播放无声问题时,btmanager会一直出现如下的打印: BTMG[aw_pcm_open:400]: --->Couldn't open PCM:bluealsa:DEV=28:37:13:3B:DA:78 BTMG[_a2dp_src_pcm_write:150]: a2dp source open pcm error: Out of memory; 从log来看,播放时没有成功打开蓝牙虚拟声卡,所以播放没有声音是必然的。其中打开蓝牙声卡是使用标准函数snd_pcm_open, 而错误信息是 Out of memory。显然从日志来看,此问题与系统内存有关系。客户机器是512M内存。 既然与内存有关系,便从内存方向去分析此问题: 1)查看当前内存信息 cat /proc/meminfo 但是看内存信息,在声卡一直打不开的时候,MemFree也有 10M左右,所以就觉得有点奇怪了,为什么内存这么多,还是申请不到内存打开声卡呢? 难道是脏内存太多了? 2)尝试线程的栈调大
是不是脏内存太多,内存不连续? 使用echo 3 > /proc/sys/vm/drop_caches 清理一下,发现就可以正常申请了。 但是让内存的同事看了下连续内存还是足够的,所以这还不是根本原因。 4)跟踪代码 通过在alsa-lib 里面增加打印,最终发现是在snd_user_file函数里面调用wordexp(file, &we, WRDE_NOCMD); 返回了WRDE_NOSPACE,而打开的file /usr/share/alsa/alsa.conf也只有10K左右。再继续跟踪C库里面的wordexp函数,发现是在fork的时候有问题。 接着又做了个实验,同时在出问题的时候,我们在非打开声卡的地方调用fork函数,也是会申请不到内存。 所以本质上是fork函数导致的,打开声卡的过程刚好触发了这个问题。 |
|
相关推荐
2个回答
|
|
解决办法
对于fork函数,有如下的行为: fork函数会创建带有独立虚拟地址空间的新进程,内核会把当前进程的虚拟内存中数据结构复制一份给新进程。 看了下客户应用的出问题时的内存情况: 异常时,应用的VmPeak和VmSize偏高,这个说明此时应用申请的虚拟内存是非常高了。 此时如果有打开声卡,触发fork的操作,子进程也需要申请那么大的虚拟内存。 问题就在此,突然申请那么大的虚拟内存,被内核限制了。 |
|
|
|
解决方案:
1、客户出问题的方案,由于跑特殊的算法导致使用了比较大的虚拟内存。 可以通过优化应用内存解决。 2、取消内核的限制 在系统启动脚本加上 echo > 1 /proc/sys/vm/overcommit_memory 这个命令操作。 内核就不会限制应用申请比较大的虚拟内存了。 |
|
|
|
只有小组成员才能发言,加入小组>>
全志T113双核异构处理器的使用基于Tina Linux5.0——RTOS系统定制开发
622 浏览 0 评论
全志T113双核异构处理器的使用基于Tina Linux5.0——RTOS编译开发说明
529 浏览 0 评论
1172 浏览 1 评论
2990 浏览 0 评论
为了学习内核开发,大佬手搓了一个轻量级操作系统YiYiYa OS
2936 浏览 0 评论
【开源硬件大赛】基于全志V853设计的全功能BTB学习开发板
3457浏览 8评论
3113浏览 5评论
1879浏览 4评论
全志V85x硬件设计大赛作品精选第二期,快来Pick你心目中的最佳方案
89120浏览 3评论
3616浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 18:12 , Processed in 0.527648 second(s), Total 81, Slave 64 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号