alarm timer

alarm timer

kernel里的alarm timer可以由以下方式来设置:

1. android alarmmanagerservice来设置,此时的timer type要为RTC_WAKEUP或者ELAPSED_REALTIME_WAKEUP,在alarmmanagerservice jni里通过timerfd_settime()系统调用设置到kernel

2. 走__timer_settime系统调用设置

 

android alarm timer类型

public class AlarmManager {
      public static final int RTC_WAKEUP = 0;
      public static final int RTC = 1;
      public static final int ELAPSED_REALTIME_WAKEUP = 2;
      public static final int ELAPSED_REALTIME = 3;

RTC表示系统的时间,系统时间可以人为修改;

ELAPSED_REALTIME表示系统开机以来的时间(boot time)

带WAKEUP的表示会唤醒睡眠状态下的CPU,而不带WAKEUP的表示不会唤醒CPU

上面4个类型分别对应kernel里的如下类型(前面4个),带ALARM的在kernel里将走alarmtimer case,不带的话将走hrtimer case。如果是alarm timer case,在系统待机时将会找出最近的expire timer设置到RTC,之后这个timer expire时RTC将唤醒系统 

      CLOCK_REALTIME_ALARM,
      CLOCK_REALTIME,
      CLOCK_BOOTTIME_ALARM,
      CLOCK_BOOTTIME,
      CLOCK_MONOTONIC,
      CLOCK_REALTIME,

android通过alarmmanagerservice设置timer callstack

07-19 03:42:21.970   537  1863 W System.err: java.lang.Throwable: jni_callstack
07-19 03:42:21.970   537  1863 W System.err:    at com.android.server.AlarmManagerService.set(Native Method)
07-19 03:42:21.970   537  1863 W System.err:    at com.android.server.AlarmManagerService.access$1600(AlarmManagerService.java:133)
07-19 03:42:21.970   537  1863 W System.err:    at com.android.server.AlarmManagerService$Injector.setAlarm(AlarmManagerService.java:3972)
07-19 03:42:21.970   537  1863 W System.err:    at com.android.server.AlarmManagerService.setLocked(AlarmManagerService.java:3466)
07-19 03:42:21.970   537  1863 W System.err:    at com.android.server.AlarmManagerService.rescheduleKernelAlarmsLocked(AlarmManagerService.java:3134)
07-19 03:42:21.970   537  1863 W System.err:    at com.android.server.AlarmManagerService.setImplLocked(AlarmManagerService.java:2107)
07-19 03:42:21.970   537  1863 W System.err:    at com.android.server.AlarmManagerService.setImplLocked(AlarmManagerService.java:1900)
07-19 03:42:21.970   537  1863 W System.err:    at com.android.server.AlarmManagerService.setImpl(AlarmManagerService.java:1847)
07-19 03:42:21.970   537  1863 W System.err:    at com.android.server.AlarmManagerService$4.set(AlarmManagerService.java:2202)
07-19 03:42:21.970   537  1863 W System.err:    at android.app.IAlarmManager$Stub.onTransact(IAlarmManager.java:168)
07-19 03:42:21.970   537  1863 W System.err:    at android.os.Binder.execTransactInternal(Binder.java:1154)
07-19 03:42:21.970   537  1863 W System.err:    at android.os.Binder.execTransact(Binder.java:1123)

 

07-19 03:34:39.430   537   537 W System.err: java.lang.Throwable: jni_callstack
07-19 03:34:39.430   537   537 W System.err:    at com.android.server.AlarmManagerService.set(Native Method)
07-19 03:34:39.430   537   537 W System.err:    at com.android.server.AlarmManagerService.access$1600(AlarmManagerService.java:133)
07-19 03:34:39.430   537   537 W System.err:    at com.android.server.AlarmManagerService$Injector.setAlarm(AlarmManagerService.java:3972)
07-19 03:34:39.430   537   537 W System.err:    at com.android.server.AlarmManagerService.setLocked(AlarmManagerService.java:3466)
07-19 03:34:39.430   537   537 W System.err:    at com.android.server.AlarmManagerService.rescheduleKernelAlarmsLocked(AlarmManagerService.java:3134)
07-19 03:34:39.430   537   537 W System.err:    at com.android.server.AlarmManagerService.setImplLocked(AlarmManagerService.java:2107)
07-19 03:34:39.430   537   537 W System.err:    at com.android.server.AlarmManagerService.setImplLocked(AlarmManagerService.java:1900)
07-19 03:34:39.430   537   537 W System.err:    at com.android.server.AlarmManagerService.setImpl(AlarmManagerService.java:1847)
07-19 03:34:39.430   537   537 W System.err:    at com.android.server.AlarmManagerService$4.set(AlarmManagerService.java:2202)
07-19 03:34:39.430   537   537 W System.err:    at android.app.AlarmManager.setImpl(AlarmManager.java:696)
07-19 03:34:39.430   537   537 W System.err:    at android.app.AlarmManager.set(AlarmManager.java:635)
07-19 03:34:39.430   537   537 W System.err:    at com.android.server.job.controllers.TimeController.updateAlarmWithListenerLocked(TimeController.java:420)
07-19 03:34:39.430   537   537 W System.err:    at com.android.server.job.controllers.TimeController.setDelayExpiredAlarmLocked(TimeController.java:388)

(上面第一个是走的binder flow,第二个看起来是AlarmManager直接到AlarmManagerService的,这能直接到AlarmManagerService?后面再确认...)

走__timer_settime系统调用设置alarm timer

callstack如下,第一个为kernel space的,第二个为user space的

