没有合适的资源?快使用搜索试试~ 我知道了~
首页Anroid实时时钟和闹钟系统--RTC-ALARM.pdf
Anroid实时时钟和闹钟系统--RTC-ALARM.pdf
5星 · 超过95%的资源 需积分: 14 24 下载量 122 浏览量
更新于2023-03-03
评论 1
收藏 572KB PDF 举报
Anroid实时时钟和闹钟系统--RTC-ALARM.pdf Anroid实时时钟和闹钟系统--RTC-ALARM.pdf
资源详情
资源评论
资源推荐
第十一章 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
定义在 include/linux/android_alarm.h 中。
struct alarm {
struct rb_node node;
enum android_alarm_type type;
ktime_t softexpires; //最早的到期时间
ktime_t expires; //绝对到期时间
void (*function)(struct alarm *); //当到期时系统回调该函数
};
这个结构体代表 alarm 设备,所有的 alarm 设备按照它们过期时间的先后被组织成一
个红黑树,alarm.node 即红黑树的节点,alarm 设备通过这个变量插入红黑树。alarm.type
是类型,android 中一共定义了如下 5 种类型,在现在的系统中每种类型只有一个设备。
enum android_alarm_type {
/* return code bit numbers or set alarm arg */
ANDROID_ALARM_RTC_WAKEUP,
ANDROID_ALARM_RTC,
ANDROID_ALARM_ELAPSED_REALTIME_WAKEUP,
ANDROID_ALARM_ELAPSED_REALTIME,
ANDROID_ALARM_SYSTEMTIME,
ANDROID_ALARM_TYPE_COUNT,
/* return code bit numbers */
/* ANDROID_ALARM_TIME_CHANGE = 16 */
};
alarm_queue
struct alarm_queue {
struct rb_root alarms; //红黑树的根
struct rb_node *first; //指向第一个 alarm device,即最早到时的
struct hrtimer timer; //内核定时器,android 利用它来确定 alarm 过期时间
ktime_t delta; //是一个计算 elasped realtime 的修正值
bool stopped;
ktime_t stopped_time;
};
这个结构体用于将前面的 struct alarm 表示的设备组织成红黑树。它是基于内核定时器
来实现 alarm 的到期闹铃的。
11.3 关键代码分析
alarm_dev.c
该文件依赖于 alarm.c 提供的框架,实现了与应用层交互的功能,具体说就是暴露出
miscdevice 的设备接口。Alarm_dev.c 定义了几个全局变量:
每种类型一个 alarm 设备,android 目前创建了 5 个 alarm 设备。
static struct alarm alarms[ANDROID_ALARM_TYPE_COUNT];
wake lock 锁,当加锁时,阻止系统进 suspend 状态。
static struct wake_lock alarm_wake_lock;
标志位,alarm 设备是否被打开。
static int alarm_opened;
标志位,alarm 设备是否就绪。所谓就绪是指该 alarm 设备的闹铃时间到达,但原本等待在
该 alarm 设备上的进程还未唤醒,一旦唤醒,该标志清零。
static uint32_t alarm_pending;
标志位,表示 alarm 设备是否 enabled,表示该设备设置了闹铃时间(并且闹铃时间还未到),
一旦闹铃时间到了,该标志清零。
static uint32_t alarm_enabled;
标志位,表示原先等待该 alarm 的进程被唤醒了(它们等待的 alarm 到时了)。
static uint32_t wait_pending;
该文件提供的主要函数有:
1,模块初始化和 exit 函数:alarm_dev_init 和 alarm_dev_exit
2,模块 miscdevice 标准接口函数:alarm_open、alarm_release 和 alarm_ioctl
3, alarm 定时时间到时候的回调函数:alarm_triggered
alarm_dev_init 初始化函数调用 misc_register 注册一个 miscdevice。
static int __init alarm_dev_init(void){
int err;
int i;
err = misc_register(&alarm_device);
if (err)
return err;
for (i = 0; i < ANDROID_ALARM_TYPE_COUNT; i++)
alarm_init(&alarms[i], i, alarm_triggered);
wake_lock_init(&alarm_wake_lock, WAKE_LOCK_SUSPEND, "alarm");
return 0;
}
该设备称为 alarm_device,定义如下:
static struct miscdevice alarm_device = {
.minor = MISC_DYNAMIC_MINOR,
.name = "alarm",
.fops = &alarm_fops,
};
剩余10页未读,继续阅读
zhenwenxian
- 粉丝: 796
- 资源: 773
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- 2022年中国足球球迷营销价值报告.pdf
- 房地产培训 -营销总每天在干嘛.pptx
- 黄色简约实用介绍_汇报PPT模板.pptx
- 嵌入式系统原理及应用:第三章 ARM编程简介_3.pdf
- 多媒体应用系统.pptx
- 黄灰配色简约设计精美大气商务汇报PPT模板.pptx
- 用matlab绘制差分方程Z变换-反变换-zplane-residuez-tf2zp-zp2tf-tf2sos-sos2tf-幅相频谱等等.docx
- 网络营销策略-网络营销团队的建立.docx
- 电子商务示范企业申请报告.doc
- 淡雅灰低面风背景完整框架创业商业计划书PPT模板.pptx
- 计算模型与算法技术:10-Iterative Improvement.ppt
- 计算模型与算法技术:9-Greedy Technique.ppt
- 计算模型与算法技术:6-Transform-and-Conquer.ppt
- 云服务安全风险分析研究.pdf
- 软件工程笔记(完整版).doc
- 电子商务网项目实例规划书.doc
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论3