- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第十一章 Android 内核驱动—— Alarm 11.1 基本原理
Alarm 闹钟是 android 系统中在标准 RTC 驱动上开发的一个新的驱动,提供了一个定时器 用于把设备从睡眠状态唤醒,当然因为它是依赖 RTC 驱动的,所以它同时还可以为系统提 供一个掉电下还能运行的实时时钟。
当系统断电时,主板上的 rtc 芯片将继续维持系统的时间,这样保证再次开机后系统的时间 不会错误。当系统开始时,内核从 RTC 中读取时间来初始化系统时间,关机时便又将系统 时间写回到 rtc 中,关机阶段将有主板上另外的电池来供应 rtc 计时。 Android 中的 Alarm 在设备处于睡眠模式时仍保持活跃,它可以设置来唤醒设备。
上图为 android 系统中 alarm 和 rtc 驱动的框架。 Alarm 依赖于 rtc 驱动框架, 但它不是一个 rtc 驱 动 , 主 要 还 是 实 现 定 时 闹 钟 的 功 能 。 相 关 源 代 码 在 kernel/drivers/rtc/alarm.c和 drivers/rtc/alarm_dev.c。
其中 alarm.c 文件实现的是所有 alarm 设备的通用性操作,它创建了一个设备 class ,而
alarm_dev.c则创建具体的 alarm 设备, 注册到该设备 class 中。 alarm.c 还实现了与 interface.c 的接口, 即建立了与具体 rtc 驱动和 rtc 芯片的联系。 alarm_dev.c在 alarm.c 基础包装了一层, 主要是实现了标准的 miscdevice 接口,提供给应用层调用。
可以这样概括:alarm.c 实现的是机制和框架, alarm_dev.c则是实现符合这个框架的设备驱 动, alarm_dev.c相当于在底层硬件 rtc 闹钟功能的基础上虚拟了多个软件闹钟。
11.2 关键数据结构
●alarm
这个结构体代表 alarm 设备,所有的 alarm 设备按照它们过期时间的先后被组织成一 个红黑树, alarm.node 即红黑树的节点, alarm 设备通过这个变量插入红黑树。 alarm.type 是类型, android 中一共定义了如下 5 种类型, 在现在的系统中每种类型只有一个设备。
●
这个结构体用于将前面的 struct alarm 表示的设备组织成红黑树。 它是基于内核定时器 来实现 alarm 的到期闹铃的。
11.3 关键代码分析
●alarm_dev.c
该文件依赖于 alarm.c 提供的框架,实现了与应用层交互的功能,具体说就是暴露出 miscdevice 的设备接口。 Alarm_dev.c定义了几个全局变量:
每种类型一个 alarm 设备, android 目前创建了 5 个 alarm 设备。
标志位, alarm 设备是否就绪。所谓就绪是指该
alarm 设备的闹铃时间到达,但原本等待在 标志位, 表示 alarm 设备是否 enabled
, 表示该设备设置了闹铃时间 (并且闹铃时间还未到 , 标志位,表示原先等待该 alarm
的进程被唤醒了(它们等待的 alarm 到时了 。
该文件提供的主要函数有 :
1,模块初始化和 exit 函数:alarm_dev_init和 alarm_dev_exit
2,模块 miscdevice 标准接口函数:alarm_open、 alarm_release和 alarm_ioctl
3, alarm 定时时间到时候的回调函数:alarm_triggered
该设备称为 alarm_device,定义如下 :
对应的 file operations为 alarm_fops,定义为 :
然后为每个 alarm device调用 alarm_init初始化,这个函数代码在 alarm.c 中,如下:
就是初始化 alarm 结构体,设置其回调函数为 alarm_triggered。最后调用 wake_lock_init初 始化 alarm_wake_lock, 它是 suspend 型的。 alarm_triggered是回调函数, 当定时闹铃的时间 到了, alarm_timer_triggered 函数会调用该函数(详细请看 alarm.c 的 alarm_timer_triggered函数 。
这个函数里调用 wake_lock_timeout对全局 alarm_wake_lock(超时锁,超时时间是 5 秒 加锁,禁止对应的 alarm 设备。唤醒所有等待在该 alarm 设备上的进程。这时,如果 AP 层 呼叫 ioctl(fd, ANDROID_ALARM_WAIT,会返回表示等到
原创力文档


文档评论(0)