[笔记分享] [RTC] Alarm用户空间分析

来源:互联网 发布:mysql修改字段值 编辑:程序博客网 时间:2024/04/30 10:03

Platform: msm8x26

主要涉及的文件有:
AlarmManager.java : 提供API给ap调用实现alarm功能
AlarmManagerService.java : alarmmanger.java都是调用其api实现
Com_android_server_AlarmMangerService.cpp: alarm JNI接口文件

AlarmManager.java主要接口如下:

这里写图片描述

看定义会发现,它都是通过调用mService->xxx()来实现的,而mService其实就是AlarmManagerService.
AlarmManagerService.java主要接口如下:

这里写图片描述

而这些接口都是通过JNI实现的。另外,其内部有个AlarmThread类继承与thread,因此在创建的时候会跑它的run()来等待是否有alarm发生。

这里写图片描述

一旦接受到alarm事件之后,它会将符合要求的闹钟加到triggerlist中(记得前面kernel部分说过重设rtc的时候会产生无效的alarm吗),然后广播出去,如下:

这里写图片描述

Com_android_server_AlarmMangerService.cpp 主要接口:

这里写图片描述

这些都是供alarmMangerService.java来调用的。我们一一分析:

这里写图片描述

打开alarm设备而已。

这里写图片描述

根据不同type alarm设置其alarm time。

这里写图片描述

当设置好alarm之后,我们就wait,注意这个ioctl会block,所以我们看到AlarmMangerService 中专门有一个AlarmThread来wait alarm event。返回的result为超时的alarm type, 供AlarmThread判断是哪个alarm触发了。

这里写图片描述

设置时区其实也调用了settimeofday,当tz传入kernel后,会被转化成secs加到当前real time上去。另外,google framework中当对timezone进行set时,它会以persist property的形式保存下来,因此系统重启之后timezone信息还是在的。

Android基本上都是通过AlarmMangerService来实现alarm的,当然可以自己直接实现,不通过jni来call。需要注意的是,alarm虽然能同时打开多个device来获取alarm或者time信息等,但是不能同时对其进行set。在kernel部分已经解释过了。

要想获取alarm服务,可以通过GetSystemService(Context.ALARM_SERVICE)获取,如系统中的Calendar、Alarm、DeskClock等AP都是这样实现的。

到这里,关于RTC/ALARM的基本原理及实现就完成了!


Reference

[1] 80-VK401-3 PM8058 POWER MANAGEMENT IC USER GUIDE
[2] 80_N5412_1_A_ATS_API_Interface_Spec
[3] AU80-N5231-1_A_8960_Android_SW_Architecture
[4] Android alarm kernel driver
[5] http://developer.android.com/reference/android/os/SystemClock.html
[6] http://www.ibm.com/developerworks/cn/linux/l-cn-timerm/