 stacktrace for bt_stack_manage-4107:
 [ffffffc0103247dc] alarm_start+0x0/0x1f4
 [ffffffc010326c58] common_timer_set+0x100/0x178
 [ffffffc010328670] do_timer_settime+0xcc/0x1d0
 [ffffffc010326e24] __arm64_sys_timer_settime32+0x80/0xd4
 [ffffffc01022a628] el0_svc_common+0xc4/0x1ac
 [ffffffc01022a72c] el0_svc_compat_handler+0x1c/0x28
 [ffffffc0100844a4] el0_svc_compat+0x8/0x24

 

pid: 3880, tid: 3911, name: bt_stack_manage  >>> com.android.bluetooth <<<
      #00 pc 0009b72c  /apex/com.android.runtime/lib/bionic/libc.so (__timer_settime+12) (BuildId: 1c0594b10754326853446a009221efb5)
      #01 pc 0025ca6f  /system/lib/libbluetooth.so (reschedule_root_alarm()+258) (BuildId: cf3e4fb38d44f96795f9ba09cf47676f)
      #02 pc 0025c0cf  /system/lib/libbluetooth.so (alarm_set_internal(alarm_t*, unsigned long long, void (*)(void*), void*, fixed_queue_t*, bool)+142) (BuildId: cf3e4fb38d44f96795f9ba09cf47676f)
      #03 pc 0025c033  /system/lib/libbluetooth.so (alarm_set(alarm_t*, unsigned long long, void (*)(void*), void*)+26) (BuildId: cf3e4fb38d44f96795f9ba09cf47676f)
      #04 pc 001c92cf  /system/lib/libbluetooth.so (hci_module_start_up()+254) (BuildId: cf3e4fb38d44f96795f9ba09cf47676f)
      #05 pc 0025b1eb  /system/lib/libbluetooth.so (module_start_up(module_t const*)+82) (BuildId: cf3e4fb38d44f96795f9ba09cf47676f)
      #06 pc 0026c9c3  /system/lib/libbluetooth.so (bte_main_enable()+86) (BuildId: cf3e4fb38d44f96795f9ba09cf47676f)
      #07 pc 001c6721  /system/lib/libbluetooth.so (event_start_up_stack(void*)+132) (BuildId: cf3e4fb38d44f96795f9ba09cf47676f)
      #08 pc 00072213  /system/lib/libchrome.so (base::debug::TaskAnnotator::RunTask(char const*, base::PendingTask*)+134) (BuildId: 7e14c1d1d9c59a99aae99b1f938012f5)

 

通过alarmtimer_start event trace查看谁设置的alarm timer

alarm_start()

events/alarmtimer/alarmtimer_start

 bt_stack_manage-3225    [000] d..1    26.331880: alarmtimer_start: alarmtimer:00000000db64776a type:BOOTTIME expires:38330000000 now:26330584241
 bt_stack_manage-3225    [000] d..1    26.331891: <stack trace>
 => alarm_start
 => alarm_timer_arm
 => common_timer_set
 => do_timer_settime
 => __arm64_sys_timer_settime32
 => el0_svc_common
 => el0_svc_compat_handler
 => el0_svc_compat
 bt_stack_manage-3828    [002] d..1    38.696645: alarmtimer_start: alarmtimer:000000004d035fba type:BOOTTIME expires:50695000000 now:38695350155
 bt_stack_manage-3828    [002] d..1    38.696653: <stack trace>
 => alarm_start
 => alarm_timer_arm
 => common_timer_set
 => do_timer_settime
 => __arm64_sys_timer_settime32
 => el0_svc_common
 => el0_svc_compat_handler
 => el0_svc_compat

 

posted @ 2022-07-23 13:03  aspirs  阅读(241)  评论(0编辑  收藏  举报