当前位置:   article > 正文

Android Linux Alarm 对功耗的影响_triggering alarm #0: alarm{

triggering alarm #0: alarm{

Android Linux Alarm 对功耗的影响

技术标签: alarm  rtc  android  linux

 

文章目录

 

1、 Alarm介绍

1.1 alarm的几种类型及区别

在这里插入图片描述

  • 可唤醒:RTC_WAKEUP、ELAPSED_REALTIME_WAKEUP、RTC_POWEROFF_WAKEUP
  • 不可唤醒:RTC、ELAPSED_REALTIME
  • 使用相对时间:ELAPSED_REALTIME_WAKEUP、ELAPSED_REALTIME
  • 使用绝对时间:RTC_WAKEUP、RTCRTC_POWEROFF_WAKEUP

1.2 alarm相关接口

Frameworks\base\core\java\android\app\AlarmManager.java
设置一次性闹钟:

public void set(int type, long triggerAtMillis, PendingIntent operation)
  •  

设置重复闹钟:

public void setRepeating(int type, long triggerAtMillis, long intervalMillis, PendingIntent operation)
  •  

设置精确闹钟:

public void setExact(int type, long triggerAtMillis, PendingIntent operation)
  •  

1.3 batch——减少设备唤醒次数以节省功耗

在这里插入图片描述

2、alarm关键流程

2.1 Alarm关键流程分析——init

在这里插入图片描述

2.2 Alarm关键流程分析——set

在这里插入图片描述

2.3 Alarm关键流程分析——trigger

在这里插入图片描述

3、dumpsys alarm解析

1、Batches

  1. Batch{2159934 num=1 start=68436475 end=69786475 flgs=0x8}:
  2. ELAPSED #0: Alarm{a18435d type 3 when 68436475 android}
  3. tag=*alarm*:com.android.server.action.NETWORK_STATS_POLL
  4. type=3 whenElapsed=+1m1s648ms when=+1m1s648ms
  5. window=+22m30s0ms repeatInterval=1800000 count=0 flags=0x8
  6. operation=PendingIntent{7c934d2: PendingIntentRecord{b2fa9a3 android broadcastIntent}}

2、Top Alarms

This is the top ten alarms ranked in descending order by total aggregate time that the alarm code has run.
example:

  1. Top Alarms:
  2. +19s42ms running, 0 wakeups, 131 alarms: 1000:android
  3. *alarm*:android.intent.action.TIME_TICK
  4. +12s846ms running, 3 wakeups, 3 alarms: u0a1:com.android.providers.calendar
  5. *walarm*:com.android.providers.calendar.intent.CalendarProvider2
  6. +3s148ms running, 0 wakeups, 36 alarms: 1000:android
  7. *alarm*:com.android.server.action.NETWORK_STATS_POLL
  8. ...

3、Alarm Stats

This section shows stats for all of the alarms that have run since the system was last restarted.
example:

  1. u0a1:com.android.providers.calendar +12s846ms running, 3 wakeups:
  2. +12s846ms 3 wakes 3 alarms, last -14h49m11s138ms:
  3. *walarm*:com.android.providers.calendar.intent.CalendarProvider2
  4. u0a20:com.android.systemui +7ms running, 1 wakeups:
  5. +7ms 1 wakes 1 alarms, last -17h14m13s266ms: *walarm*:com.android.internal.policy.impl.PhoneWindowManager.DELAYED_KEYGUARD
  6. ...

4、Case实例分析

Case实例分析一

Case# High power consumption in LTE mode in 1hr test after factory reset
在这里插入图片描述

kernel log - - echo 1 > /sys/module/msm_show_resume_irq/parameters/debug_mask

串口 log / dmesg 输出

  1. [ 596.785361] PM: suspend entry 2018-03-05 12:29:05.258977443 UTC
  2. [ 597.212284] gic_show_resume_irq: 302 triggered 7781b8.qcom,mpm
  3. [ 597.212284] gic_show_resume_irq: 170 triggered null
  4. [ 597.212284] PM: Calling msm_pinctrl_resume+0x0/0x190
  5. [ 597.212284] PM: Calling spmi_pmic_arb_resume+0x0/0x34
  6. [ 597.212284] spmi_show_resume_irq: 403 triggered [0x0, 0x61, 0x1] **qpnp_rtc_alarm**
  7. [ 597.455898] PM: suspend exit 2018-03-05 12:29:18.156313167 UTC

dumpsys alarm log

  1. Alarm Stats:
  2. u0a21:com.google.android.gms +1m7s937ms running, 432 wakeups:
  3. +36s855ms 37 wakes 37 alarms, last -3m22s840ms:
  4. *walarm*:com.google.android.intent.action.GCM_RECONNECT
  5. ...

去掉GMS包及第三方应用后
在这里插入图片描述

Case实例分析二

case# How to optimize the Current Consumption

  1. 休眠底电流正常;
  2. 休眠时间短;
  3. 电流有频繁的peak.

