Sleep与delay 时间子系统案例2


有一个操作,发现在遥控器在遥控界面的时候在某个操作会出现很卡反应很慢的情况,但是其他的操作就不会。
拿到这个问题的时候会有点无法下手,但是静下心想一想应该想一个大概的方向出来:
1,遥控程序出现了问题,是不是哪里做了不应该的延时操作
2,查看下cpu的此时的占用

我觉的应该先看cpu的占用,按照经验一般这种卡顿是cpu的性能受到影响
所以看了下cpu的占用,但是有个很奇怪的现象,有一个内核线程:[kworker]在作上述操作时候cpu的占比很高。按照经验这应该是内核中某个正在运行的线程的名称。
于是搜一下,但是奇怪这个名称并不是一个具体的由某个driver中创建的队列或是内核线程。最后查了下发现这个名称是队列管理wrokqueue的名称,并不是一个具体的队列名称,
好吧,现在大方向知道了是队列出了问题,一直占用cpu没有释放,但是具体是哪个队列没有方向。
只能联系复现场景了,看下早要遥控的时候做了什么。发现:
1.遥控的时候会频繁调用一个driver接口
2.这个接口刚好是一个队列,内部在做while(1)的动作。
ok,有了突破口了,重点关注该队列。然后发现了神奇的一幕,该while(1)中竟然使用了一个mdelay(20)的操作,此刻我眼泪花花的,谁这么无知这样干的?消耗了多少RD资源来看
这个事情。。。
原因,内核队列或是线程中如果有while(1)的循环操作,必须有出让cpu的动作,但这里是一个delay的操作,delay是一个独占cpu的操作。应该换成sleep的操作,
然后换成可以被中断的msleep_interrupt(5),在这里让cpu睡眠5秒(这个平台的cpu的调度节拍是1ms,所以睡眠最好大于1ms)。一试,ok问题解决。
同时上层平凡的调用该接口也是有问题的,优化了下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值