打开Alarm 唤醒中断输出功能

echo 1 > /sys/module/msm_show_resume_irq/parameters/debug_mask

串口 log / dmesg 输出

  1. [ 257.256947] __qpnpint_handle_irq: 294 triggered [0x0, 0x61,0x1] qpnp_rtc_alarm
  2. [ 257.256947] gic_show_resume_irq: 200 triggered qcom,smd-rpm
  3. [ 257.256947] gic_show_resume_irq: 203 triggered 601d0.qcom,mpm
  4. [ 257.256947] gic_show_resume_irq: 222 triggered 200f000.qcom,spmi
  5. [ 257.507936] PM: suspend exit 2018-05-30 07:16:58.144607378 UTC

打开AlarmManagerService Debug Code

  1. class AlarmManagerService extends SystemService {
  2. ...
  3. - static final boolean localLOGV = false;
  4. + static final boolean localLOGV = true;
  5. ...
  6. }
  7. 2303 if (localLOGV) {
  8. 2304 for (int i=0; i<triggerList.size(); i++) {
  9. 2305 Slog.v(TAG, "Triggering alarm #" + i + ": " + triggerList.get(i));
  10. 2306 }
  11. 2307 }

logcat 输出

  1. 05-30 15:16:58.132 1835 2931 V AlarmManager: Triggering alarm #0: Alarm{104a96b type 0 when 1527664617148 com.MobileTornado.Main}
  2. 05-30 15:16:58.134 1835 2931 V AlarmManager: sending alarm Alarm{104a96b type 0 when 1527664617148 com.MobileTornado.Main}
  3. 05-30 15:09:52.644 1835 2931 V AlarmManager: Triggering alarm #0: Alarm{328145 type 0 when 1527664192636 com.MobileTornado.Main}
  4. 05-30 15:09:52.768 1835 2931 V AlarmManager: Triggering alarm #0: Alarm{fe048f2 type 0 when 1527664192764 com.MobileTornado.Main}
  5. 05-30 15:09:53.668 1835 2931 V AlarmManager: Triggering alarm #0: Alarm{2cf766d type 0 when 1527664193662 com.MobileTornado.Main}

优化措施:

移除com.MobileTornado.Main测试验证;
应用修改,减小设置alarm频率。

Case实例分析三

print alarm log:

Add below code in /kernel/drivers/rtc/interface.c

  1. int rtc_set_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
  2. {
  3. int err;
  4. err = rtc_valid_tm(&alarm->time);
  5. if (err != 0)
  6. return err;
  7. err = mutex_lock_interruptible(&rtc->ops_lock);
  8. if (err)
  9. return err;
  10. if (rtc->aie_timer.enabled) {
  11. rtc_timer_remove(rtc, &rtc->aie_timer);
  12. }
  13. rtc->aie_timer.node.expires = rtc_tm_to_ktime(alarm->time);
  14. rtc->aie_timer.period = ktime_set(0, 0);
  15. if (alarm->enabled) {
  16. ++ dump_stack();
  17. ++ printk("rtc_set_alarm printk: %llu",rtc->aie_timer.node.expires);
  18. err = rtc_timer_enqueue(rtc, &rtc->aie_timer);
  19. }
  20. mutex_unlock(&rtc->ops_lock);
  21. return err;
  22. }
  1. /kernel/kernel/time/alarmtimer.c
  1. int alarm_start(struct alarm *alarm, ktime_t start)
  2. {
  3. struct alarm_base *base = &alarm_bases[alarm->type];
  4. unsigned long flags;
  5. int ret;
  6. spin_lock_irqsave(&base->lock, flags);
  7. alarm->node.expires = start;
  8. ++ dump_stack();
  9. ++ printk("alarm_start: set %llu",ktime_to_ms(alarm->node.expires));
  10. alarmtimer_enqueue(base, alarm);
  11. ++ printk("alarm_start: set real %llu",ktime_to_ms(alarm->node.expires));
  12. ret = hrtimer_start(&alarm->timer, alarm->node.expires,
  13. HRTIMER_MODE_ABS);
  14. spin_unlock_irqrestore(&base->lock, flags);
  15. return ret;
  16. }

You can also enable AlarmManagerService logs, by default the alarm log level is Verbose(not printed) in android, for example,

/frameworks/base/services/core/java/com/android/server/AlarmManagerService.java
->triggerAlarmsLocked

  1. class AlarmManagerService extends SystemService {
  2. ...
  3. - static final boolean localLOGV = false;
  4. + static final boolean localLOGV = true;
  5. ...
  6. }
  7. 2303 if (localLOGV) {
  8. 2304 for (int i=0; i<triggerList.size(); i++) {
  9. 2305 Slog.v(TAG, "Triggering alarm #" + i + ": " + triggerList.get(i));
  10. 2306 }
  11. 2307 }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/818006
推荐阅读
相关标签
  

闽ICP备14008679号